F6-conf-02 — BoC March-2020 emergency cut and the GoC 5-year yield
Question
The question is how the Government of Canada 5-year benchmark yield moved after the Bank of Canada's first emergency 50 bp cut on 2020-03-04. The estimand is the mean one-day change (bp) on rows with post_cut = 1, minus the mean one-day change over the 120 trading days just before the first flagged row, with a Welch (unequal-variance) 95% interval.
Answer: this cannot be computed from the data provided (conclusion = premise_invalid, feasibility = infeasible).
Data and exclusions
- Input:
data/gc5y_daily.csv, 2498 rows (n_input_rows), SHA-256 matches the README. There are no missing values and no duplicate dates, and there are 249–250 business days per year. - The sample runs from
sample_start= 2010-01-04 tosample_end= 2019-12-31. The README shows the data were retrieved withend_date=2019-12-31. n_treated= 0: every row haspost_cut = 0. That is consistent with how the flag is defined (no date on or after 2020-03-04 exists), but it means the post-cut period is not in the file. This is recorded indata_issues.- Exclusion ledger (
out/exclusions.csv):- The first row has no one-day change, leaving 2497 changes (
baseline_n_changes). - Restricting to the estimand windows leaves 0 rows, so
n_analysed= null.
- The first row has no one-day change, leaving 2497 changes (
- Table 1 (
out/table1.csv) gives yearly row counts, mean yield and mean change. Figure 1 (out/figure1.png) plots the yield series, with the cut date marked outside the sample.
Method
- One-day changes are 100·(y_t − y_{t−1}) between consecutive rows.
- Descriptive baseline: the mean change over the whole file.
- Planned main method: a two-window mean comparison. The windows were the post_cut=1 rows and the 120 rows before the first flagged row. The interval would be a Welch t-interval with Satterthwaite degrees of freedom, and the model metric the RMSE of the two-window mean model. This is implemented in
out/analysis.pybut only runs when flagged rows exist. post_cutwas not redefined, and no proxy window was substituted. No randomness was used (random_seed= null).
Results
baseline_metric= −0.0429 bp per day: the mean one-day change over 2010–2019. As a check, it equals 100·(1.68 − 2.75)/2497.effect_estimate,effect_ci_low,effect_ci_highandmodel_metricare all null, because neither estimand window exists in the file (n_treated= 0).conclusion=premise_invalid, with the reason given infeasibility_reason.
Uncertainty
No interval can be reported for the effect because the effect is not estimable (effect_ci_low / effect_ci_high = null). The baseline (baseline_metric) is a descriptive average only, and I attach no inferential claim to it.
Limitations and open issues
-
What invalidates the analysis: the supplied file stops about two months before the event, so there is nothing to compare before and after. Getting a result would need data from 2020 onward (e.g., Valet with a later
end_date). Using another source is not allowed under the task rules. -
Proxies I deliberately avoided:
- Treating late-2019 days as a "pre" window with nothing to compare them against.
- Redefining
post_cut. - Fabricating post-cut values.
Any of these would answer a different question or invent data.
-
If data were available, the main threats would still be:
- Confounding: the March 2020 COVID market dislocation, further cuts on 2020-03-13 and 2020-03-27, and BoC asset purchases all overlap the post window. A before/after difference is not a causal effect of the 2020-03-04 cut.
- Heavy-tailed and autocorrelated daily changes, which would weaken the Welch interval.
- Sensitivity to the length of the post window.
-
Not checked: whether the published yields contain revisions, and whether the business-day calendar matches every Canadian holiday (gaps of 1–5 calendar days look normal).