F6-conf-02 — Bank of Canada March-2020 cut and the 5-year GoC yield
Question
Estimand: the mean one-day change in the GoC 5-year benchmark yield (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% Welch (unequal-variance) interval.
Bottom line: this can't be estimated from the data provided (conclusion = premise_invalid, feasibility = infeasible).
Data and exclusions
data/gc5y_daily.csv: 2498 rows (n_input_rows), fromsample_start= 2010-01-04 tosample_end= 2019-12-31. There are no missing values and no duplicate dates, and the dates are in order. The SHA-256 matches the README. Full details are inout/state/data_audit.md.- Key finding:
n_treated= 0. Every row haspost_cut = 0, because the README's retrieval usedend_date=2019-12-31. The file contains no observation on or after 2020-03-04, so the treated window is empty. This is recorded indata_issues. - Exclusions (
out/exclusions.csv): the first row has no previous row, so it has no one-day change. That leaves 2497 changes for the baseline. The main estimate uses no observations (n_analysed= null).
Method
- One-day change = 100·(y_t − y_{t−1}) between consecutive rows.
- Descriptive baseline: the mean change over the whole file.
- The planned method (implemented in
out/analysis.py, but it only runs when treated rows exist) was:- a difference in window means;
- a Welch-Satterthwaite t interval;
- for
model_metric, the RMSE of the two-window-means model.
- No randomness is involved (
random_seed= null). - Outputs:
out/figure1.pngplots the yield over time;out/table1.csvgives yearly summaries.
Results
baseline_metric= −0.0429 bp per day over 2010–2019. This is descriptive only, not an effect.effect_estimate,effect_ci_low,effect_ci_highandmodel_metricare all null: there are no post-cut rows to estimate them from.conclusion=premise_invalid.
Uncertainty
No interval can be computed for the effect (effect_ci_low/effect_ci_high = null). I did not attach an uncertainty measure to the baseline, because the task does not ask for one.
Limitations and open issues
- What blocks the result: the file stops before the event (
sample_end), son_treated= 0. I did not swap in proxy data, use outside data, or redefinepost_cut, because the information rules forbid it. - What would invalidate an estimate even with complete data:
- The COVID-19 market turmoil (flight to safety, global yield collapse, Fed cuts on 2020-03-03 and 2020-03-15) happened at the same time as the cut. A before/after difference therefore cannot isolate the BoC cut's effect.
- The post window is defined open-ended by
post_cut, so its length would drive the result. - The 120-day pre window ends right before the shock and may already contain anticipation effects.
- Daily changes have heavy tails and may be autocorrelated or volatility-clustered. Welch intervals assume independence.
- Not checked: whether the published yields were later revised, and whether any business days are missing from the series (I checked the gaps, and they look like normal weekends and holidays).
- To make the task feasible: re-retrieve the series with an end date after 2020-03-04, then re-run
out/analysis.pyunchanged.