SPB Git

spb/wp29_uqo

Public

# 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), from sample_start = 2010-01-04 to sample_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 in out/state/data_audit.md.
  • Key finding: n_treated = 0. Every row has post_cut = 0, because the README's retrieval used end_date=2019-12-31. The file contains no observation on or after 2020-03-04, so the treated window is empty. This is recorded in data_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.png plots the yield over time; out/table1.csv gives 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_high and model_metric are 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), so n_treated = 0. I did not swap in proxy data, use outside data, or redefine post_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.py unchanged.
Files · main
Menu

Theme