Skip to content

VIX Term Structure (H2)

The level-based VIX gate failed (VIX-regime breakout); term structure is a different object. vix_ts_ratio = VIX9D / VIX3M inverts above 1 in acute stress and sits in contango (< 1) normally. H2 asks whether that signal carries edge, in two pre-registered orientations, each its own ledger row. Code: vix_term_structure.py.

Pre-registration. Both variants' rules, fitted-vs-fixed parameters, and the shared pass bar were fixed before the real-data run (the inversion threshold 1.0 is a structural prior, never fitted). Only Results were filled afterward.

Feature

vix_term_features joins VIX9D/VIX3M same-day (like VIX) and emits vix_ts_ratio plus the vix_ts_inverted / vix_ts_contango flags. Over the Databento span the ratio inverts in every genuine stress episode (2020, 2022, and the late-2025/2026 wobbles) and reverts otherwise.

Variant 1 — resolution trigger

Hypothesis. The moment stress resolves — the ratio crossing back below 1 after an inversion — marks the bottom of a fear spike, a high-odds long entry.

Rule. Long/flat, single entry: enter on the first day vix_ts_ratio crosses below 1 after being ≥ 1; exit on the prior M-day high or a 10-bar time stop (the shared LongFlatStrategy exit). Fitted: M ∈ {3, 5}. Fixed: the inversion threshold 1.0, the 10-bar time stop. No trend filter (the signal is the whole thesis).

Variant 2 — inversion gate on H1

Hypothesis. If longs carry worse while the term structure is inverted, then vetoing H1 pullback entries during inversion should improve it.

Rule. H1 pullback exactly, with its entry gate tightened to trend filter AND not inverted (combined_entry_gate). Fitted: N ∈ {3,5,7}, M ∈ {3,5} (H1's grid). Fixed: 200-day trend filter, 10-bar time stop, inversion threshold 1.0.

Pass bar

Same as the campaign bar: beat both buy-and-hold and the re-fit swing_breakout baseline on OOS Sharpe, on both MES and MNQ, bootstrap 90% CI excluding 0, drawdown no worse than buy-and-hold.

Results

Real-data walk-forward, 2019-05-06 → 2026-07-12 (stitched OOS 2020-12 → 2026-03), US$100k, 1 contract.

OOS Sharpe (the number to trust) — buy-and-hold and baseline are the bars; H1 shown for reference since variant 2 is built on it:

MESMNQ
swing_breakout (baseline)−0.07−0.01
buy_and_hold0.550.37
H1 pullback (reference)0.850.86
variant 1 — trigger0.36 (CI [−0.17, 1.00], incl. 0)0.57 (CI [0.05, 1.20])
variant 2 — inversion gate0.82 (CI [0.29, 1.48])0.61 (CI [0.08, 1.19])

Supporting OOS detail:

Metricv1 trigger MESv1 trigger MNQv2 gate MESv2 gate MNQ
Total return+3.5%+10.3%+9.6%+13.0%
Max drawdown−2.7%−3.8%−2.8%−4.8%
Win rate71.4%71.4%70.2%73.8%
Exposure11.6%11.3%28.0%24.4%
Trades35356761

Margin headroom: both variants hold ≤ 1 contract, so peak initial-margin utilization is the same ~2.8% (MES) / ~4.3% (MNQ) of a US$100k account as H1 — see the margin constants.

Reading

Neither variant supports the term-structure signal as a source of edge.

  • Variant 1 fails the bar. On MES its OOS Sharpe (0.36) does not beat buy-and-hold (0.55) and its CI includes 0; it clears the bar only on MNQ. The resolution trigger fires rarely (≈11% exposure, 35 OOS trades) and, on MES, the cross-below-1 days are not reliably better entries than simply holding.

  • Variant 2 passes the bar — but adds nothing. It beats both benchmarks on both symbols with CIs excluding 0, so mechanically it passes. But its Sharpe (0.82 / 0.61) is below the H1 base it gates (0.85 / 0.86), markedly so on MNQ. The inversion veto subtracts value: it blocks pullback entries during stress spikes, which are exactly when mean reversion pays best — the same lesson the VIX-level gate taught. Its pass is inherited from H1, not earned by term structure.

So the honest verdict on H2: the term-structure feature does not add edge on MES/MNQ daily bars. Variant 2 is recorded as a bar-pass for the ledger's multiple-testing accounting, with the explicit caveat that it is H1 carrying a net-negative filter; variant 1 is a fail.

Caveats

  • Variant 2's "pass" must not be read as term-structure alpha — see above; it would be strictly better to ship H1 ungated by term structure.
  • Same backtest-only feature transport and Panama-adjustment caveats as H1.
  • The inversion threshold 1.0 is a structural prior; the ratio's construction (VIX9D/VIX3M) fixes the boundary, so there is nothing to fit or tune here.