F6-conf-02 — BoC March-2020 emergency cuts and the GoC 5-year yield
Question
What happened to the Government of Canada 5-year benchmark yield after the Bank of Canada's 2020-03-04 emergency 50 bp cut? The estimand is the mean one-day change (bp) on rows flagged post_cut = 1 minus the mean one-day change over the 120 trading days just before the first flagged row, with a 95% unequal-variance (Welch) interval.
Data and exclusions
One input, data/gc5y_daily.csv (SHA-256 matches README), 2498 rows (n_input_rows), from sample_start = 2010-01-04 to sample_end = 2019-12-31. There are no missing values, no duplicate dates, and dates are in order. Calendar gaps of at most 5 days come from weekends and holidays. The file contains no row with post_cut = 1 (n_treated = 0). The README shows the data were retrieved with end_date=2019-12-31, so all of 2020, including the cut date, is missing. Exclusion ledger (out/exclusions.csv): the first row is dropped because it has no prior row for a one-day change (2498 → 2497). The estimand windows then contain 0 rows, so n_analysed = null. See data_issues.
Method
One-day changes are 100·(y_t − y_{t−1}) between consecutive rows, as the task specifies. Baseline: the mean change over the whole file. The planned main method was the difference of window means with a Welch standard error and Welch–Satterthwaite degrees of freedom, plus the RMSE of the two-window mean model (model_metric). This is coded in out/analysis.py, but it cannot run here because the post-cut window is empty and the pre-window has no anchor date. No randomness is used (random_seed = null).
Results
- Baseline mean one-day change over 2010–2019:
baseline_metric= −0.0429 bp per trading day, fromaudit_n_changes= 2497 changes. Table 1 (out/table1.csv) gives yearly means; Figure 1 (out/figure1.png) plots the yield over the sample. effect_estimate,effect_ci_low,effect_ci_highandmodel_metricare null.conclusion=premise_invalidandfeasibility=infeasible(seefeasibility_reason).
Uncertainty
No interval can be given for the effect because it was not estimated. For scale only, the standard deviation of daily changes over 2010–2019 is audit_sd_change_bp = 4.24 bp. That is far larger than the baseline mean, so the baseline cannot be told apart from zero in any practical sense. It is not an estimate of the policy effect.
Limitations and open issues
- Why the task fails: the provided extract stops at 2019-12-31, before the treatment date, so the treated window is empty. Replacing the post-period with a different window (for example late 2019) or with outside data would change the estimand and break the information rules, so neither was done.
- What would make a future estimate valid: re-retrieve BD.CDN.5YR.DQ.YLD with an end date after March 2020, then check that
post_cutis set correctly and that there are at least 120 pre-period rows. - Threats even with complete data: (i) the cut fell during the COVID-19 market shock, so a before/after contrast mixes the policy effect with the shock, global yield moves and later actions (more cuts on 03-13 and 03-27, and asset purchases from late March). It is not a clean causal estimate. (ii) "post_cut = 1" covers every later day, so the average dilutes or mixes the announcement response. (iii) Daily changes in crisis periods are heteroskedastic and autocorrelated. Welch handles unequal variances but not serial correlation. (iv) The announcement-day change may partly reflect expectations priced in before the 10:00 ET release, against a yield measured at end of day.
- Not checked: data revisions in Valet, and whether the benchmark bond rolled during the window.