Why this was measurable without buying anything¶
Every regime record since 2026-09-11 carries
iv30_status: "PROVISIONAL_VIX_PROXY — canonical IV30 pending ThetaData". The
assumption was that closing it required procuring data.
It did not. The VolSurfAE project on ai-rig already ingests option chains and stores
SVI-fitted volatility surfaces at data/feature_store/svi_params/, hive-partitioned by
ticker and month, 56 MB, written daily — and it covers all four charter underlyings.
Canonical IV30 is a 30-day ATM read off that surface, so it is a parquet read, not a purchase.
The subscription question was also moot: THETADATA_TIER = "STANDARD" is already configured
in that project (2016 history, Greeks, IV). The credential file is not on ai-rig's disk at the
path the code expects, which is a separate open question.
Method¶
Raw SVI stores total implied variance, w(k) = a + b(ρ(k−m) + √((k−m)² + σ²)). At the money
k = 0, so w_atm = a + b(−ρm + √(m² + σ²)), and σ = √(w/T).
IV30 is w interpolated in total variance, linearly in T to T = 30/365, then converted
back. Interpolating total variance is the standard choice — it is what keeps the term structure
arbitrage-free under linear interpolation; interpolating implied vol directly does not.
Quality gating was explicit rather than incidental, because most of the store's rows are not usable:
| SVI rows scanned | 28,325 |
used (fit_status == SUCCESS, non-null params, T > 0) |
24,767 (87%) |
| skipped, did not converge | 3,558 |
| dates scored | 1,188 |
| dates dropped for want of expiries bracketing 30 days | 1 |
A date is scored only when two successful fits bracket 30 days. Extrapolating a smile fit past its last expiry to reach 30 days would have produced a number with no data behind it.
Result: 1,188 days, 2022-01-03 → 2026-09-29, IV30 median 15.07%, range 9.39%–42.69%.
Finding 1 — the gap is systematic and one-directional¶
Over the 1,181-day overlap with the regime series:
| canonical IV30 − VIX proxy | vol points |
|---|---|
| mean | −2.62 |
| median | −2.51 |
| standard deviation | 1.06 |
| minimum | −9.92 |
| maximum | +0.14 |
The maximum is the striking number. Canonical IV30 is below the VIX proxy on essentially every one of 1,181 days. This is not noise around a correct value; it is a wedge.
And it is structural, not an error in either series. VIX is the SPX 30-day variance swap
rate; canonical IV30 here is SPY at-the-money implied vol. The variance swap rate exceeds ATM
vol by the skew/convexity premium, so VIX overstates ATM IV30 by construction. The framework's
VRP is defined as implied minus forecast realised, and forecast_rv30 is HAR fitted on SPY
closes. The consistent implied measure for that comparison is ATM vol. Using VIX injects the
variance premium into a quantity intended to measure the vol premium.
The wiki estimated "a systematic 1–2 vol points." Measured: 2.6, and nearly always in the same direction.
Finding 2 — 41% of VRP signs flip¶
Only the third axis can move: the VIX band and term ratio come from VIX and VIX3M and are
untouched. So the entire effect lands on the vrp+ / vrp− suffix — which is what gates
premium selling.
| band | flips | of | share |
|---|---|---|---|
| calm | 380 | 788 | 48.2% |
| normal | 91 | 332 | 27.4% |
| stressed | 10 | 61 | 16.4% |
| all | 481 | 1181 | 40.7% |
Because canonical IV30 is lower, flips run overwhelmingly vrp+ → vrp−: days the proxy
called premium-rich were not.
The flips are mostly not marginal. On flip days the median |vrp_proxy| was 1.18 vol
points and the maximum 4.22; only 45% had |vrp_proxy| < 1.0 vol point. So more than half
of the flips reverse a VRP sign the proxy stated with apparent confidence.
calm-contango-vrp+ is the row that admits condors, credit spreads, calendars and diagonals.
Nearly half of the calm days the gate called sell-eligible were, on the consistent measure, not.
Finding 3 — this corrects two of my own prior findings¶
The θ evidence (2026-09-27:amendment-vrp-threshold-evidence) understates the problem. It
noted that canonical IV30 would shift the level and that every θ conclusion would need
recomputing. The shift is −2.6 vol points against a proposed θ of 3.0 — so θ = 3.0 on the
proxy corresponds to roughly θ = 0.4 on the consistent measure. The threshold is almost entirely
consumed by the measurement wedge.
The long-vol finding (2026-09-30:regime-mapping-straddle-gap-finding) is materially
changed. It used vrp_realised = VIX/100 − RV_fwd. Recomputed on canonical IV30, over the
same 1,154 days — so this is a within-sample comparison, not a window artifact:
| band | n | long-win % proxy | long-win % canonical | mean proxy | mean canonical |
|---|---|---|---|---|---|
| calm | 761 | 12.6% | 27.5% | +0.0307 | +0.0068 |
| normal | 332 | 23.2% | 35.5% | +0.0312 | +0.0025 |
| stressed | 61 | 3.3% | 23.0% | +0.0774 | +0.0353 |
| all | 1154 | 15.2% | 29.5% | +0.0333 | +0.0070 |
The share of days on which realised vol exceeded implied roughly doubles, and the mean
premium collapses toward zero. Two regimes invert to favour the buyer: calm-flat-vrp+
(−0.0206, n=38) and normal-contango-vrp+ (−0.0010, n=123).
Yesterday's headline — "mean is positive in all sixteen regimes; in seventeen years there is no regime where realised exceeded implied on average" — is substantially an artifact of the VIX proxy. The premium is real but much smaller than the proxy shows, and it is not universal.
What this does not establish¶
- Not P&L. Still a per-unit-vega proxy; still cannot price gamma, path, or an exit path.
- Whether SPY ATM IV30 is the right canonical measure is a modelling choice, and the owner
should confirm it. VIX is not wrong, it is a different quantity. But the framework's own field
is named
iv30and flagged "canonical IV30 pending", so ATM IV30 was always the intent; this confirms the intent rather than inventing it. - Coverage is 2022-01 onward, not 2009. The regime series runs to 2009; canonical IV30 for the earlier period would need a chain pull against the STANDARD subscription (2016+), and 2009–2015 is out of reach at any tier below PRO.
- The store covers 50 tickers but not EIX or PCG, two of the current paper book's positions.
Recommendation¶
Take the dependency, but measure once more before wiring it into the daily gate.
The measurement answers the question that was actually open: the proxy is materially wrong, in the direction that flatters premium selling, on nearly every day. That is worth fixing.
But wiring hermes to read ai-rig's parquet store daily re-couples a machine deliberately removed
from the OKF pipeline on 2026-09-20, and makes the regime gate depend on another project's
ingestion schedule and schema. That schema has visibly churned — svi_params_refit,
.pre_jja0_backup, .pre_25al_backup exist alongside the primary store, and the ticker column
is large_string in some partitions and string in others, which breaks a naive dataset read.
So, in order:
- Correct the record first. File correction notes against the θ evidence and the long-vol finding. Both are published and both now understate or misstate their case.
- Decide the canonical measure — owner confirmation that SPY ATM IV30, not VIX, is what
iv30means. - Then choose the plumbing. Either a daily pull from ai-rig with the staleness guard covering absence (36 KB per ticker-month, trivial), or give hermes the ThetaData credential so it derives IV30 itself and stays self-contained. The second avoids the cross-project coupling and is the one I would pick if the credential can be located.