Skip to content

What this answers

Amendment 2026-09-09/01 gated its own activation on three things:

  1. a fitted GARCH/HAR forecast from the V1 script — satisfied (HAR-RV has been live since 2026-09-11);
  2. a calibration backtest (2018/2020/2024 stress set) — this document;
  3. human approval — outstanding, and untouched by this receipt.

vrp_provisional_theta_volpts: 3.0 remains not activated, read by no code and cited by no prompt. Nothing here changes it. This is evidence for the owner's decision, not a decision.

Method

backtest/ Tier 1 harness (spec: docs/superpowers/specs/2026-09-27-backtest-harness-design.md). The replay drives the real production regime_snapshot.py day by day over 4,278 trading days, 2009-09-18 → 2026-09-22, with inputs truncated to <= t so the staleness guard, fail-closed boundary and hysteresis behave exactly as they would have live.

The refactor that made this possible (step_hysteresis extracted as a pure function) was gated on a full-sample equivalence replay: 0 diffs in record and hysteresis state across all 4,278 days, against a non-degeneracy check (16 distinct labels, 2,235 transition days, 20 fail-closed days). What is characterised below is production logic, not a lookalike.

Outcome measure: vrp_realised = VIX_t/100 − RV(t, t+30 trading days) on SPY. Positive means implied exceeded what was realised. 4,231 days carry both a label and an outcome; 27 excluded for no forward outcome, 20 for fail-closed.

This is not P&L. It is the edge baseline the EV contract names, and it cannot see gamma, path, or what a gap does to an open book.

Finding 1 — VRP size does not discriminate below ~6 vol points

ex-ante VRP bucket n mean hit rate
< 0 1485 0.0331 0.879
[0, 1) 610 0.0313 0.849
[1, 2) 555 0.0240 0.813
[2, 3) 457 0.0319 0.792
[3, 4) 331 0.0387 0.813
[4, 6) 385 0.0392 0.808
[6, ∞) 408 0.0746 0.929

There is no monotonic relationship below 6 vol points. Mean realisation is flat at 0.024–0.039, and hit rate declines as ex-ante VRP rises — the negative-VRP bucket has the highest hit rate of any bucket under 6. θ = 3.0 sits in the middle of the flat region.

Finding 2 — the VIX band is what carries the information

Mean vrp_realised by band: calm ≈ 0.02–0.04, normal ≈ 0.05–0.07, stressed ≈ 0.09–0.11, cleanly ordered and roughly 3–4× from calm to stressed. This corroborates the earlier ad-hoc review (θ correlates +0.50 with VIX; 0% pass below VIX 13, 81% above VIX 30) and sharpens it: the VRP axis is close to uninformative on its own, while the band it correlates with is not.

Finding 3 — the binary split at θ = 3.0, including the stress set

This is the cut the amendment actually proposes, and it is more favourable to θ than Finding 1 alone suggests. Both are reported; neither is the whole picture.

window θ split n mean median hit worst
2018 Volmageddon+Q4 blocked <3.0 144 0.0020 0.0390 0.618 −0.1256
2018 Volmageddon+Q4 admitted ≥3.0 107 0.0139 0.0009 0.505 −0.0919
2020 COVID blocked 56 −0.0437 0.1019 0.750 −0.6517
2020 COVID admitted 164 0.0589 0.0792 0.927 −0.6426
2024 blocked 207 0.0196 0.0260 0.792 −0.0698
2024 admitted 45 0.0850 0.0784 0.978 −0.0005
ALL 2009–2026 blocked 3107 0.0309 0.0400 0.849 −0.6517
ALL 2009–2026 admitted 1124 0.0519 0.0642 0.853 −0.6426

In aggregate θ ≥ 3.0 does separate on the mean, 0.0519 against 0.0309. Three qualifications decide what that is worth:

  • It inverts in 2018. The admitted days were a coin flip — hit rate 0.505 against 0.618 for the days θ blocked, and a median of 0.0009 against 0.0390. In the one pure vol-spike stress in the sample, the filter preferred the worse days.
  • It buys no tail protection. Worst case is −0.6426 admitted against −0.6517 blocked: indistinguishable. For a short-premium book the tail is the whole risk, and θ does not touch it. Aggregate hit rate is also flat (0.853 vs 0.849) — the separation is in the mean alone.
  • The aggregate gain is the band effect re-expressed. Given Finding 1 shows no monotonic relationship below 6, the binary separation at 3 is not "more VRP, more edge" — it is θ selecting higher-VIX days, which Finding 2 shows are the days that realise more.

Cost: θ blocked 3,107 of 4,231 days (73%), and 207 of 252 days in 2024.

What this supports, and what it does not

Supports: θ = 3.0 as specified is a VIX-band proxy with a high day cost, no tail protection, and an inversion in the one pure vol-spike stress. If a VRP threshold is kept, the data points at 6, not 3 — that is the only bucket boundary where a relationship appears.

Does not support: any claim about EV, ladder quality, or the edge test's EV layers. That needs historical option chains (Tier 2), which we do not have.

Does not resolve: whether banding directly on VIX would be better than a VRP threshold at all. That is a different amendment and needs its own evidence.

Limitations — these bound every number above

  1. One underlying. Forward realised vol is SPY's. 17 years of a single correlated series is one sample; effective sample size is far below the row counts.
  2. Post-2008. VIX3M's history starts 2009-09-18, so 2008 is excluded. The stressed-day count is small relative to calm.
  3. VIX is the IV30 proxy. VRP uses the production proxy. When canonical IV30 arrives the level shifts systematically by an estimated 1–2 vol points and every number here must be recomputed. This receipt expires on that event.
  4. Not P&L. vrp_realised cannot see gamma, path or drawdown. An ~0.85 hit rate with a −0.65 worst case is the classic short-vol shape: frequent small wins, rare large losses, and the mean is the statistic that hides it.
  5. No data-outage incidence. The replay sees timely inputs on days that may have been late historically.

Reproduction

python3 backtest/equivalence.py backtest/_pre_refactor_regime_snapshot.py   # gate: 0 diffs
python3 backtest/characterise.py                                           # tables

backtest/out/ is gitignored — the harness writes there on whichever machine runs it, and an untracked build artifact must not collide with the repository (it did once, on hermes, 2026-09-27).

The full generated tables are therefore promoted verbatim next to this receipt as 2026-09-27-vrp-threshold-characterisation-tables.md — regime, bucket, regime×bucket and transition-vs-settled, unedited, with the §9 limitations the generator writes into its own output.

That promotion is deliberate: these tables are evidence attached to a decision record, so they are versioned and deployed rather than left regenerable on one host. Verify the copy against a fresh run by sha256:

187bb6a4cf8fe5157d924de19d019a38816a78db348ba31e4d578a27f970200d

Per-day rows (features.jsonl, 1.6 MB) stay regenerate-only.