VX3-VX1 Term Structure Inversion — McMillan / @TailThatWagsDog

Source: @TailThatWagsDog (Lawrence McMillan framing) · Signal: VX3 < VX1 (inversion / backwardation) · Backtested: 2026-05-22 · Proxy: ^VIX > ^VIX3M (VXMT) · Script: finance/vx_term_structure_backtest.py

The claim: When the 3rd-month VIX future is below the 1st-month (term structure in backwardation / inverted), it signals elevated systemic stress and bearish forward returns for equities. This is the "tail wagging the dog" — futures market pricing fear ahead of spot.
Verdict: NOT wired as an active signal. Backtest (2016–2025, 2,514 trading days) shows the claim does not reproduce. Inverted regime is actually followed by higher SPY forward returns at every horizon (mean-reversion / bounce effect). Edge threshold of ≥5% difference was not met. Signal remains a useful regime context indicator but is not actionable as a bearish trigger.

The Signal

"When the spot or near-term implied vol exceeds longer-dated vol, the options market is pricing more fear for the near term than the long term — the definition of acute stress."

Backtest Results (2016–2025)

Regime Frequency

MetricValue
Total days tested2,514
Days inverted (VIX > VIX3M)191 (7.6%)
Days in contango (normal)2,323 (92.4%)
Distinct inversion episodes57
Avg episode duration4.6 calendar days
Max episode duration60 calendar days (COVID crash 2020)

Forward SPY Returns by Regime

HorizonRegimeNMean %Median %Win %Edge (Inverted − Contango)Signal?
1dInverted191+0.12+0.2657.1 +0.07NO
1dContango2,322+0.06+0.0755.4
5dInverted191+0.92+1.5065.4 +0.66NO
5dContango2,318+0.26+0.4562.1
10dInverted191+1.50+2.7969.6 +0.96NO
10dContango2,313+0.55+0.8566.5
21dInverted191+3.37+4.0673.3 +2.22borderline
21dContango2,302+1.15+1.8370.3

Edge threshold: ≥5% mean difference to qualify as actionable signal. None of the horizons reach this bar.

Max Drawdown by Regime

RegimeMax Drawdown (SPY)Interpretation
Inverted-73.12%COVID crash / 2018 Q4 — co-occurrence with stress events
Contango-15.05%Normal correction territory

Why The Claim Doesn't Hold (Mechanically)

Data proxy caveat: ^VIX3M (CBOE VXMT) is the 93-day constant-maturity expected vol index, not the actual VX3 futures contract. The two can diverge due to futures roll premium. Actual CBOE VX1/VX3 futures data (available via CBOE Data Vault or Quandl) would give a cleaner test of the original claim. This backtest is a conservative, accessible proxy — not the definitive test.

What Is Useful (Context, Not Trigger)

Status & Next Steps

ActionStatus
Backtest on 2016–2026 proxy dataDone (2026-05-22)
Wire as active sentinel signalSkipped — signal does not hold
Surface on dashboard alongside Thrasher/VixologistSkipped — no edge
@TailThatWagsDog wired to X_SOURCES watchlistDone (low-freq)
Retest with actual VX1/VX3 CBOE futures dataP3 — if CBOE data access added
Explore as co-confirming factor with Thrasher + VixologistP3 — multi-factor only

Backtest script: finance/vx_term_structure_backtest.py · Memory file: .claude/agent-memory/jarvis/reference_vx3_vx1_mcmillan.md · Per lesson_thrasher_backtest_edge_decay: paper claims often don't reproduce.