SPB Git

spb/wp29_uqo

Public

# F6-conf-02 — BoC March-2020 emergency cut and the GoC 5-year yield

# Question

Estimand: mean one-day change (bp) of the GoC 5-year benchmark yield on days with post_cut = 1 minus the mean one-day change on the 120 trading days immediately before the first flagged day, with a 95% Welch (unequal-variance) interval.

Bottom line: the estimand cannot be computed from the data provided (conclusion premise_invalid, feasibility infeasible).

# Data and exclusions

  • data/gc5y_daily.csv: 2498 rows, 2010-01-04 to 2019-12-31 (SHA-256 matches README). No missing values, no duplicate dates, dates strictly increasing. Gaps between rows are at most 5 calendar days, which fits weekends and holidays.
  • Critical finding: the file ends on 2019-12-31. The README confirms the Valet request used end_date=2019-12-31. Every row has post_cut = 0 (n_treated = 0), so no row has the flag set incorrectly (no date on or after 2020-03-04 has post_cut = 0). However, there is no post-cut window, and there is no "first flagged day" from which to count back the 120-day pre-window.
  • The first row has no one-day change, which leaves 2497 changes.
  • No proxy was substituted. For example, the last 120 days of 2019 were not used as the pre-window, and no external 2020 data were used. The task forbids both, and a proxy would not answer the question.

# Method

The planned method was implemented in out/analysis.py but only runs if treated rows exist. One-day changes are 100·(y_t − y_{t−1}) between consecutive rows. The effect is mean(post) − mean(pre-120). The 95% CI is a Welch t interval with Welch–Satterthwaite df. The model metric is the RMSE of residuals around the two window means. Because n_treated = 0, none of these were computed. The script produces only the descriptive baseline, Table 1 and Figure 1. No randomness is used (random_seed = null).

# Results

  • Descriptive baseline: mean one-day change over the whole file = −0.0429 bp (2497 changes).
  • effect_estimate, effect_ci_low, effect_ci_high, model_metric, n_analysed: null, because they are not estimable.
  • Table 1 (out/table1.csv) gives yearly counts, mean yields and mean changes for 2010–2019. The yearly mean yield ranges from 0.73% (2016) to 2.48% (2010).
  • Figure 1 (out/figure1.png) plots the yield over the sample. A dashed line marks 2020-03-04, which falls after the last observation.

# Uncertainty

There is no effect estimate, so there is no interval. The baseline mean is descriptive only and has no causal meaning; no inference was done on it.

# Limitations and open issues

  • What invalidates the analysis as specified: the input does not cover the event. Any number reported as "the effect" would be invented. To answer the question, the series must be re-extracted to cover at least about Aug 2019 to the end of the post-cut window (e.g. end_date in 2020 or later). The post_cut flag would then need to be checked again.
  • Not checked: whether the published series has been revised; whether the post-cut window was meant to be closed (the flag stays 1 indefinitely, so a long post-window would mix the March 2020 cuts with later events).
  • Threats even with correct data: (i) the 2020-03-04 cut came in the middle of the COVID market shock, and other events (the 2020-03-13 and 2020-03-27 cuts, the start of GoC bond purchases, global yield moves) confound a simple pre/post difference in mean changes; (ii) daily yield changes in March 2020 had heavy tails and volatility clustering, so a Welch interval that assumes independent observations is likely too narrow; (iii) the result depends on how long the post window is; (iv) a difference in means of changes measures drift, not the jump on the announcement day. An event-study design with a narrow window would be the better tool.
Files · main
Menu

Theme