F6-conf-02 — BoC March-2020 emergency cuts and the GoC 5-year yield
Question
The question is whether the average one-day change in the Government of Canada 5-year benchmark yield (in bp) was different on days flagged post_cut = 1 (on or after 2020-03-04) than over the 120 trading days just before the first flagged day. The comparison needs a Welch-type (unequal-variance) 95% interval.
Data and exclusions
- Input:
data/gc5y_daily.csv, 2,498 rows, Bank of Canada Valet series BD.CDN.5YR.DQ.YLD. - Coverage audit: the file runs from 2010-01-04 to 2019-12-31. The README says the data were retrieved with
end_date=2019-12-31. So the file stops more than two months before the 2020-03-04 cut. - Treatment status:
post_cutis 0 in all 2,498 rows, so n_treated = 0. As required, the indicator was used exactly as provided and not redefined. It is internally consistent: no date is on or after 2020-03-04. - The file has no missing values and no duplicate dates, and the dates are in increasing order. The longest calendar gap is 5 days (6 cases), which fits weekends combined with holidays. Nothing was excluded.
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 estimate: a two-window mean model. The effect is the post-window mean minus the pre-window mean (the 120 rows before the first
post_cut = 1row), with a Welch t interval (Welch–Satterthwaite df). The model metric is the RMSE of the residuals around each window's mean. out/analysis.pyimplements all of these steps. The main estimate is only computed when treated rows exist.
Results
- Baseline mean one-day change, 2010–2019: −0.043 bp/day (
baseline_metric).out/table1.csvgives per-year means: the mean yield ranges from 0.73% to 2.48%, and the mean daily change from −0.46 to +0.30 bp.out/figure1.pngplots the yield series; a dashed line marks 2020-03-04, which falls outside the data. - Effect estimate: not estimable. The file has no post-cut observations, so the post-window mean does not exist. The effect, its CI, the model RMSE and
n_analysedare thereforenull. Conclusion code:premise_invalid; feasibility:infeasible.
Uncertainty
No interval can be computed because the effect is undefined. I did not substitute any proxy, such as late-2019 data, a different event, or extrapolated values. The baseline is purely descriptive, and I attach no inferential claim to it.
Limitations and open issues
- Main failure: the data were pulled with an end date (2019-12-31) that comes before the event. The fix is to re-retrieve BD.CDN.5YR.DQ.YLD through at least mid-2020 and rerun
out/analysis.py, which would then compute the estimate without changes. - Even with the right data, these threats remain:
- March 2020 had large global confounders: the US Fed cuts on 3 and 15 March, a flight to safety, a dash for cash, and BoC asset purchases starting in late March. A before/after difference in means cannot isolate the effect of the BoC cut.
- The post window has no end date, so the estimand depends on how far the sample extends.
- Daily changes are heavy-tailed and volatility clusters strongly in March 2020. Welch's interval assumes independent observations, and serial correlation was not checked.
- The pre-window could include early pandemic-period moves (Feb 2020).
- Announcement-day timing matters: the cut came at 10:00 ET, and the yield is recorded at the close.
- Checked: the SHA-256 of the CSV matches the README (
2cdda6cc…). - Not checked: whether the values match the Valet source (there was no network access to compare against the raw response), and whether any data revisions were made.