# Pre-registered forecasting protocol (frozen with docs/preregistered_protocol.md; git tag prereg-frozen). units: {returns: "percent log return", variance: "percent^2"} horizons: [1, 5, 22] # trading days; target = variance of the h-day cumulative return estimation: scheme: rolling # primary; 'expanding' and window 2000 are robustness variants window: 1000 refit_every: 5 # trading days; daily filtering with fixed parameters in between max_restarts: 3 seed: 46 simulation_paths: 2000 # multi-step forecasts for models without an analytic recursion periods: validation: {start: "2012-01-03", end: "2015-12-31"} # used for design checks and failure accounting only test: {start: "2016-01-04", end: "2026-10-30"} # untouched until the protocol is frozen primary_loss: qlike primary_proxy: rv5ss_on secondary_losses: [mse, mae, mse_sd] secondary_proxies: [rv5_on, rv1_on, bv5_on, medrv_on, r2, rv5ss_scaled] tier_b_input: rv5ss_on inference: dm: {hac: "Newey-West Bartlett", bandwidth: "h - 1 + floor(4 (n/100)^(2/9))"} mcs: {alpha: 0.10, bootstrap: stationary, block_length: 22, reps: 2000, statistic: "Tmax"} spa: {reps: 2000, block_length: 22} cross_asset: "block bootstrap over time with assets kept together (dependence across assets preserved)" tail_risk: {levels: [0.01, 0.05], tests: [kupiec_uc, christoffersen_cc, engle_manganelli_dq, fz0_loss]} regimes: trailing_vol_terciles: "terciles of the 22-day trailing realized variance of the instrument, computed at the origin (no look-ahead), thresholds from the validation period" calendar_episodes: covid: {start: "2020-02-20", end: "2020-06-30"} rate_shock_2022: {start: "2022-01-03", end: "2022-12-30"} tariff_shock_2025: {start: "2025-04-02", end: "2025-05-30"} return_sign: "sign of the previous day's return at the origin"