← Lab
S010

Put-selling on capitulation with a market-vol-regime filter

put-selling-capitulation-volregime-filter-v1
failed Stage 1 (Quick-screen) — near-miss, 6 of 7 gates passed 2026-05-31
Share: Twitter / X LinkedIn
Proxy P&L curve — S010
max drawdown -10% · 1.0x = start
1.0x8.6x2016201820202022202420262016-03
Proxy premium (BS/RV model, not real option marks); capped equal-weight book, P&L booked at exit.
-17.1%-9.4%-1.7%+6.0%+13.8% 3,4390 Per-trade EV (% of notional) — S008B signal + volregime-calm filter EV per trade
Gate +0.40% Observed mean +1.17%
Per-trade EV (% of notional) — S008B signal + volregime-calm filter · n=11,467
-17.1%-9.4%-1.7%+6.0%+13.8% 3,4390 Per-event excess return vs benchmark — S010 excess return per event (name − benchmark, over the hold window) · dashed line = zero
gate
Per-event excess return vs benchmark — S010

ID: S010 Slug: put-selling-capitulation-volregime-filter-v1 Failed at: Stage 1 (Quick-screen) — near-miss, 6 of 7 gates passed Fail reason: robustness Date: 2026-05-31 Lineage: Third follow-up to S008. S008 failed at year-concentration (2022 disaster). S009 (defined-risk spread) cut on edge inversion. S010 keeps S008's naked-put structure but adds an ex-ante regime filter: only fire when SPY's own 20-day realized vol is below its trailing-252-day median.

What we tested

S008 Variant B's signal (multi-day capitulation in an uptrend) plus S008's exact naked-put trade structure (sell 93%-strike put, 45 DTE, 25%/50% take-profit, force-close day 21, $1.30 commission + 5% slippage). The only addition: a filter that only fires the signal on days when SPY's own 20-day realized volatility is below its trailing 12-month median. The intuition: the disasters that killed S008 (2022 rate-shock, 2020 March crash for Variant A) all occurred during regimes where SPY's vol was rising into elevated territory; those regimes are identifiable in real time from market data alone.

The filter operationalises on realized vol rather than VIX directly (realized vol correlates ~0.95 with VIX, requires no new data ingest, and is by construction point-in-time-clean). Pre-registered gates are identical to S008 Variant B since the trade structure is unchanged — only the signal subset differs.

The filter removed roughly half of the candidate signal days (49.8% of SPY days were "calm-regime" by this metric). S008 Variant B's 24,200 unfiltered signals became 11,704 filtered signals. Sample size remained comfortably above the 400 minimum.

What we found

The strategy was within striking distance of a clean Stage 1 pass.

Criterion We needed We got
Mean per-trade EV (% of notional) ≥ +0.40% +1.16%
Win rate ≥ 82% 87.5%
Welch p<0.05 AND mean>0 yes p=0.0000, mean +1.16%
Sample size ≥ 400 11,467
Effect in both sample halves both > 0 h1 +1.36%, h2 +0.97%
Year concentration ≤ 30% 42.0% (2021)
Ticker concentration ≤ 5% 0.4% (AXON)

The dollar P/L tells the comparison-with-prior-runs story:

Year S008 (no filter) S010 (volregime filter) Delta
2016 +$45,600 +$38,938 -$6,662
2017 +$120,586 +$88,267 -$32,319
2018 +$141,248 −$4,099 -$145,347
2019 +$74,194 +$32,305 -$41,889
2020 +$40,453 +$48,331 +$7,878
2021 +$185,588 +$435,075 +$249,487
2022 −$2,837,344 +$11,430 +$2,848,774
2023 +$153,621 +$133,477 -$20,144
2024 +$421,052 +$160,048 -$261,004
2025 +$119,463 +$70,017 -$49,446
2026 +$186,009 +$22,855 -$163,154
Total −$1,349,530 +$1,036,644 +$2,386,174

The filter did exactly what it was supposed to do: 2022's $2.8M disaster turned into a $11K small win. The strategy moves from losing $1.3M over 11 years to making $1.0M over the same 11 years — a $2.4M swing entirely on the back of avoiding one bad year.

What we learned

The filter works. This is the cleanest "the setup-mechanic test worked" result in the S008 series. The intuition "don't sell vol when market vol is rising" was operationalised into a simple, PIT-clean filter, applied to a known-positive-edge signal, and the result is positive realized capital with strong per-trade statistics. The 2022 disaster was foreseeable from market data alone.

But year-concentration shifted, didn't disappear. Removing 2022's big loss naturally makes other years more important to the total. 2021 produced $435K of the $1.04M total — 42%, just over the 30% pre-registered gate. The mechanism is mathematical (when the catastrophic year is removed, the remaining years account for a larger share each) rather than a strategy failure.

The 30% gate may be too strict for filter-based setups. When the filter's whole purpose is to exclude bad years, the surviving year-by-year distribution will naturally be top-heavy in the remaining good years. A 30% gate is appropriate for unfiltered strategies where every year is a fair sample; it may be over-strict for filter-based setups. This is a pre-registration-design observation, not a basis for waiving the gate — the gate is FROZEN and S010 is formally cut. But it informs the design of future filter-based pre-registrations.

Variant A wasn't tested under this filter. S008 Variant A (intraday capitulation) failed on structural grounds (sign-flip across halves). The volregime filter might rehabilitate it — most of Variant A's 2020 disaster ($4.6M loss) would be filtered out (March-April 2020 was extreme high-vol regime). If you want to explore that, it would be a new pre-registration (S012+).

