Appearance
H1 Regime Stress Test — deep e-mini parent history (Phase 2e)
H1 (pullback mean reversion) is the project's one graduated edge, but it graduated on the 2019+ micro window, which is a single secular bull regime (post-COVID recovery + AI boom). H1 is a long/flat 200-day-SMA dip-buyer — it can only be long or in cash — so its structural failure mode is a sustained downtrend that oscillates around the 200-SMA, generating repeated entries stopped out at the 10-bar time stop. Every episode of that kind before COVID sits outside the micro history, so it was never scored.
This is the Phase 2e "surgical step back": before spending live-adapter engineering on H1, run the single cheapest experiment that can break it — re-run H1's exact walk-forward on the full-size e-mini parents (ES/NQ), whose Databento GLBX history reaches 2010-06-06, a decade deeper than the micros. If H1 survives 2015-16 and 2018-Q4 out-of-sample, the edge earns real external validity; if it whipsaws through them, we learned in days — for a config change and $0.10 of daily bars — that the "one real edge" was a post-2019 bull artifact, instead of months of paper-trading infrastructure. Code: regime_stress.py.
Pre-registration. Hypothesis, method, the exact windows, and the pass bar below were written before the ES/NQ run. Only the Results / Verdict were filled afterward. Nothing in H1 changed — the signal, the 200-SMA gate, the 10-bar time stop, the grid, and the 1-tick slippage prior are the graduated config, re-pointed at deeper data.
Hypothesis
If H1's edge is structural short-horizon mean reversion inside an uptrend (the Phase 2c/2d thesis), it should survive out-of-sample on the same underlyings over a decade that contains genuine corrections and bear legs — the 2011 US-downgrade selloff, the 2015-16 correction, the 2018-Q4 selloff, the 2020 COVID crash, and the 2022 bear. If instead the graduated Sharpe was a post-2019 bull-regime artifact, the deeper out-of-sample record should degrade materially — most diagnostically in a slow-bleed regime, where a long/flat dip-buyer keeps buying oversold closes that keep falling.
Why the parents (proxy series)
The micros (MES/MNQ) launched 2019-05, so they cannot reach these regimes. The full-size e-mini parents trade the same underlying index and share the reversion structure, and Databento's GLBX.MDP3 carries them to 2010-06-06. They are added to config.MARKETS as role="proxy" markets — backtest-only (multiplier 50/20 vs the micros' 5/2; we still trade the micros), and excluded from the campaign lineup because the overlay candidates need per-symbol VIX/COT the parents don't carry. H1 needs neither: its 200-SMA gate is computed from the bars' own close (h1_trend_gate), so a parent needs no auxiliary series to score H1.
Method
Identical to H1's graduated walk-forward, re-pointed at the deep parent series:
- Signal / priors, unchanged: enter below the prior-N-day low inside the 200-day uptrend; exit on the prior-M-day high or the 10-bar time stop. N/M re-fit per split from the
PULLBACK_GRID(N∈{3,5,7}, M∈{3,5}); 200-SMA gate and 10-bar stop fixed. - Walk-forward: 504-bar train / 126-bar test, rolling, scored only on the stitched out-of-sample curve, 1-tick/side slippage debited in. With the deep history the first test window opens ~mid-2012 (a 504-bar train needs ~2 years before it), so the scored OOS span is ~2012 → 2026 — roughly triple the micro window, adding 2015-16 and 2018-Q4 as scored regimes.
- Data lineage: raw volume-rolled continuous daily bars, Panama back-adjusted at load, roll dates recovered from the per-contract
symbolcolumn (same as the micros). The splice is a genuine proxy — different contract/multiplier — so the back-adjustment carries the usual caveat that old absolute levels shift. - Reported for the deploy decision (Phase 2e additions, all reproducible in the harness): the OOS Sharpe with its bootstrap 90% CI; correlation and beta to buy-and-hold (H1 is conditional long equity, so how much of the edge is diluted long vs measured alpha); the close-vs-next-open fill sensitivity (
--fill); the 0/1/2-tick slippage sensitivity; and a per-regime sub-period breakdown — H1's return, max drawdown, and trade count through each named window, beside buy-and-hold over the same dates.
The one regime the walk-forward can't reach
The 2011 US-downgrade selloff sits ~14 months after the 2010-06 GLBX floor — too little for a 2-year train window before it — so it lands in the first, train-only split and is never scored out-of-sample. It is reported from the in-sample full-period run (clearly flagged), the only view that covers it. Reaching 2011/2008/2000 out-of-sample would need pre-2010 data below the Databento floor (free Stooq / ES=F, or Norgate ES-from-1997) — a follow-up, not this config-only step.
Pass bar (pre-register)
The deep-history OOS result passes if, on both ES and NQ, H1's stitched walk-forward Sharpe stays positive with its bootstrap 90% CI excluding 0, remains above buy-and-hold on the same span, and shows no regime in the sub-period breakdown where H1's drawdown blows out relative to the micro-era result (the slow-bleed failure mode). A material degradation — Sharpe collapsing toward 0, the CI spanning 0, or a stress window where the dip-buyer bleeds badly — is a documented negative that would move H1 back from "ready for paper" to "regime- fragile."
Evaluation protocol
sh
cd strategies
uv run python -m vibe_trader.data.databento_ingest --symbol ES --schema ohlcv-1d
uv run python -m vibe_trader.data.databento_ingest --symbol NQ --schema ohlcv-1d
uv run python -m vibe_trader.backtest.regime_stress --symbol ES,NQ --source databentoResults
Real-data run 2026-07-15, Databento GLBX daily bars 2010-06-07 → 2026-07-13 (4,995 bars each, Panama back-adjusted). Walk-forward 35 splits, stitched OOS 2012-01-23 → 2026-04-09 — ~3x the micro window, adding the 2015-16 correction and the 2018-Q4 selloff as scored regimes. Each parent runs on a US$1M account so 1 full-size contract carries the same leverage as 1 micro on US$100k: a full-size e-mini is 10x the micro multiplier (ES 50 vs MES 5), so sizing 1 contract on $100k would inflate the drawdown ~10x and is not comparable to the graduated micro result.
Walk-forward out-of-sample, H1 vs buy-and-hold, beside the graduated micro numbers (1-contract, 1-tick slippage, the honest deployable baseline):
| Metric (OOS, 1-tick slippage) | ES parent | MES micro | NQ parent | MNQ micro | |
|---|---|---|---|---|---|
| Scored span | 2012-2026 | 2020-2026 | 2012-2026 | 2020-2026 | |
| OOS Sharpe | 0.74 | 0.84 | 0.58 | 0.86 | |
| Sharpe 90% CI | [0.39, 1.10] | [0.34, 1.48] | [0.23, 0.95] | [0.31, 1.42] | |
| Buy-and-hold Sharpe (same span) | 0.56 | 0.55 | 0.51 | 0.36 | |
| Max drawdown | −2.3% | −2.8% | −4.9% | −4.9% | |
| Total return (vs B&H) | +17.7% (+25.3%) | +10.5% (+12.7%) | +24.8% (+37.7%) | +20.5% (+14.7%) | |
| Corr / beta to buy-and-hold | 0.47 / 0.25 | 0.50 / 0.27 | 0.48 / 0.29 | 0.49 / 0.27 | |
| Next-open-fill Sharpe | 0.73 | 0.80 | 0.57 | 0.82 | |
| Trades / exposure | 160 / 24% | 71 / 30% | 163 / 25% | 66 / 27% |
Per stress regime, out-of-sample — H1 return / max-drawdown vs buy-and-hold's return over each window. Levels are small because exposure is ~25% and the account is matched-leverage; compare H1's return to buy-and-hold's over the same window:
| Regime | ES H1 ret / maxDD | ES B&H ret | NQ H1 ret / maxDD | NQ B&H ret | |
|---|---|---|---|---|---|
| 2015-16 correction | +0.0% / −0.4% | −0.7% | −0.6% / −1.0% | −0.7% | |
| 2018-Q4 selloff | −0.1% / −0.3% | −1.7% | −0.5% / −1.1% | −2.2% | |
| 2020 COVID crash | −1.2% / −2.2% | −2.4% | −1.2% / −2.4% | −1.8% | |
| 2022 bear market | −0.8% / −1.3% | −4.1% | −2.6% / −3.4% | −10.1% |
In every scored OOS window H1's return beats buy-and-hold's on both symbols — the 200-SMA filter keeps it out of the worst of each downtrend. It still posts a small absolute loss in each (it is a dip-buyer, not a hedge), but it does not lose more than buy-and-hold in any scored window.
2011 (in-sample only — it lands in the first, train-only split): H1 −0.9% / −1.0% (ES), −0.5% / −0.7% (NQ) vs a shallow buy-and-hold −0.3% / −0.2%. This is the one window where H1 loses more than buy-and-hold — a fast round-trip selloff whipsawed repeated dip-buys while buy-and-hold simply rode it out. It is the whipsaw failure mode the review predicted, but it surfaces only here, in-sample, and small.
Reading
The edge survives — but the deep history right-sizes the confidence the micro window inflated. Three things hold; three temper.
Holds up:
- Positive and significant on both symbols, across a decade the micros never saw: OOS Sharpe 0.74 (ES) / 0.58 (NQ), both bootstrap CIs exclude 0, both above buy-and-hold on the same span. H1 is not a post-2019 bull artifact.
- Drawdown at matched leverage stays modest — ES −2.3% (≈ micro −2.8%), NQ −4.9% (= micro −4.9%). The low-drawdown profile is real (H1 is mostly in cash), not a regime illusion.
- Fill realism holds at depth — next-open Sharpe 0.73 / 0.57 ≈ the close-fill 0.74 / 0.58 over ~320 OOS trades, the same reassurance the micro window gave.
Tempers the graduation:
- The Sharpe edge is materially thinner over a full cycle: 0.84 → 0.74 (ES), 0.86 → 0.58 (NQ). The graduated numbers were the top of the range.
- The margin over buy-and-hold collapses. The micro headline had H1 crushing buy-and-hold (0.86 vs 0.36 on MNQ); on the full NQ cycle it is 0.58 vs 0.51 — a slim edge. Much of the micro-era outperformance was buy-and-hold's own 2022 drawdown sitting inside the 2020-2026 window, not H1 alpha.
- The whipsaw failure mode is real, but mild and mostly in-sample. H1 is not immune to downtrends — it posts a small absolute loss in every stress window (the dip-buyer buys in and takes some losing trades). But the 200-SMA filter earned its keep: in every scored OOS stress window it still lost less than buy-and-hold on both symbols, so the low-relative-drawdown property largely holds on deep history. The failure mode — H1 losing more than the market — surfaces only in the in-sample-only 2011 whipsaw. So this tempers the story less than the thinner Sharpe does; the caution is that sizing up (as the graduation did on MES) would scale the absolute losing trades too.
H1 also trails buy-and-hold on absolute return on both parents (ES +17.7% vs +25.3%; NQ +24.8% vs +37.7%) at ~25% exposure, beta ~0.25-0.29 — so the Sharpe edge is largely a lower-volatility / idle-cash effect. This is measured conditional long equity, not a large independent alpha.
Verdict — qualified pass; the surgical step-back paid for itself
H1 clears the pre-registered deep-history bar on both ES and NQ: positive OOS Sharpe with a CI excluding 0, above buy-and-hold, and no drawdown blow-up at matched leverage. The edge is real and worth keeping — not the regime artifact the null feared. But the deep history shows the graduated micro numbers (sized Sharpe 1.05 / unsized 0.84 on MES, 0.86 on MNQ, "drawdown < half buy-and-hold") were the flattering end of the distribution: over a full cycle the edge is a thinner ~0.6-0.75 Sharpe and only slightly ahead of buy-and-hold (whose own Sharpe is higher across 2012-2026 than in the 2020-2026 window that flattered the micro result). The dip-buyer's whipsaw risk is real but stayed mild and in-sample here.
Answering the Phase 2e question (go / step back / in between): the step-back was correct, and it paid for itself. For ~$0.10 of daily bars and a day of compute we learned that H1 is deployable with calibrated expectations — a modest, honestly- positive, low-exposure long-biased reversion sleeve to be sized and monitored for a real drawdown in the next sustained downtrend, not the 1.05-Sharpe, 2.8%-drawdown, buy-and-hold-crushing edge the micro window advertised. That is a sounder footing to take H1 toward paper trading on — and a far cheaper thing to learn now than after building the live adapter. Recorded in the ledger as "H1 regime stress — qualified pass".
What this does not settle. The pre-2010 regimes (2008, 2000) sit below the Databento GLBX floor and remain untested — reaching them needs a second data source (free Stooq / ES=F, or Norgate ES-from-1997). And cross-asset generality (does the reversion edge exist off equity indices?) is untouched. Both are deliberate follow-ups, not part of this config-only step.