Research · delta-hedged straddle backtest, 2018-01-02 → 2025-03-24 (1,816 sessions)
Equal-weight S1C + S3 + S4 sleeves on $1M of collateral, after every correction from C16 to C23. A documented negative result.
Sleeve specification · what each sleeve trades
| Sleeve | Role | Instrument | Side (trades) | Entry rule | Exit rule | Max hold | Sizing | Costs |
|---|---|---|---|---|---|---|---|---|
| S1C contrarian | portfolio | 30-calendar-day ATM SPX straddle, delta-hedged daily, marked at Black–Scholes on β·VIX | long 121 exits: 121 signal | PDV forecast > VIX + 2 vol pts in R0 → short; VIX > PDV + 2 vol pts in R1 → long | the spread back inside ±0.5 vol pts or through zero; a move into R2 closes it | 21 sessions | tanh(|spread| / 4 vol pts) × 20% of sleeve NAV · overlay | 0.15 vol pts + $0.65 a contract per leg, each way; hedge slippage 0.05% |
| S3 short SPX straddle | portfolio | SHORT 30-calendar-day ATM SPX straddle, delta-hedged daily, marked at Black–Scholes on β·VIX; the index leg only | short 39 exits: 25 signal, 14 at expiry, rolled | z of VIX / VVIX (252-session) < −1 in R0 or R1 | z > −0.3 | 30 sessions | min(1, |z| / 3) × 20% of sleeve NAV · overlay | 0.15 vol pts + $0.65 a contract per leg, each way; hedge slippage 0.05% |
| S4 VRP | portfolio | 30-calendar-day ATM SPX straddle, delta-hedged daily, marked at Black–Scholes on β·VIX | short 22 / long 24 exits: 45 signal, 1 open at the end | z_vrp > 1 and falling, in R1 → short; z_vrp < −0.5 and rising, in R0 → long | |z_vrp| < 0.3; a move into R2 closes it | 15 sessions | min(1, |z_vrp| / 2) × 20% of sleeve NAV · overlay | 0.15 vol pts + $0.65 a contract per leg, each way; hedge slippage 0.05% |
| S1 PDV (ref) | reference | 30-calendar-day ATM SPX straddle, delta-hedged daily, marked at Black–Scholes on β·VIX | short 69 exits: 69 signal | PDV forecast > VIX + 2 vol pts in R0 → long; VIX > PDV + 2 vol pts in R1 → short | the spread back inside ±0.5 vol pts or through zero | 21 sessions | tanh(|spread| / 4 vol pts) × 20% of sleeve NAV | 0.15 vol pts + $0.65 a contract per leg, each way; hedge slippage 0.05% |
| S2 VIX TS (ref) | reference | 30-calendar-day ATM SPX straddle, delta-hedged daily, marked at Black–Scholes on β·VIX | short 31 / long 13 exits: 44 signal | z of the VIX3M − VIX slope (252-session) > 1 in R0 or R1 → short; slope < 0 (backwardation) in R0 or R1 → long | |z| < 0.5, or VIX moves 15% of its entry level against the straddle | 10 sessions | min(1, |z| / 3) × 20% of sleeve NAV | 0.15 vol pts + $0.65 a contract per leg, each way; hedge slippage 0.05% |
No option prices exist in the window, so every straddle is priced and marked with Black–Scholes at β·VIX (β = 0.82). Sizing is premium as a share of the sleeve’s NAV; a short straddle is capped at NAV / (20% × K × 100) contracts, its initial margin; “overlay”: the portfolio sleeves’ size is then scaled by their pairwise P&L correlation and trailing net Sharpe, lagged one session. Costs are charged at entry and at exit (vol pts of the straddle’s vega); the cash account and the hedge carry r and q. z_vrp: the 252-session z-score of VRP = VIX − RV₂₀ (annualised), the day's premium of implied over realised vol. PDV forecast: the walk-forward 21-session RMS vol forecast; the spread is the forecast minus VIX. Regimes are the rule labels lagged one session. A position still on when its 30-day straddle expires is rolled into a fresh one the same close (“at expiry, rolled”). The trade log also holds 111 “combined” records (108 long, 3 short): the research-only agreement rule over S1C, S3 and S4, which reads S3 as long index vol, the opposite of the short straddle the backtest trades. It is not a coherent strategy, is not in the portfolio and is left out here. S3_PROXY_COST (0.1% of notional) costs only the pre-C22 z-score proxy the C22 bridge keeps; the canonical S3 is costed as a straddle. Every number in the table is read from joint_ and joint_ when the page is built, and the counts from the trade log in data_.
Cumulative return · portfolio, sleeves and T-bills
Daily from 2018-01-02 to 2025-03-24; R2 sessions (shaded) are 24% of the window.
| Series | Final | Lowest | Highest |
|---|---|---|---|
| Portfolio | −22.2% | −22.2% | 0.0% |
| S1C contrarian | −45.4% | −46.8% | +1.3% |
| S3 short SPX straddle | +6.1% | −5.2% | +16.9% |
| S4 VRP | −27.4% | −27.9% | +0.3% |
| S1 PDV (ref) | −30.7% | −41.2% | +12.8% |
Each sleeve's own NAV relative to its start; the portfolio's daily P&L is the equal-weight mean of S1C, S3 and S4. Full daily resolution; drag or use the slider to zoom.
Drawdown
Deepest drawdown −22.2% on 2025-03-24.
| Statistic | Value |
|---|---|
| Deepest (%) | −22.22 |
| Date of the trough | 2025-03-24 |
Rolling 126-session Sharpe
Annualised Sharpe of the trailing 126 daily returns; blank where the NAV was flat.
| Statistic | Value |
|---|---|
| Latest | −2.91 |
| Lowest | −5.73 |
| Highest | +2.88 |
Per-sleeve performance
| Signal | Total P&L | Sharpe | Ann. return | Win rate | Trades | Role |
|---|---|---|---|---|---|---|
| S1C contrarian | −$453,845 | −0.694 | −8.05% | 33.88% | 121 | portfolio |
| S3 short SPX straddle | $61,047 | 0.192 | 0.83% | 48.72% | 39 | portfolio |
| S4 VRP | −$273,733 | −0.788 | −4.34% | 36.96% | 46 (1 open) | portfolio |
| S1 PDV (ref) | −$306,779 | −0.169 | −4.96% | 57.97% | 69 | reference |
| S2 VIX TS (ref) | −$148,436 | −0.376 | −2.21% | 38.64% | 44 | reference |
S3 is a short SPX straddle: the index leg of a dispersion trade, with no single-name leg (the store has no single-stock options). S1 and S2 are reference strategies, not in the portfolio. Sharpe: excess P&L, rf=0 (collateral earns T-bills). S4's count includes a straddle opened on the last session (2025-03-24) and still open, carrying only its entry cost (−$433); the engine's win rate counts it as a loss.
Total P&L by sleeve
Mark-to-model P&L of the three portfolio sleeves over the backtest window.
| Sleeve | P&L ($000s) |
|---|---|
| S1C contrarian | −453.8 |
| S3 short SPX straddle | +61.0 |
| S4 VRP | −273.7 |
Every trade · P&L by entry date
205 closed round trips of S1C, S3 and S4, each a dot at its entry date and its mark-to-model P&L at β·VIX in $000s; the open trade is hollow and carries only its entry cost.
| Sleeve | Year | Trades | Winning | Total P&L | Best | Worst |
|---|---|---|---|---|---|---|
| S1C contrarian | 2018 | 15 | 4 | −58.5 | +32.5 | −27.9 |
| S1C contrarian | 2019 | 18 | 5 | −114.9 | +15.7 | −28.3 |
| S1C contrarian | 2020 | 12 | 5 | −164.4 | +55.1 | −59.7 |
| S1C contrarian | 2021 | 21 | 7 | −107.2 | +21.2 | −26.7 |
| S1C contrarian | 2022 | 17 | 12 | +108.5 | +33.0 | −18.6 |
| S1C contrarian | 2023 | 23 | 3 | −101.6 | +7.3 | −29.1 |
| S1C contrarian | 2024 | 10 | 3 | −11.8 | +4.7 | −6.0 |
| S1C contrarian | 2025 | 5 | 2 | −3.8 | +4.2 | −4.0 |
| S3 short SPX straddle | 2018 | 1 | 0 | −22.4 | −22.4 | −22.4 |
| S3 short SPX straddle | 2019 | 5 | 4 | +34.6 | +12.6 | −13.4 |
| S3 short SPX straddle | 2020 | 2 | 0 | −27.3 | −7.6 | −19.6 |
| S3 short SPX straddle | 2021 | 11 | 8 | +160.4 | +41.1 | −10.5 |
| S3 short SPX straddle | 2023 | 13 | 6 | +2.9 | +16.5 | −13.8 |
| S3 short SPX straddle | 2024 | 5 | 1 | −63.9 | +13.9 | −45.0 |
| S3 short SPX straddle | 2025 | 2 | 0 | −23.4 | −7.1 | −16.2 |
| S4 VRP | 2018 | 8 | 5 | −8.5 | +16.3 | −42.5 |
| S4 VRP | 2019 | 10 | 1 | −139.8 | +5.7 | −62.3 |
| S4 VRP | 2020 | 2 | 1 | −7.4 | +7.2 | −14.6 |
| S4 VRP | 2021 | 3 | 1 | −27.7 | +13.5 | −20.8 |
| S4 VRP | 2022 | 9 | 4 | −7.2 | +7.5 | −10.3 |
| S4 VRP | 2023 | 6 | 2 | −37.5 | +7.5 | −17.7 |
| S4 VRP | 2024 | 6 | 2 | −45.9 | +0.9 | −19.6 |
| S4 VRP | 2025 | 1 | 1 | +0.7 | +0.7 | +0.7 |
Trade readout: hover a dot, or focus here and step through the trades by entry date with ← → (Page Up / Down: 10 trades; Home / End).
Arrow keys step through the shown sleeves’ round trips in order of entry date; each step reads the sleeve, the entry date and the P&L in $000s.Each dot is one round trip (a straddle from entry to exit), at its entry date and its net P&L in $000s: priced and marked with Black–Scholes at β·VIX, after costs and financing, so no dot is a traded fill. The reference strategies S1 and S2 are in the statistics below, not on the chart. The open trade is hollow and carries only its entry cost. The trade log’s “combined” records (the research-only agreement rule, not in the portfolio; see the sleeve specification) are left out.
Closed round trips · P&L and days held
P&L per round trip
Counts of the 205 closed round trips of S1C, S3 and S4 by P&L bin in $000s.
| P&L ($000s) | Trades |
|---|---|
| ≥ +60 | 0 |
| +40 to +60 | 3 |
| +20 to +40 | 10 |
| +10 to +20 | 20 |
| 0 to +10 | 44 |
| −10 to 0 | 72 |
| −20 to −10 | 37 |
| −40 to −20 | 11 |
| −60 to −40 | 7 |
| < −60 | 1 |
Days held
Counts of the 205 closed round trips of S1C, S3 and S4 by calendar days from entry to exit.
| Days held | Trades |
|---|---|
| 0–4 | 66 |
| 5–9 | 22 |
| 10–14 | 32 |
| 15–19 | 13 |
| 20–24 | 19 |
| 25–29 | 34 |
| ≥ 30 | 19 |
Round-trip statistics by sleeve
| Sleeve | Closed | Open | Total | P(profit) | Mean | Median | Best | Worst | 5 worst / losses | 5 best / gains | Median days |
|---|---|---|---|---|---|---|---|---|---|---|---|
| S1C contrarian | 121 | 0 | −453.8 | 33.9% | −3.8 | −3.0 | +55.1 | −59.7 | 29% | 41% | 8 |
| S3 short SPX straddle | 39 | 0 | +61.0 | 48.7% | +1.6 | −0.4 | +41.1 | −45.0 | 53% | 50% | 16 |
| S4 VRP | 45 | 1 | −273.7 | 37.8% | −6.1 | −3.9 | +16.3 | −62.3 | 48% | 57% | 8 |
| S1 PDV (ref) | 69 | 0 | −306.8 | 58.0% | −4.4 | +4.3 | +60.1 | −182.8 | 49% | 31% | 29 |
| S2 VIX TS (ref) | 44 | 0 | −148.4 | 38.6% | −3.4 | −1.3 | +18.1 | −91.2 | 65% | 50% | 9 |
Dollars are each sleeve’s own (a $1M NAV per sleeve); the portfolio is the equal-weight mean of S1C, S3 and S4, so a trade moves it by a third as much. The counts and totals are the trade log’s and equal the per-sleeve table above (checked when the page is built). Across the three portfolio sleeves 205 round trips closed, 37.6% at a profit, with a median of −2.8k and a mean of −3.2k per trade in sleeve dollars (−$1,083 of portfolio P&L, the Trades tile: a third of it). The five largest losses are 29% of S1C contrarian’s losses, 53% of S3 short SPX straddle’s losses, 48% of S4 VRP’s losses.
Worst drawdowns · portfolio and each sleeve
| Series | Rank | Peak | Valley | Recovery | Depth | Sessions to valley | Sessions |
|---|---|---|---|---|---|---|---|
| Portfolio | 1 | 2018-01-03 | 2025-03-24 | not recovered | −22.2% | 1,814 | 1,814 to date |
| S1C contrarian | 1 | 2018-04-25 | 2024-12-13 | not recovered | −47.5% | 1,671 | 1,737 to date |
| S1C contrarian | 2 | 2018-01-08 | 2018-01-10 | 2018-01-16 | −0.7% | 2 | 5 |
| S3 short SPX straddle | 1 | 2023-05-22 | 2025-02-21 | not recovered | −9.2% | 439 | 460 to date |
| S3 short SPX straddle | 2 | 2020-01-23 | 2021-05-12 | 2021-05-27 | −6.6% | 328 | 339 |
| S3 short SPX straddle | 3 | 2018-01-03 | 2019-12-03 | 2019-12-18 | −4.0% | 482 | 493 |
| S3 short SPX straddle | 4 | 2021-07-14 | 2021-07-19 | 2021-08-03 | −3.1% | 3 | 14 |
| S3 short SPX straddle | 5 | 2023-04-24 | 2023-05-04 | 2023-05-12 | −2.2% | 8 | 14 |
| S4 VRP | 1 | 2018-11-12 | 2025-01-24 | not recovered | −28.1% | 1,557 | 1,597 to date |
| S4 VRP | 2 | 2018-03-07 | 2018-07-03 | 2018-11-12 | −4.4% | 82 | 174 |
Each series’ deepest drawdown equals the engine’s max drawdown (checked when the page is built). The portfolio has stayed below its 2018-01-03 high ever since (1 drawdown period in the whole run): 1,814 sessions to 2025-03-24, at its deepest on 2025-03-24. The NAVs are mark-to-model: these are drawdowns of β·VIX marks, not of traded prices.
Monthly returns
| Year | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2018 | −0.3; Jan 2018: −0.32% | 0.0; Feb 2018: 0.00% | 0.0; Mar 2018: −0.02% | −1.6; Apr 2018: −1.63% | −0.9; May 2018: −0.86% | −1.1; Jun 2018: −1.05% | −0.5; Jul 2018: −0.48% | −0.8; Aug 2018: −0.83% | −0.4; Sep 2018: −0.37% | +1.5; Oct 2018: +1.46% | 0.0; Nov 2018: −0.03% | +1.1; Dec 2018: +1.06% | −3.1; 2018: −3.07% |
| 2019 | −1.5; Jan 2019: −1.55% | −0.4; Feb 2019: −0.37% | −0.5; Mar 2019: −0.48% | −0.7; Apr 2019: −0.71% | −2.7; May 2019: −2.73% | −0.8; Jun 2019: −0.80% | 0.0; Jul 2019: +0.01% | −0.2; Aug 2019: −0.16% | −0.7; Sep 2019: −0.71% | −0.9; Oct 2019: −0.87% | −0.4; Nov 2019: −0.37% | +0.8; Dec 2019: +0.79% | −7.7; 2019: −7.72% |
| 2020 | +0.6; Jan 2020: +0.61% | −1.0; Feb 2020: −1.01% | 0.0; Mar 2020: 0.00% | 0.0; Apr 2020: 0.00% | −0.4; May 2020: −0.41% | +2.4; Jun 2020: +2.44% | −2.3; Jul 2020: −2.31% | −1.2; Aug 2020: −1.22% | −0.5; Sep 2020: −0.52% | −0.7; Oct 2020: −0.66% | −1.8; Nov 2020: −1.84% | −2.2; Dec 2020: −2.21% | −7.0; 2020: −7.00% |
| 2021 | −1.0; Jan 2021: −0.96% | −1.4; Feb 2021: −1.36% | −0.3; Mar 2021: −0.30% | −0.8; Apr 2021: −0.81% | +2.0; May 2021: +2.04% | +1.1; Jun 2021: +1.08% | −0.2; Jul 2021: −0.23% | +1.0; Aug 2021: +1.01% | +0.6; Sep 2021: +0.63% | −0.4; Oct 2021: −0.44% | +1.2; Nov 2021: +1.23% | −0.8; Dec 2021: −0.84% | +1.0; 2021: +0.99% |
| 2022 | −0.1; Jan 2022: −0.11% | +0.5; Feb 2022: +0.54% | −0.4; Mar 2022: −0.41% | +0.9; Apr 2022: +0.93% | +0.4; May 2022: +0.43% | +1.4; Jun 2022: +1.42% | −1.0; Jul 2022: −1.00% | +1.3; Aug 2022: +1.29% | +0.4; Sep 2022: +0.35% | −0.5; Oct 2022: −0.51% | +1.3; Nov 2022: +1.26% | −0.1; Dec 2022: −0.12% | +4.1; 2022: +4.13% |
| 2023 | 0.0; Jan 2023: −0.02% | −0.4; Feb 2023: −0.39% | −1.2; Mar 2023: −1.19% | −0.4; Apr 2023: −0.36% | −0.8; May 2023: −0.75% | −0.4; Jun 2023: −0.38% | −0.6; Jul 2023: −0.57% | −0.6; Aug 2023: −0.57% | −0.6; Sep 2023: −0.55% | −0.2; Oct 2023: −0.25% | −0.2; Nov 2023: −0.19% | 0.0; Dec 2023: +0.04% | −5.1; 2023: −5.07% |
| 2024 | −0.7; Jan 2024: −0.68% | −0.4; Feb 2024: −0.36% | −0.2; Mar 2024: −0.19% | −0.4; Apr 2024: −0.40% | −0.9; May 2024: −0.95% | +0.4; Jun 2024: +0.41% | −0.6; Jul 2024: −0.55% | 0.0; Aug 2024: 0.00% | −0.2; Sep 2024: −0.23% | −0.2; Oct 2024: −0.22% | −1.0; Nov 2024: −0.95% | −1.3; Dec 2024: −1.25% | −5.3; 2024: −5.26% |
| 2025 YTD | −0.2; Jan 2025: −0.20% | −0.9; Feb 2025: −0.92% | 0.0; Mar 2025: −0.02% | Apr 2025: — | May 2025: — | Jun 2025: — | Jul 2025: — | Aug 2025: — | Sep 2025: — | Oct 2025: — | Nov 2025: — | Dec 2025: — | −1.1; 2025 YTD (2025-01-02 → 2025-03-24): −1.14% |
Hover or focus a cell (arrow keys move) for its details.
Annual return and half-year Sharpe
Calendar-year returns; they compound to the cumulative return. 2025 YTD: 2025-01-02 → 2025-03-24, 55 sessions.
| Year | Return |
|---|---|
| 2018 | −3.07% |
| 2019 | −7.72% |
| 2020 | −7.00% |
| 2021 | +0.99% |
| 2022 | +4.13% |
| 2023 | −5.07% |
| 2024 | −5.26% |
| 2025 YTD | −1.14% |
10 of 15 half-years have a negative Sharpe.
| Half-year | Sharpe |
|---|---|
| 2018-H1 | −4.19 |
| 2018-H2 | +0.38 |
| 2019-H1 | −4.39 |
| 2019-H2 | −1.12 |
| 2020-H1 | +0.62 |
| 2020-H2 | −3.98 |
| 2021-H1 | −0.18 |
| 2021-H2 | +0.88 |
| 2022-H1 | +1.02 |
| 2022-H2 | +0.74 |
| 2023-H1 | −2.45 |
| 2023-H2 | −1.84 |
| 2024-H1 | −3.17 |
| 2024-H2 | −2.49 |
| 2025-H1 (partial) | −5.71 |
Years compound exactly to the cumulative return (2025 YTD: 2025-01-02 → 2025-03-24, 55 sessions). 10 of 15 half-years are negative. Sub-periods of one run: nothing is refitted per window, so this is not walk-forward evidence.
Inference · intervals, nulls, multiple testing
| Series | Sharpe | Interval | Excludes 0 | PSR(SR > 0) | DSR | Skew | Kurtosis |
|---|---|---|---|---|---|---|---|
| Portfolio | −0.99 | −1.81 to −0.30 | yes | 0.01 | 0.000 | +3.7 | 56 |
| S1 PDV (ref) | −0.17 | −0.70 to +0.47 | no | 0.32 | 0.000 | −6.1 | 94 |
| S1C contrarian | −0.69 | −1.52 to −0.05 | yes | 0.05 | 0.000 | +5.7 | 70 |
| S2 VIX TS (ref) | −0.38 | −0.86 to +0.27 | no | 0.11 | 0.000 | −17.8 | 629 |
| S3 short SPX straddle | +0.19 | −0.40 to +0.87 | no | 0.69 | 0.000 | −5.3 | 95 |
| S4 VRP | −0.79 | −1.42 to −0.18 | yes | 0.02 | 0.000 | −0.3 | 76 |
DSR deflates for the 147 effective trials of C16–C22 (162 raw; 190 over every round, from docs/trials_ledger.yaml). Excess kurtosis this large makes every Sharpe interval wide.
| Sleeve | Real P&L | Null mean | Null 5–95% | Timing part | p (shift) | Holm p | p (shuffle) |
|---|---|---|---|---|---|---|---|
| Portfolio | −$222K | −$225K | −$325K to −$113K | +$3K | 0.447 | 1.00 | 0.463 |
| S1 PDV (ref) | −$307K | −$419K | −$602K to −$177K | +$113K | 0.177 | 0.88 | 0.208 |
| S1C contrarian | −$454K | −$404K | −$549K to −$210K | −$50K | 0.631 | 1.00 | 0.679 |
| S2 VIX TS (ref) | −$148K | −$101K | −$278K to +$82K | −$47K | 0.676 | 1.00 | 0.655 |
| S3 short SPX straddle | +$61K | −$128K | −$309K to +$94K | +$189K | 0.078 | 0.47 | 0.057 |
| S4 VRP | −$274K | −$144K | −$314K to +$84K | −$129K | 0.869 | 1.00 | 0.892 |
The timing part is real P&L minus the null mean: what entry timing added over the same exposure placed at random.
| Family | Series | SPA p | StepM superior | PBO |
|---|---|---|---|---|
| Published sleeves vs cash | 6 | 0.654 | none | — |
| Every configuration tried (trials ledger) | 83 | 0.013 | beta1.00:s1 | 0.001 |
| Configurations at an estimated β | 44 | 0.196 | none | 0.010 |
The inference summary, line by line
- s1: Sharpe −0.17, 95% stationary-bootstrap CI [−0.70, 0.47] includes zero; mean daily P&L −$169 [−569, 205] includes zero
- s1c: Sharpe −0.69, 95% stationary-bootstrap CI [−1.52, −0.05] excludes zero (negative); mean daily P&L −$250 [−449, −43] excludes zero (negative)
- s2: Sharpe −0.38, 95% stationary-bootstrap CI [−0.86, 0.27] includes zero; mean daily P&L −$82 [−233, 36] includes zero
- s3: Sharpe 0.19, 95% stationary-bootstrap CI [−0.40, 0.87] includes zero; mean daily P&L $34 [−93, 169] includes zero
- s4: Sharpe −0.79, 95% stationary-bootstrap CI [−1.42, −0.18] excludes zero (negative); mean daily P&L −$151 [−279, −34] excludes zero (negative)
- portfolio: Sharpe −0.99, 95% stationary-bootstrap CI [−1.81, −0.30] excludes zero (negative); mean daily P&L −$122 [−203, −41] excludes zero (negative)
- PSR(SR>0); DSR at the ledger's trial counts (N 147-210: the C16-C22 effective N and the raw counts, every trial-variance choice); the largest DSR over every N and variance choice: s1 0.32; 0.000-0.001; 0.049; s1c 0.05; 0.000-0.000; 0.004; s2 0.11; 0.000-0.000; 0.004; s3 0.69; 0.000-0.019; 0.271; s4 0.02; 0.000-0.000; 0.001; portfolio 0.01; 0.000-0.000; 0.000. The largest is at null_var|n_eigen_participation: N 4.6 is the eigenvalue participation ratio of the 83 re-run trial series, not a count of trials (ledger C16-C22 162, all rounds 190); null_var is the skill-less trial variance 1/(T-1)
- s3: DSR 0.000 at the ledger's N 162 with the family's trial-Sharpe sd 0.64/yr (SR0 1.73); 0.017 with the H0 sd 0.37/yr; 0.27 only at N 4.6 (the re-run family's eigenvalue participation, not a trial count) with the H0 sd; MinTRL 78 years at the observed SR and moments
- Hansen SPA (the 6 published series vs cash): consistent p 0.65; Romano-Wolf StepM superior: none
- Over the 44 trial series priced at an estimated beta: SPA p 0.20, StepM superior none; over all 83 (incl. beta = 1, the mis-specified mark): SPA p 0.013, StepM superior ['beta1.00:s1']
- CSCV PBO (the published portfolio's configurations, 16 series, 12870 splits): 0.34; OOS-on-IS Sharpe slope −0.99; selected config's OOS Sharpe −0.90/yr (IS −0.28)
- CSCV PBO (beta-estimated trials, 44 series, 12870 splits): 0.01; OOS-on-IS Sharpe slope −1.11; selected config's OOS Sharpe 0.41/yr (IS 1.04)
- CSCV PBO (all trials, 83 series, 12870 splits): 0.00; OOS-on-IS Sharpe slope −1.06; selected config's OOS Sharpe 0.60/yr (IS 1.42)
- s1: timing vs 3550 circular shifts p 0.177 (Holm over 6: 0.88); real −$306,779 = exposure at random timing −$419,391 + timing $112,612; trade shuffle (2000 paths) p 0.208 (Holm 1.00)
- s1c: timing vs 3550 circular shifts p 0.631 (Holm over 6: 1.00); real −$453,845 = exposure at random timing −$403,511 + timing −$50,334; trade shuffle (2000 paths) p 0.679 (Holm 1.00)
- s2: timing vs 3550 circular shifts p 0.676 (Holm over 6: 1.00); real −$148,436 = exposure at random timing −$101,034 + timing −$47,402; trade shuffle (2000 paths) p 0.655 (Holm 1.00)
- s3: timing vs 3550 circular shifts p 0.078 (Holm over 6: 0.47); real $61,047 = exposure at random timing −$128,128 + timing $189,174; trade shuffle (2000 paths) p 0.057 (Holm 0.34)
- s4: timing vs 3550 circular shifts p 0.869 (Holm over 6: 1.00); real −$273,733 = exposure at random timing −$144,311 + timing −$129,422; trade shuffle (2000 paths) p 0.892 (Holm 1.00)
- portfolio: timing vs 3550 circular shifts p 0.447 (Holm over 6: 1.00); real −$222,177 = exposure at random timing −$225,316 + timing $3,139; trade shuffle (2000 paths) p 0.463 (Holm 1.00)
- Daily P&L on the always-short straddle (HAC t, 21 lags): s1 alpha $42,638/yr (t 1.55), beta 1.22 (t 9.34, R2 0.62); s1c alpha −$90,969/yr (t −4.75), beta −0.40 (t −3.23, R2 0.26); s2 alpha −$15,534/yr (t −1.17), beta 0.07 (t 0.97, R2 0.02); s3 alpha $18,865/yr (t 1.30), beta 0.15 (t 2.36, R2 0.09); s4 alpha −$38,173/yr (t −2.78), beta −0.00 (t −0.09, R2 0.00); portfolio alpha −$36,759/yr (t −3.90), beta −0.08 (t −2.36, R2 0.08)
- 21-day variance forecasts, full_sample 2012-04-30..2026-09-18 (n 3618): QLIKE PDV 0.461, rank 6/7 (best vix_mz 0.378); MSE rank 2/7; DM (HLN) vs PDV significant at 5%: none; 90% MCS (QLIKE) ['garch', 'gjr', 'pdv', 'vix2', 'vix_mz']
- 21-day variance forecasts, backtest_window 2018-01-02..2025-03-24 (n 1816): QLIKE PDV 0.662, rank 6/7 (best vix2 0.450); MSE rank 2/7; DM (HLN) vs PDV significant at 5%: none; 90% MCS (QLIKE) ['garch', 'gjr', 'har', 'pdv', 'vix2', 'vix_mz']
- PUT-implied beta overall 0.800; full years 0.63-0.90 (sd 0.09; typical within-year se 0.05); replication at beta 0.82: daily corr 0.984 with the index
- WPUT-implied beta overall 0.800; full years 0.75-0.89 (sd 0.05; typical within-year se 0.04); replication at beta 0.82: daily corr 0.974 with the index
- Always-short straddle (the mark's premium factor) daily corr / corr ex-SPX with WPUT: all 0.55/0.31, 2018 0.63/0.35, 2020 0.61/0.33, 2022 0.48/0.28; PUT: all 0.50/0.17, 2018 0.61/0.24, 2020 0.53/0.12, 2022 0.49/0.30; BFLY: all 0.13/0.13, 2018 0.45/0.23, 2020 −0.02/0.03, 2022 0.19/0.17
Conventions: annualisation: × √252; pnl: mark-to-model (β·VIX), as the backtest; returns: daily NAV returns from the $1M base (backtest_engine.compute_metrics); excess over T-bills, rf = 0. Source: data_store/backtest/inference/summary.json.
Real-settlement benchmarks · Cboe strategy indices
| Series | PUT | WPUT | BXM | BFLY | CNDR | VXTH |
|---|---|---|---|---|---|---|
| Portfolio | −0.17 | −0.20 | −0.16 | −0.05 | −0.09 | −0.16 |
| S1C contrarian | −0.28 | −0.35 | −0.28 | −0.02 | −0.13 | −0.25 |
| S3 short SPX straddle | +0.13 | +0.18 | +0.14 | −0.03 | +0.03 | +0.13 |
| S4 VRP | −0.01 | −0.01 | −0.01 | −0.01 | 0.00 | −0.03 |
| Always-short straddle | +0.50 | +0.55 | +0.50 | +0.13 | +0.30 | +0.23 |
PUT, WPUT, BXM, BFLY and CNDR settle on real SPX option prices. A β·VIX mark that tracked real prices would co-move with them; the always-short straddle row is the backtest's own premium factor.
| Index | All | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 YTD* |
|---|---|---|---|---|---|---|---|---|---|
| PUT | 0.800 | 0.63 | 0.85 | 0.90 | 0.71 | 0.82 | 0.86 | 0.79 | 0.57 |
| WPUT | 0.800 | 0.77 | 0.83 | 0.78 | 0.75 | 0.89 | 0.75 | 0.79 | 0.82 |
Partial year. 2025 YTD covers 2025-01-01 → 2025-03-24: PUT 3 roll periods (expiries 2025-01-17 → 2025-03-21), WPUT 12 roll periods (expiries 2025-01-03 → 2025-03-21).
Per year, the β at which β·VIX reprices PUT and WPUT; the dashed line is the backtest's fixed β. A YTD year is partial (see the note under the table).
| Index | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 YTD |
|---|---|---|---|---|---|---|---|---|
| PUT | 0.63 | 0.85 | 0.90 | 0.71 | 0.82 | 0.86 | 0.79 | 0.57 |
| WPUT | 0.77 | 0.83 | 0.78 | 0.75 | 0.89 | 0.75 | 0.79 | 0.82 |
Forward test · pre-registered, executable prices
3 sessions registered, 2026-10-26 → 2026-10-28; each file carries the SHA-256 of the one before it and of its captured chain, and the chain checks out. Entries at the ask (long) or bid (short), marks at bid / ask / mid on later captured books.
| Sleeve | Target | Open straddle | Open P&L (exec) | Realised (net) | Opened / closed |
|---|---|---|---|---|---|
| S1C contrarian | long | 2026-11-27 7,750 · long | −$4,080 | $0 | 1 / 0 |
| S3 short SPX straddle | flat | — | — | $0 | 0 / 0 |
| S4 VRP | flat | — | — | $0 | 0 / 0 |
| S1 PDV (ref) | short | 2026-11-25 7,710 · short | +$2,600 | $0 | 1 / 0 |
| S2 VIX TS (ref) | flat | — | — | $0 | 0 / 0 |
Vol forecasts · 21-day QLIKE
| Model | QLIKE | Rank | R² (vol) | 90% MCS |
|---|---|---|---|---|
| VIX2 | 0.450 | 1 | 0.216 | in |
| GJR | 0.475 | 2 | 0.278 | in |
| GARCH | 0.482 | 3 | 0.294 | in |
| HAR | 0.506 | 4 | 0.259 | in |
| VIX_MZ | 0.506 | 5 | 0.252 | in |
| PDV | 0.662 | 6 | 0.269 | in |
| EWMA | 0.733 | 7 | 0.052 | out |
PDV drives S1/S1C (today’s forecast). VIX² is risk-neutral, so it contains the variance premium. Mean realised vol 16.7%.
Model definitions
- VIX2
- (VIX/100)², risk-neutral (contains the variance premium)
- GJR
- GJR-GARCH(1,1,1), as garch
- GARCH
- GARCH(1,1) zero mean, Gaussian QML (arch), re-estimated every 21 sessions
- HAR
- HAR-RV on daily r², expanding OLS, purged (labels i ≤ t − 21)
- VIX_MZ
- walk-forward OLS of y² on [1, (VIX/100)²], purged
- PDV
- PDVLinear walk-forward (models.pdv.walk_forward_vol_forecast), σ̂², the S1/S1C input
- EWMA
- RiskMetrics λ = 0.94
Implied against realised vol · what the β·VIX mark leaves of the premium
Daily 2010-01-04 to 2026-10-28: the VIX close, RV21 over the 21 sessions to each date and over the 21 sessions after it (to 2026-09-29); the backtest window is shaded and the 46 S4 entries (22 short, 24 long) are marked at the VIX close of their entry session.
| Year | VIX | RV21 trailing | RV21 forward | VIX − RV21 forward |
|---|---|---|---|---|
| 2010 | 22.55 | 17.35 | 16.52 | +6.02 |
| 2011 | 24.20 | 20.30 | 20.88 | +3.33 |
| 2012 | 17.80 | 12.65 | 12.57 | +5.23 |
| 2013 | 14.23 | 11.05 | 10.78 | +3.45 |
| 2014 | 14.18 | 10.56 | 11.08 | +3.10 |
| 2015 | 16.67 | 14.46 | 14.81 | +1.86 |
| 2016 | 15.83 | 12.41 | 11.27 | +4.55 |
| 2017 | 11.09 | 6.69 | 6.75 | +4.34 |
| 2018 | 16.64 | 14.33 | 15.93 | +0.71 |
| 2019 | 15.39 | 12.71 | 11.17 | +4.22 |
| 2020 | 29.25 | 26.77 | 27.09 | +2.16 |
| 2021 | 19.66 | 12.48 | 12.79 | +6.87 |
| 2022 | 25.62 | 23.58 | 23.74 | +1.89 |
| 2023 | 16.87 | 13.19 | 12.55 | +4.32 |
| 2024 | 15.61 | 12.01 | 12.43 | +3.18 |
| 2025 | 18.96 | 15.90 | 15.44 | +3.52 |
| 2026 (to 2026-10-28) | 18.11 | 12.49 | 12.82 | +5.45 |
4,210 sessions with a forward window; positive on 84.6%, mean +3.75 vol pts. Zooms with the chart above.
| Year | Mean | Above zero (%) | Sessions |
|---|---|---|---|
| 2010 | +6.02 | 85.3 | 252 |
| 2011 | +3.33 | 84.9 | 252 |
| 2012 | +5.23 | 99.2 | 250 |
| 2013 | +3.45 | 85.3 | 252 |
| 2014 | +3.10 | 77.8 | 252 |
| 2015 | +1.86 | 79.0 | 252 |
| 2016 | +4.55 | 86.5 | 252 |
| 2017 | +4.34 | 100.0 | 251 |
| 2018 | +0.71 | 61.0 | 251 |
| 2019 | +4.22 | 83.7 | 252 |
| 2020 | +2.16 | 76.7 | 253 |
| 2021 | +6.87 | 95.2 | 252 |
| 2022 | +1.89 | 64.9 | 251 |
| 2023 | +4.32 | 100.0 | 250 |
| 2024 | +3.18 | 81.0 | 252 |
| 2025 | +3.52 | 84.4 | 250 |
| 2026 (to 2026-09-29) | +5.45 | 96.2 | 186 |
| β | Which | Mean | Median | Above zero | (β·VIX)² − RV² |
|---|---|---|---|---|---|
| 1.00 | VIX itself | +3.11 | +4.32 | 79.2% | +50.1 |
| 0.82 | the backtest's mark | −0.46 | +1.19 | 61.6% | −97.7 |
| 0.80 | round reference | −0.85 | +0.86 | 58.2% | −112.3 |
| 0.78 | newest chain's ATM / VIX (2026-10-28: 0.785) | −1.25 | +0.49 | 55.1% | −126.6 |
Full sample, 2010-01-04 → 2026-09-29 (4,210 sessions with a forward window): VIX − RV21 forward averages +3.75 vol pts and is positive on 84.6% of sessions. Today, 2026-10-28: VIX 16.91 against RV21 trailing 9.69 (+7.22 vol pts); its forward value is not known until 21 sessions later.
Triangles on the chart: the 46 S4 entries of the trade log (22 short ▼, 24 long ▲), at the VIX close of the entry session. S4 enters on z_vrp; the marks show where its entries fell, not why they lost or won.
0.82·VIX − RV21 forward by calendar year
Calendar-year means of 0.82·VIX − RV21 forward, 2018-01-02 → 2025-03-24; 2025 YTD: 2025-01-02 → 2025-03-24, 55 sessions
| Year | Mean | Sessions | From | To |
|---|---|---|---|---|
| 2018 | −2.28 | 251 | 2018-01-02 | 2018-12-31 |
| 2019 | +1.45 | 252 | 2019-01-02 | 2019-12-31 |
| 2020 | −3.11 | 253 | 2020-01-02 | 2020-12-31 |
| 2021 | +3.33 | 252 | 2021-01-04 | 2021-12-31 |
| 2022 | −2.72 | 251 | 2022-01-03 | 2022-12-30 |
| 2023 | +1.28 | 250 | 2023-01-03 | 2023-12-29 |
| 2024 | +0.37 | 252 | 2024-01-02 | 2024-12-31 |
| 2025 YTD | −7.33 | 55 | 2025-01-02 | 2025-03-24 |
RV21 trailing: the root-mean-square SPX log return of the 21 sessions to the date, annualised (√252); RV21 forward: the same over the next 21 sessions, t+1 … t+21, the target of the forecast evaluation, so it ends 2026-09-29. VIX is a 30-calendar-day variance-swap rate that includes the skew premium, so VIX − RV overstates what an at-the-money straddle earns, and the backtest marks its straddles at 0.82·VIX for that reason. The 21-session windows overlap, so the shares and means are not counts of independent events, and no t-statistic is given. This is a description, not P&L: it does not explain the backtest’s result. The backtest window is shaded.
β = ATM vol / VIX · the chains behind it
M7 β drift · OK| Chain | Session | Rule regime | ATM 30d / VIX | Use |
|---|---|---|---|---|
| DB chain | 2026-03-24 | R2 | 0.824 | estimation |
| DB chain | 2026-03-27 | R2 | 0.841 | estimation |
| DB chain | 2026-05-29 | R1 | 0.813 | estimation |
| DB chain | 2026-06-18 | R1 | 0.814 | estimation |
| DB chain | 2026-10-16 | R2 | 0.702 | later, out of sample |
| DB chain | 2026-10-26 | R1 | 0.760 | later, out of sample |
| DB chain | 2026-10-27 | R1 | 0.777 | later, out of sample |
| DB chain | 2026-10-28 | R1 | 0.785 | later, out of sample |
| live capture | 2026-10-12 04:39 ET | — | 0.797 | estimation |
β = 0.82 = mean of 4 DB chains and 1 live capture (0.80–0.84); the first later chain, 2026-10-16, gives 0.70 — the mean over all 9 chains, 0.79, is not in the β grid. 30-day ATM-forward implied vol (Black-76 on put–call-parity forwards) over the same-time VIX; no ATM-IV history exists before 2026, so β is assumed constant over 2018–2025.
β sensitivity · the full backtest re-run at each β
| β | Portfolio | Sharpe | S1C contrarian | S3 short SPX straddle | S4 VRP | S1 PDV (ref) |
|---|---|---|---|---|---|---|
| 1.00 | −$183K | −0.91 | −$643K | +$397K | −$302K | +$2.5M |
| 0.90 | −$219K | −1.04 | −$570K | +$216K | −$302K | +$549K |
| 0.85 | −$222K | −1.00 | −$500K | +$112K | −$280K | −$69K |
| 0.82 ● | −$222K | −0.99 | −$454K | +$61K | −$274K | −$307K |
| 0.80 | −$211K | −0.88 | −$396K | +$26K | −$264K | −$444K |
| 0.78 | −$206K | −0.84 | −$358K | −$9K | −$250K | −$555K |
● this page's run (β = 0.82). The portfolio is negative at every β in the grid; S1's sign flips between 0.85 and 0.90.
Why the edge disappeared
Priced at β = 0.82 × VIX, S1 is −$307K (58% win), and its sign flips between β = 0.85 and 0.90. The contrarian inversion S1C is −$454K, so neither direction of the PDV-spread trade makes money. The portfolio is −22.2% cumulative (Sharpe −0.99, max drawdown −22.2%); S3 (+$61K, 49% win) is the only positive sleeve, positive for β ≥ 0.80 in the sensitivity grid, negative at 0.78; like every sleeve’s, its P&L is an excess return over T-bills (the hurdle is 0). Each sleeve’s sign at each β is in the β grid; what the β·VIX mark leaves of the premium, against realised vol, is in implied against realised.
Sleeve notes, stress windows and the C18 inversion
S3 short SPX straddle (index leg of a dispersion trade; no single-name leg) fires only at VIX/VVIX extremes: 39 trades in 2018–2025 (26 entries plus 13 rolls of a position held past its straddle's expiry), 49% win rate. Since C22 it is priced as the index leg of the dispersion trade (a short SPX straddle; there is no single-stock options data), and its entry timing does not beat 3,550 exposure-matched circular shifts at the 5% level (p = 0.078; Holm over 6 sleeves 0.47; 2,000 trade shuffles p = 0.057).
S1 PDV (ref), the PDV short-VRP reference strategy: 69 of 69 trades are short straddles sold in R1; worst trade −$183K (2018-01-09 → 2018-02-07). Selling straddles at the VIX books the skew premium as profit.
S1C contrarian flipped S1's direction on the premise that S1 lost both ways; C18 showed that premise was the bug. It stays a sleeve because the portfolio's composition is held fixed across correction rounds so they remain comparable. S4 VRP enters on z_vrp declining from a peak; its P&L on 2018–2025 is −$274K.
Stress windows, each measured from the close before it opens: COVID 2020 (2020-02-19 → 2020-04-30) −0.2%; FedHikes 2022 (2022-01-01 → 2022-12-31) +4.1%; Tariffs 2025 (2025-01-01 → 2025-03-24) −1.1%. The backtest ends 2025-03-24, so the April 2025 tariff shock is not in it, and this is no evidence of resilience to it.
The C16–C23 corrections, each with its root cause, fix, tests and effect, are on the Corrections page.
Limitations
- Option prices. All P&L is Black–Scholes on β·VIX; the database's 8 SPX chains (86,134 rows) are from 2026-03-24 to 2026-10-28.
- Breadth. S3 enters 26 times in 2018–2025.
- Execution. Costs are a flat assumption; no quote-level bid–ask in the window.
Historical change log, steps 1–8
| Step | Change | Before | After |
|---|---|---|---|
| 1 | Disable VIX options leg — JOINT_W3 = 0.0 (was 0.2). Attributed at the time to the Heston CIR density; C22 traced the 37.14 vol pts to a broken VIX put pricer, spot-VIX vegas and a stale chain, so it was not evidence about the model. | VIX-options leg in the objective with a broken pricer | SPX + VIX index objective; VIX-options leg off (too few sessions of quotes). |
| 2 | Vega-weighted anchor selection — Select 9 highest-BS-vega options per expiry (was log-uniform grid). Moneyness lo 0.70 (was 0.75). | Log-uniform includes low-information deep OTM options | Near-ATM anchors only. C22 reverted it: the top-vega strikes were adjacent ATM calls and the fit never saw the put wing; anchors are now a forward-moneyness z-grid with >= 3 wing puts per expiry. |
| 3 | SVI smoothing — never wired in; removed (C22) — SVI/SSVI helpers were written, but only tests called them: the calibrator always fitted the quotes directly. C22 removed them. | Claimed: Heston calibrated to an SSVI-smoothed surface | Calibrates to two-sided parity-forward Black-76 IVs; no smoothing step. |
| 4 | Per-date T-bill rate — ^IRX 3M T-bill from the DB replaces the fixed r = 0.045 in the backtest. | Fixed r = 0.045 throughout 2018–2025 | Per-date rate (annual mean, cc: 2018: 1.95%, 2023: 5.15%, 2025 YTD: 4.28%). |
| 5 | Adaptive VVIX threshold — Rolling 252-day 80th percentile of VVIX as R2 gate (was fixed 100). | R2 on 48.1% of backtest sessions with the fixed 100-point gate | R2 on 23.5% of backtest sessions. |
| 6 | Isotonic calibration + step sizing — CalibratedClassifierCV(FrozenEstimator(XGB), isotonic). S1S step: full/half/flat at P(R2) 0.4/0.6. | Raw XGB probabilities (overconfident). Linear 1−p scaling. | Calibrated probabilities. Cleaner 3-level position sizing. |
| 7 | Portfolio Kelly netting — Rolling 60-day pairwise P&L corr; mult = sqrt(2/(1+r_ij)). C16: multipliers shifted 1 day, applied to position size in a second simulation pass (ex-ante; contracts & costs reflect real size). | No correlation netting; each signal sizes off full NAV ÷ 4 | Ex-ante diversification sizing; no same-day information in sizing. |
| 8 | Monthly Heston recalibration — REMOVED (C17) — The C13 monthly-recalibration loop was dead code: no historical options data exists before the 2026 snapshots, so every monthly calibration fell back to static defaults — and the resulting parameters were never consumed by any P&L path. Removed in C17. | ASSUMPTIONS claimed time-varying Heston params in the backtest | Honest: backtest P&L is BS on VIX-TS ATM vol; the calibration stack serves C6 Greeks / C7 hedge sim, not C10 P&L. |
Research prototypes · not used for trading
ML regime classifier · research only
M11 classifier skill · BREACHresearch only Next-session forecast from the features of 2026-10-28: R1 at 89.1%. 74.9% out-of-sample, it loses to the 87.0% “predict-yesterday” baseline, so it is not used for trading.
- P(R0 long γ)
- 0.0%
- P(R1 short γ)
- 89.1%
- P(R2 vomma)
- 10.9%
- Out-of-sample accuracy:
- 74.9%
- Persistence baseline:
- 87.0%
- Features
- 5 (vvix excluded — C16); top
fear_premium(37%)
Why it is not used
Accuracy is the shipped model's own evaluation on 2020-01-02 → 2025-12-31 (1,508 sessions, adaptive-gate rule labels); its spread feature is the rv₂₀ proxy it was trained on. Regimes are persistent and observable on the day, so “predict yesterday's regime” is a strong no-skill baseline; C17 demoted the classifier when it lost to it and C22's retrain did not change that. The backtest trades the lagged rule labels; a Gaussian HMM in regime_classifier.py is research-only as well.
Rule-label distribution
Share of sessions under each rule label since 2010; the adaptive R2 gate is the only gate in every path (C22). The rule label, not the classifier, is what the backtest trades.