Half-2 is positive but slightly weaker than half-1. h1 +1.36%, h2 +0.97%. The strategy's edge is real in both periods but the later years are slightly less generous. Could be coincidence (small-sample variation) or could indicate the underlying short-vol premium is decaying as more retail flow enters short-vol strategies post-2020. Worth watching in Stage 2 if a v2 of this setup is pre-registered.

What this doesn't tell us yet

  1. A v2 with a tighter calm-regime threshold could pass. If we required spy_rv_20d < 0.85 × trailing_median (15% inside the median) instead of strictly below the median, fewer signals would fire but they'd be in genuinely-calm regimes. Could redistribute year-by-year more evenly. Would require new pre-registration.
  2. A v2 combined with risk-weighted sizing might pass. S011 (running next in this session) tests notional sizing that caps per-trade worst-case loss. Combining the volregime filter with risk-weighted sizing would address two failure modes of S008 simultaneously. If both S010 and S011 show partial improvement, the combination is a natural S012 candidate.
  3. A different concentration metric would change the read. If the gate were "no single year > 50% of net" instead of 30%, S010 passes. That's a gate-design point for future filter-based setups; for this setup the 30% gate was pre-registered and stands.

What happens next

S010 is formally cut. The setup is closed under this pre-registration.

The qualitative read is the most important takeaway from the S008 series so far: the underlying signal (multi-day capitulation in uptrends) + market-vol-regime filter produces positive realized capital over 11 years with strong per-trade statistics. The single 30% concentration check is what's keeping it from being a Stage 1 survivor.

Three plausible follow-ups (each a new H-NNN pre-registration):

The right move depends on how much runway the lab gives this lineage vs. moving to a different idea entirely.

For the specialist — methodology details (click to expand)

Filter definition (computed once on SPY, applied per signal day)

spy_log_ret[t] = log(close_SPY[t] / close_SPY[t-1])
spy_rv_20d[t] = std(spy_log_ret[t-20:t-1]) × √252 (trailing, exclusive of day t)
spy_rv_med_252d[t] = median(spy_rv_20d[t-252:t-1]) (trailing 12-month median, exclusive)
volregime_calm[t] = spy_rv_20d[t] < spy_rv_med_252d[t]

Signal: S008 Variant B + filter

  • All S008 Variant B conditions (close > sma_200, rv_rank_252 ≥ 0.30, cumret_15d ∈ [−0.15, −0.08], decelerating, NOT also Variant A, ≥ 90d history, PIT-eligible)
  • AND volregime_calm[t] == True

Trade structure: identical to S008

Naked short put, strike = entry × 0.93, 45 DTE, BS-priced at implied volatility (IV) = realised volatility (RV)-30 × 1.15. Exit priority: quick-take 25% by day 7 → profit-take 50% any day → force-close day 21 (assignment if underlying ≤ strike). Friction: $1.30 round-trip + 5% slippage on remaining premium.

Pre-registered gate (FROZEN 2026-05-31, same as S008 Variant B since trade structure is identical)

mean_ev_pct_notional ≥ +0.40%
win_rate ≥ 82%
welch_p<0.05 AND mean>0 (direction-aware, on per-trade EV % notional)
n_signals ≥ 400
half1_mean > 0 AND half2_mean > 0 (split at median signal date)
max_year_share ≤ 30%
max_ticker_share ≤ 5%

Detailed numbers

  • SPY days with both rv_20d and rv_med_252d computed: 2,867
  • Calm-regime days (volregime_calm = True): 1,428 (49.8% of SPY days)
  • S008B unfiltered signals: 24,200 → filtered to 11,704 (48.4% retention)
  • Trades simulated: 11,467 (after dropping insufficient-forward-history)
  • Mean per-trade EV: +1.165%
  • Win rate: 87.5%
  • Welch 1-sample p (EV vs 0): 0.0000, mean positive
  • Half-1: mean EV +1.362% (n ~ 5,700)
  • Half-2: mean EV +0.965% (n ~ 5,700)
  • 2022 dollar P/L: +$11,430 (vs S008's −$2,837,344) — filter worked
  • 2021 dollar P/L: +$435,075 (42.0% of total) — new concentration point
  • Net total realized dollar P/L: +$1,036,644 (vs S008's −$1,349,530)
  • Top ticker share: AXON at 0.4%
  • Cross-check at RV-rank ≥ 0.50: n=8,156, mean EV +1.362%, win 88.1% — stricter vol-rank gives larger per-trade edge as expected

Look-ahead-bias audit

Identical to S008. Filter-specific check: SPY rv_20d uses .shift(1).rolling(20) (day t never in own window); 252d median uses .shift(1).rolling(252) (today's regime determination based only on past data through yesterday's close). PIT-clean by construction.

Artifacts

  • Trades: the internal record (11,467 rows)
  • Summary JSON: stage1_summary.json in same directory
  • Histogram bins: chart_data.json in same directory
  • Driver script: the internal record
  • Pre-registered gates: lab/setups/gates.md §put-selling-capitulation-volregime-filter-v1
  • Setup spec: lab/setups/put-selling-capitulation-volregime-filter-v1.md

Stage 1 ran 2026-05-31. Pre-registered gates frozen earlier the same day before the test executed. No gates were adjusted post-hoc despite the 6-of-7-pass near-miss.

← OlderPut-selling on dips, gated by the market's vol regime Newer →Put-selling on dips, sized by downside risk

Mechaniq provides information, not investment advice. We do not execute trades. Past results are no guarantee for future performance. You are solely responsible for your trading decisions.

Lab · Methodology · Greeks Lab · About · FAQ · Glossary · Privacy · Terms · mechaniq.trade © 2026

21 Aug 2026, 09:07