Appearance
Phase 2: Strategy Development
Phase 2 turns the data-source research into a working research-and-backtest platform. Code lives in strategies/ at the repo root.
Decisions
| Decision | Choice | Rationale |
|---|---|---|
| First market | MES / MNQ | Deepest liquidity of the 14 targets, richest free auxiliary data (VIX family, COT TFF, macro calendar) |
| Style | Swing, 1–10 day holds | Backtests on daily bars; the US$2.74 round-trip cost is negligible at swing P&L scale; no depth data required |
| Engine | NautilusTrader (1.221) | Event-driven, same strategy code for backtest and live; native Databento adapter for the eventual live path |
| Market data | Databento GLBX.MDP3 | The catalog's primary price-history pick; continuous-contract symbology (MES.v.0), usage-based pricing |
| Tooling | Python 3.11 + uv | Standard quant ecosystem |
What exists now
- Instrument model — continuous-contract futures instruments (
MES.GLBX) with correct tick size/multiplier; rolls handled in data, not simulation. - Execution-cost model — Wealthsimple fees charged per contract per side (US$1.00 commission + ~$0.37 pass-throughs, see broker constraints) via Nautilus
PerContractFeeModel. - Data pipeline — Databento ingest (raw volume-rolled daily bars → parquet; Panama back-adjustment at load time), CFTC COT (TFF) and Cboe VIX-family loaders persisting to the same cache, structural bar validation after each refresh, and deterministic synthetic data for offline testing. All refreshed weekly into R2 by the workflow.
- Feature layer —
vibe_trader.features: VIX regime (trailing-percentile), VIX term structure (VIX9D/VIX3M ratio), a 200-day trend filter, and COT positioning z-scores, all joined to daily bars through one join with publication timing respected (VIX/term/trend same-day; COT visible only from its Friday release, 3 days after the Tuesday reference). - Evaluation harness — a candidate registry that drives a two-symbol comparison (
--symbol MES,MNQ) in one command; daily mark-to-market metrics (CAGR, Sharpe, Sortino, drawdown, win rate, profit factor, fee drag, exposure); buy-and-hold + theSwingBreakoutbaseline through the identical engine; rolling walk-forward (params fit per 504-bar train window, scored only on the stitched 126-bar out-of-sample windows); a moving-block bootstrap 90% CI on OOS Sharpe; and post-hoc roll-cost and peak-margin-utilization columns. Phase 2d added vol/margin position sizing (per-cycle quantity, margin + roll cost quantity-aware), explicit slippage debited into the scored curve (--slippage-ticks, with a 0/1/2-tick sensitivity table), and an hourly-bar evaluate path (--bars 1h, mark hourly then resample to daily closes for scoring) — all default-off so the Phase 2b/2c numbers reproduce. Phase 2e added a next-bar-open fill as a scored code path (--fill next_open, with a close-vs-next_open sensitivity block), correlation/beta-to-benchmark columns, and a deep-history regime-stress harness (regime_stress) that re-runs the graduated edge on the ES/NQ e-mini parents. - Strategies — the long-only 20/10 Donchian
SwingBreakoutbaseline every candidate must beat, plus the Phase 2c campaign: VIX-regime breakout, pullback mean reversion (H1), VIX term structure (H2), COT positioning (H3), and turn-of-month (H4); and the Phase 2d follow-ups: the H1 graduation (sized + slippage) and the hourly pullback campaign (H5, H6) — all recorded in the ledger below. - Live / paper forward-testing stack (Phase 2g) — the
vibe_trader.livepackage plus feature transport v2: the daily trend gate + VIX-stress latch published as custom NautilusDataon the message bus (a gated backtest through the transport reproduces the date-map results to the bar — the deferred Phase 2d workstream 3, now green); a calendar-aware, half-day-safe session scheduler; an append-only paper ledger (intended-vs-filled slippage as a first-class number, restart-safe); a replay-driven paper runner that drives the same registered strategy code through the same engine (signal parity structural); staleness/heartbeat ops guards; a live-vs-cache consistency cross-check; the pre-registered paper stack (H1 core on MES+MNQ, stress-exit shadow on MES, overnight MNQ sleeve, FOMC sleeve both symbols); and a monitoring/attribution view (per-stream P&L, slippage-vs-prior, signal parity, cross-sleeve correlation, blend tracking of the judge's ~0.92→~1.14 stack, event counters). All offline-tested against replayed/synthetic data; the live feed needs owner-provisioned Databento credentials. - Tests + CI —
uv run pytestruns the whole suite offline (synthetic data, no keys); a GitHub Actions workflow runs it on every PR touchingstrategies/.
Candidate ledger
Every hypothesis pushed through the evaluation loop lands here — one row per candidate ever tested, pass or fail — so the record of what was tried (and how many bets were placed) stays honest against multiple-testing. A candidate earns a pass only if its stitched walk-forward out-of-sample result beats both buy-and-hold and the re-fit swing_breakout baseline on Sharpe, on both MES and MNQ, with its bootstrap 90% Sharpe CI excluding 0 and no materially worse drawdown than buy-and-hold. Testing two orientations of one idea counts as two rows.
| Candidate | Note | Symbols | Verdict | Date |
|---|---|---|---|---|
| VIX-regime breakout | note | MES | ❌ fail — gate hurt on every axis OOS (Sharpe −0.42 vs baseline −0.07 vs buy-and-hold +0.55) | 2026-07-13 |
| Pullback mean reversion (H1) | note | MES, MNQ | ✅ pass — OOS Sharpe 0.85 / 0.86 beats baseline (−0.07 / −0.01) and buy-and-hold (0.55 / 0.37); CI excludes 0; drawdown < half buy-and-hold | 2026-07-14 |
| VIX term structure — resolution trigger (H2 v1) | note | MES, MNQ | ❌ fail — MES OOS Sharpe 0.36 < buy-and-hold 0.55, CI includes 0 (passes MNQ only) | 2026-07-14 |
| VIX term structure — inversion gate on H1 (H2 v2) | note | MES, MNQ | ⚠️ pass (bar) / no edge — clears the bar (0.82 / 0.61) but below H1 (0.85 / 0.86); the inversion veto subtracts value | 2026-07-14 |
| COT positioning — contrarian crowding veto on H1 (H3) | note | MES, MNQ | ⚠️ pass (bar) / no edge — clears the bar (0.77 / 0.88) ≈ H1 (0.85 / 0.86); crowding fires ~3% of days, effect within noise | 2026-07-14 |
| Turn-of-month (H4) | note | MES, MNQ | ❌ fail — OOS Sharpe −0.14 / −0.25 (negative, CI includes 0); the documented anomaly doesn't survive fees OOS | 2026-07-14 |
| H1 graduation — sized + slippage | note | MES, MNQ | ✅ pass (graduated) — with vol/margin sizing + 1-tick slippage, OOS Sharpe 1.05 / 0.86 beats buy-and-hold (0.55 / 0.36), CI excludes 0, drawdown < half buy-and-hold; sizing lifts MES (0.85→1.05), MNQ floors to 1 contract | 2026-07-14 |
| Hourly execution of daily pullback (H5) | note | MES, MNQ | ❌ fail — OOS Sharpe 0.33 / 0.45 below the re-fit baseline (0.47 / 0.66), CI includes 0, far below daily H1 (0.85 / 0.86); reacting intraday is worse than the daily close | 2026-07-15 |
| Native hourly pullback reversion (H6) | note | MES, MNQ | ❌ fail — OOS Sharpe 0.30 / 0.53 below the re-fit baseline (0.47 / 0.66), MES CI includes 0, far below daily H1; reversion is a daily-horizon edge, not intra-week | 2026-07-15 |
| H1 regime stress — deep e-mini parents (Phase 2e) | note | ES, NQ (proxies) | ⚠️ qualified pass — edge survives deep OOS (Sharpe 0.74 / 0.58, CI excludes 0, beats buy-and-hold in every scored stress window, drawdown modest at matched leverage) but is thinner than the micro window (0.84 / 0.86) and the margin over buy-and-hold collapses (NQ 0.58 vs 0.51); whipsaw failure mode mild, in-sample-2011 only | 2026-07-15 |
Stress-exit pullback (2f i_stress_exit) | note | MES, MNQ, ES, NQ | ⭐ finalist / borderline — VIX-latched exit improves 3 of 4 spans (MES 1.06 vs 0.84, ES 0.77, NQ 0.60) with risk never worse, but MNQ degrades (0.76 vs 0.86) and fleet-wide it's a wash; registered, forward-validate on MES | 2026-07-16 |
Dip-provenance sizing (2f i_dip_provenance) | 2f note | MES, MNQ | ❌ shelved — MES active-stream alpha real (1.00; 0.95 vs 0.84), MNQ gain is leverage-not-alpha (active 0.56 vs 0.86, deeper maxDD) | 2026-07-16 |
| Volume-capitulation sizing (2f) | 2f note | MES, MNQ, ES, NQ | ❌ fail — headline 0.93/0.88 lives entirely in the final OOS window; ex-window underperforms H1 on both micros; deep-history increment negative | 2026-07-16 |
ATR-target exit (2f i_vol_target_exit) | 2f note | MES, MNQ | ❌ fail — 0.79/0.83 < H1; static entry-anchored vol targets are procyclically demanding (time-stops 26%→37%) | 2026-07-16 |
| Long/short pullback — SMA mirror (2f) | 2f note | MES, MNQ | ❌ fail — 0.67/0.71; shorts earn ~0 at higher variance; SMA lags bear→bull turns; shared grid poisons long selection | 2026-07-16 |
ATR-depth entry (2f i_atr_dip_entry) | 2f note | MES, MNQ | ❌ fail — 0.31/0.50, CIs span 0; selectivity starves the breadth H1's edge lives on | 2026-07-16 |
Below-trend dip long (2f i_bear_dip_long) | 2f note | MES, MNQ, ES, NQ | ❌ fail — 0.29/0.12 (0.24/0.40 deep); bear dips carry positive mean at 1.6-1.8× vol — thinner risk-adjusted everywhere | 2026-07-16 |
| Term-structure-clock shorts (2f) | 2f note | MES, MNQ, ES, NQ | ❌ fail — −0.19/0.10 (−0.22/−0.11); VIX9D/VIX3M inversion marks spike-stress (V-recovery days), not grind-bears | 2026-07-16 |
Hourly momentum sleeve (2f hourly_momentum) | 2f note | MES, MNQ (1h) | ⭐ finalist (MNQ) — the untuned baseline as a sleeve: MNQ 0.66 CI [0.14, 1.16], corr-to-H1 0.28, 50/50 blend Sharpe 0.95 vs H1-alone 0.86; MES leg 0.47 with CI spanning 0; registered | 2026-07-16 |
| Trend-gated slow hourly breakout (2f) | 2f note | MES, MNQ (1h) | ❌ fail — 0.09/−0.02; bounds the momentum edge to ≤ ~1 CME day: slowing channels to cut fees kills the signal | 2026-07-16 |
| Fast symmetric hourly Donchian (2f) | 2f note | MES, MNQ (1h) | ❌ fail — −0.32/−0.23 even at zero slippage; hourly momentum is long-only-and-unstopped or nothing | 2026-07-16 |
Bear rally fade (2f n_bear_rally_fade) | 2f note | MES, MNQ | ❌ fail — −0.34/0.01; perfect complementarity (zero same-day overlap with H1 in 5.25y) but no edge to fill the slot | 2026-07-16 |
| VIX spike-reclaim long (2f) | 2f note | MES, MNQ, ES, NQ | ❌ fail — MES 0.51 CI [0.16, 1.05] is real but the mechanism inverted: all profit in H1's above-SMA regime, below-SMA legs lose; blends a wash | 2026-07-16 |
Cross-asset TSMOM (2f n_xasset_tsmom) | 2f note | MCL, QO, BZ | ❌ fail — 0.45/0.22/0.02, no CI clears 0; caveat: cold-start windows can't express 100-200-day channels, so slow trend was handicapped, not falsified | 2026-07-16 |
Cross-asset pullback (2f n_xasset_pullback) | 2f note | MCL, QO, BZ | ❌ fail — H1's machinery frozen, market varied: QO 0.19 / BZ 0.06 over 12-14y; H1's reversion does not transport off equity indices | 2026-07-16 |
| FOMC pre-drift, daily (2f) | 2f note | MES, MNQ, ES, NQ | ❌ fail — 0.17/0.04 (0.27/0.27 on 16y of parent events); direction matches the literature, never significant — daily bars bundle drift with the post-2pm reaction | 2026-07-16 |
COT flow, standalone (2f n_cot_flow) | 2f note | MES, MNQ, ES, NQ | ❌ fail — 0.10/0.08 (−0.02/−0.06 deep); COT/TFF on equity indexes now fully falsified (level as gate, flow as signal) | 2026-07-16 |
Overnight session hold (2f overnight_drift) | 2f note | MES, MNQ (1h) | ⭐ finalist (MNQ) — the campaign's only CI-verified non-H1 edge: MNQ 0.83, CI [0.33, 1.36], slippage-robust after 2.5% fee drag, premium unconditional ("always" won 25/26 windows); MES leg fee-destroyed (0.45, gross 0.67 → 0.22 at 2 ticks) — registered, paper-trade MNQ only | 2026-07-16 |
FOMC pre-drift, hourly (2f fomc_hourly) | 2f note | MES, MNQ (1h) | ⭐ finalist (power-bound) — 0.58/0.54 with CIs spanning 0 at 42 events; most orthogonal stream found (corr-to-H1 0.04/0.13), PF ~1.9; pre-13:00-ET exit halved per-event noise vs the failed daily variant; registered, accumulate events live/paper | 2026-07-16 |
CPI pre-release drift, hourly (2g cpi_hourly) | note | MES, MNQ (1h) | ❌ fail — OOS 0.33/0.42, CIs include 0 ([−0.12, 0.83] / [−0.05, 0.89]), below the re-fit baseline (0.47/0.66) and ≈ buy-and-hold (0.47/0.42); PF 1.55/1.72, corr-to-H1 0.06/0.08 over ~62 OOS events; slippage-robust but direction-only, not significant | 2026-07-18 |
NFP pre-release drift, hourly (2g nfp_hourly) | note | MES, MNQ (1h) | ❌ fail — OOS −0.28/−0.40 (negative), PF 0.79/0.72, CIs include 0; the pre-release drift does not exist for NFP — the announcement premium is on-day, not pre-release, exactly as pre-registered | 2026-07-18 |
FOMC pre-drift, hourly — parent backfill (2g fomc_hourly) | note | ES, NQ (1h, proxies) | ✅ CI-verified on deep parents — the $1.90 ES/NQ hourly backfill settled rank 3: OOS 0.66 (ES) / 0.47 (NQ), both bootstrap CIs exclude 0 ([0.29, 1.02] / [0.10, 0.89]) at ~115 events (vs 42 power-bound on the micros), corr-to-H1 0.04/0.14, PF 2.48/1.99, slippage-robust; below buy-and-hold's own high Sharpe (0.70/0.75) in this bull span, so a diversifier not a bh-beater; NQ maxDD −0.22 | 2026-07-18 |
Phase 2c retro
What the campaign found. Seven candidates through the full pre-registered protocol (ledger above):
- H1 pullback mean reversion is the one real edge. It clears the bar on both MES and MNQ (OOS Sharpe 0.85 / 0.86 vs the re-fit baseline ≈ 0 and buy-and-hold 0.55 / 0.37), its bootstrap 90% CI excludes 0, and its drawdown is less than half buy-and-hold's — robust across four walk-forward windows and every bootstrap setting tried. Fading new lows inside an uptrend works where chasing new highs (the Phase 2b breakout) did not.
- Auxiliary regime/positioning overlays add no edge. The VIX level gate (Phase 2b) hurt; the VIX term-structure trigger fails outright, and both the term-structure inversion gate and the COT crowding veto only inherit H1 while the overlay itself is net-negative-to-neutral. The recurring mechanism: vetoing entries during stress removes exactly the bounces mean reversion pays best on.
- A famous anomaly, calibrated. H4 turn-of-month — a well-documented seasonal, run as a harness calibration probe — also fails (OOS Sharpe −0.14 / −0.25, negative, CIs spanning 0): the effect doesn't survive fees on 2019–2026 daily bars. The useful part is that the harness gave a known name a fair, pre-registered test and returned "no edge" rather than rubber- stamping it.
What that implies. The edge on MES/MNQ daily bars is structural short-horizon mean reversion, not any regime or positioning filter. Three independent overlays (VIX level, VIX term structure, COT positioning) each failed to add value — strong evidence that stacking more macro/positioning gates on daily bars is low-yield. H1's lone fixed prior, the 200-day trend filter, earns its place purely as drawdown control, not as alpha.
Recommended Phase 2d direction (recommendation only — the call is the owner's):
- Consolidate and size the one working edge (H1). It is capital-light (~2.8% margin utilization, ~28% exposure at 1 contract), so the highest- value next step is finishing roadmap item 4 for a candidate that actually passed: multi-contract sizing to a vol/margin budget, realistic fills/slippage beyond the flat fee, and moving the backtest-only feature transport onto the live message bus.
- Test breadth, not more overlays. Whether the pullback structure generalizes is the open question. Prefer the already-cached hourly bars first (finer mean-reversion entries on the same two symbols, zero new ingestion). A universe expansion to the metals/energy micros (new ingestion + new fee/margin constants) would test whether the edge is equity-specific or a general reversion phenomenon — a larger, owner-level call because of the new data and constants it requires.
Explicitly not recommended: more macro/positioning overlays on daily bars. Three independent failures make that the lowest-yield direction.
Phase 2d retro
Phase 2d executed the Phase 2c recommendation: deepen the one edge that passed, then test its breadth on the bars we already own. No new markets, no new overlays. Three judged runs (all in the ledger):
- H1 graduated. Under vol/margin position sizing and 1-tick slippage — both fixed priors — the graduation re-run clears the bar on both symbols: OOS Sharpe 1.05 (MES) / 0.86 (MNQ) still beats buy-and-hold (0.55 / 0.36), CIs still exclude 0, drawdown still less than half buy-and-hold's. On MES the sizer improves risk-adjusted return (0.85 → 1.05) by deploying ~2–3× capital at the same drawdown fraction; on MNQ the vol target correctly floors to 1 contract on a US$100k account. Slippage is a non-event at H1's trade count (Sharpe moves ≤0.03 across 0/1/2 ticks). The Phase 2c pass was not an artifact of ignoring size or cost.
- Hourly execution (H5) added nothing. Entering intraday at the first prior-low breach, rather than at the daily close, scored OOS Sharpe 0.33 / 0.45 — below the re-fit breakout baseline on both symbols, CIs including 0, far below daily H1. Reacting hours earlier is not neutral, it is worse: the daily-close confirmation filters out intraday breaches that revert less reliably, so it is part of the edge, not a lag to shave.
- Hourly signals (H6) added nothing. Native prior-N-hour-low reversion scored 0.30 / 0.53 OOS, below the baseline, MES CI including 0. The reversion structure does not exist at the intra-week horizon.
What that implies. The pullback edge is a daily-bar phenomenon on MES/MNQ, not a general short-horizon reversion effect: the sharpest evidence is that on hourly bars the long-only breakout baseline posts its best OOS Sharpe anywhere in the project (0.47 / 0.66) and beats both reversion candidates — the mirror image of the daily result. Momentum dominates at the hourly horizon; reversion dominates at the daily one. Breadth via finer bars is a dead end; daily H1, now graduated, remains the project's one and only edge. Workstream 3 (live-style Data-bus feature transport) was deferred — the gate transport stays the tested date-map; it is the first item of any live-path phase.
Recommended Phase 2e direction (recommendation only — the call is the owner's):
- Take graduated H1 toward paper trading — the highest-value step, because H1 is the one validated, now-realistic edge and it needs no new paid data or owner-level decision. Build the live data path (Nautilus Databento adapter), and implement feature transport v2 (publish the trend gate as custom
Dataon the message bus, the deferred workstream 3) so the same strategy code runs backtest and paper. This turns a research pass into something observable in real time before any capital. - Test breadth via a new market, not finer bars — the open question the hourly failure sharpens: is the reversion edge equity-index-specific or a general phenomenon? The remaining lever is a universe expansion to the metals/energy micros (MGC, MCL, …). This is an owner-level call: it needs new ingestion plus new fee/margin constants, and the hourly result already argues the edge may not generalize. Recommend only if (1) is progressing and there is appetite for a genuinely new market.
A multi-sleeve portfolio view (roadmap item 4's last remnant, correlation across sleeves) stays moot: no second independent sleeve exists — the hourly candidates did not graduate.
Phase 2e retro
Phase 2e followed the direction analysis's recommendation — a surgical step back: run the single cheapest experiment that could break the graduated H1 before spending live-adapter engineering on a single bull regime, rather than productionizing first. Three pieces (all in the ledger and the H1 note):
- The regime stress test is the headline (note). Re-running H1's exact walk-forward on the deep ES/NQ e-mini parent history (2012-2026 out-of-sample, ~3x the micro span, leverage-matched to $1M so 1 full-size contract equals 1 micro on $100k) does not break the edge — OOS Sharpe 0.74 (ES) / 0.58 (NQ), both CIs exclude 0, both beat buy-and-hold, drawdown modest (−2.3% / −4.9%) — but it right-sizes it: thinner than the micro window (0.84 / 0.86) and a slim margin over buy-and-hold on NQ (0.58 vs 0.51, not the micro's 0.86 vs 0.36 — buy-and-hold's own Sharpe is higher across 2012-2026). The trend filter's protection holds (H1 beats buy-and-hold in every scored OOS stress window); the whipsaw failure mode surfaces only in the in-sample 2011 slow-bleed, mild. A qualified pass.
- The next-bar-open fill is now a scored code path (
--fill next_open), not prose: it costs ~0.04 Sharpe on the micros (MES 0.84 → 0.80, MNQ 0.86 → 0.82) and holds at depth (ES 0.74 → 0.73) — and it corrected the earlier hand-computed "no change on MES", which was optimistic. - The honest deployable headline is re-set to the 1-contract 0.84 / 0.86 (the sized 1.05 is time-varying leverage on MES only), and correlation / beta to buy-and-hold (~0.50 / ~0.27) is now reported — H1 is low-beta conditional long equity, so a slice of the Sharpe edge is an idle-cash effect, not alpha.
What that implies. H1 is worth taking forward, but on calibrated footing: a modest, low-exposure long-biased reversion sleeve with a real drawdown in the next sustained downtrend — not the buy-and-hold-crushing, 2.8%-drawdown edge the micro window advertised. The step cost ~$0.10 of daily bars and a day of compute; it right-sized the confidence before any live-adapter work.
Recommended Phase 2f direction (recommendation only — the call is the owner's):
- Paper-trade H1 is now defensible — the edge earned external validity — but size and monitor to the deep-history risk profile (~0.6-0.75 Sharpe, a real ~5% drawdown in a sustained downtrend), and build the live path (Nautilus Databento adapter + feature-transport v2) with those expectations, not the graduated micro numbers.
- Or push external validity further first: the pre-2010 regimes (2008 / 2000) sit below the Databento GLBX floor and need a second source (free Stooq /
ES=F, or Norgate ES-from-1997); and the cross-asset generality question (does the reversion edge exist off equity indices?) is untouched. Both were deliberately deferred by this config-only step.
Phase 2f retro
Phase 2f ran the owner's brief — meaningfully improve H1 (no data farming) and search for a genuinely new strategy (better Sharpe, negative correlation, or expandable verified edge) — as two agent-orchestrated, pre-registered, adversarially audited search campaigns plus a focused follow-up round: 18 candidates through the full ledger protocol in two days. Full method, results tables, mechanism map, and ranked recommendations: Phase 2f Strategy Search.
The one-paragraph summary: H1 defended its title — nothing in 18 candidates beat it or diversified it with statistical significance, and the best-looking same-book edits were exactly the noise an honest bar rejects. But the campaign produced four registered finalists with a concrete forward-testing agenda: the stress-exit (MES 1.06 vs 0.84, forward-validate), the hourly_momentum sleeve (MNQ verified, corr-to-H1 0.28), and the final session/event round's two — overnight_drift, the campaign's only CI-verified non-H1 edge (MNQ 0.83 after full costs; the MES leg is fee-destroyed), and fomc_hourly, the most orthogonal stream found (corr-to-H1 ≈ 0, power-bound at 42 events). The calendar/clock dimension held edge where every price-state conditioning failed. Closed doors are recorded in the note; the strongest remaining open question is slow commodity trend, which the cold-start walk-forward protocol structurally cannot score (an owner-level protocol decision).
Phase 2g retro
Phase 2g is primarily an engineering phase — the judge's ranked plan's items 1–3 and 5 all share one prerequisite, the live/paper infrastructure — with one small research track (the CPI/NFP backtests) that needs none of it. What shipped this phase, all offline-green (uv run pytest, no keys):
- The live/paper backbone (workstream 0). Feature transport v2 — the Phase 2d deferred workstream 3 — publishes H1's trend gate and the stress-exit's VIX latch as custom Nautilus
Dataon the message bus; the binding acceptance test is green (a gated backtest through the transport reproduces the date-map results to the bar), and the date-map stays the tested fallback. Plus: a calendar-aware, half-day-safe session scheduler; an append-only paper ledger with intended-vs-filled slippage as a first-class number; a replay-driven paper runner that drives the same registered strategy through the same engine (so signal parity is structural, re-checked by the monitor); staleness/heartbeat ops guards with restart-safe resume; and a live-vs-cache consistency cross-check. The Databento live feed itself is owner-gated (credentials) — the stack is built and tested against replayed bars, ready to point at the feed. - The pre-registered paper stack (ranks 1–3a). H1 as the sole live core on MES+MNQ (via transport), the stress-exit as a signal-only shadow on MES, the overnight sleeve on MNQ only, and the FOMC sleeve on both symbols — with calibrated expectations and adopt/kill criteria written before any fill. See the paper-stack note. The monitoring view tracks the forward test of the judge's ~0.92→~1.14 blend from day one.
- CPI/NFP pre-release drift (workstream 4) — run, and both fail. The phase's only new backtest hypothesis (note): two pre-registered candidates with frozen, BLS-sourced calendars (2010–2026, shutdown reschedules encoded), the
fomc_hourlymechanism ported with an honestly-weaker prior. Run through the ledger protocol on ~62 OOS events each: CPI is direction-only (0.33/0.42, CIs include 0, below baseline and buy-and-hold); NFP is outright negative (−0.28/−0.40, PF < 1). Exactly the pre-registered expectation — the macro-announcement premium (Savor–Wilson) is an on-day effect, not a clean pre-release drift. An informative fail: it bounds where the premium lives (ledger rows above). - Parent-hourly backfill purchased — and it settled rank 3. The owner-gated ES/NQ
ohlcv-1hbackfill (workstream 3b) came in at $1.90 on thecost_quotemetadata call and was approved and ingested (2010→2026, ~96k bars/symbol). Re-runningfomc_hourly's exact pre-registered rule on the parents (~115 OOS events vs 42 power-bound on the micros) moves both bootstrap CIs off zero: ES 0.66 [0.29, 1.02], NQ 0.47 [0.10, 0.89], corr-to-H1 0.04/0.14, PF 2.48/1.99, slippage-robust. The FOMC pre-drift is a CI-verified, low-correlation edge on deep history — its value is diversification (it sits below buy-and-hold's own high Sharpe in this bull span, like H1's regime-stress result), not an outright bh-beater. Rank 3 is settled years earlier than paper could.
Owner-gated, surfaced not decided (see the paper-stack owner decisions): (1) the parent-hourly backfill — done ($1.90, settled rank 3, above); (2) live credentials / venue / a writable paper-ledger store, the blocker for pointing the stack at the live feed; (3) the third sleeve (hourly_momentum MNQ), hold until a clean month of paper; (4) warm-started test windows / slow commodity trend, a protocol change recommended as Phase 2h's opening review item, not bundled here.
Recommended Phase 2h direction (recommendation only — the call is the owner's):
- Provision the live path and start the burn-in. With credentials and a writable ledger store, point the tested replay stack at the Databento live feed and begin the pre-registered paper burn-in — prioritizing
overnight_mnq(the one statistically-diagnostic sleeve, ~250 events/yr) once the H1 plumbing is stable. The infrastructure is done; what remains is calendar time and the owner inputs. - Paper the now-CI-verified FOMC sleeve, and price the blend. Rank 3 is settled on deep history (above), so the open question is live confirmation and portfolio value: run the FOMC sleeve in paper on both symbols and track its contribution to the judge's blend (corr-to-H1 ~0 makes it the cleanest diversifier found). The CPI/NFP dead ends free the event-research budget.
- Open the warm-start / slow-commodity-trend protocol review. The strongest remaining diversification thesis (the QO sleeve's +5.3% through 2022 while H1 idled) is the one mechanism the cold-start walk-forward structurally cannot score. It deserves its own protocol-design review, restated with whatever the first weeks of paper teach — not a rider on an engineering phase.
Running it
sh
cd strategies
uv sync
uv run pytest # offline test suite
uv run python -m vibe_trader.backtest.evaluate --symbol MES --source synthetic # no keys needed
# with the R2 cache configured (see infra docs) or a local ingest — both
# symbols in one command, one candidate against the benchmarks + baseline:
uv run python -m vibe_trader.backtest.evaluate --symbol MES,MNQ --source databento
uv run python -m vibe_trader.backtest.evaluate --symbol MES,MNQ --candidate pullback_reversion \
--source databento --walk-forward
# Phase 2e: next-open fill sensitivity + corr/beta columns are always printed;
# the deep-history regime stress test runs on the ES/NQ parents (ingest first):
uv run python -m vibe_trader.data.databento_ingest --symbol ES # daily, 2010+
uv run python -m vibe_trader.data.databento_ingest --symbol NQ
uv run python -m vibe_trader.backtest.regime_stress --symbol ES,NQ --source databentoRoadmap
Ingest real MES/MNQ history; structural validation of the continuous series— done; the CME-settlement cross-check is deferred (needs an independent source; cmegroup.com blocks scraping) and recorded invibe_trader.data.validate. The e-mini parents (ES/NQ) are now ingested as deep-history backtest proxies (Databento GLBX to 2010-06-06) for the Phase 2e regime stress test — a decade the 2019+ micros can't reach.Feature layer: VIX regime, COT positioning z-scores— done, except macro-calendar proximity, deferred: the catalog found no free historical machine-readable event calendar (ForexFactory is current-week-only; FRED needs a key + event mapping). Revisit with a concrete event-proximity hypothesis.- Hypothesis backlog → per-strategy research notes here in the docs; every candidate benchmarked against
SwingBreakoutand buy-and-hold, with walk-forward splits before any parameter is trusted. Done (Phase 2c campaign) — seven candidates through the full protocol, recorded in the candidate ledger above; the multi-candidate harness (registry, two-symbol evaluation, roll-cost accounting, bootstrap Sharpe CI) and the Phase 2c retro close it out. - Wealthsimple-realistic portfolio checks: front-two-expiry roll rules, margin headroom, per-order fee drag. Done through Phase 2d — per-order fee drag (Phase 2b), continuous-series roll-cost accounting, per-contract overnight-margin peak-utilization reporting, and (Phase 2d) multi-contract vol/margin position sizing and explicit slippage debited into the scored curve — all in the evaluation summary, exercised by the H1 graduation. Correlation across simultaneous sleeves is now live in the Phase 2g monitoring view (cross-sleeve correlation to H1 + blend tracking of the judge's ~0.92→~1.14 stack), tracked over the four registered forward-testing streams.
- Live/paper path: same strategy code backtest→live, feature transport on the message bus, paper ledger, session scheduling. Done (Phase 2g) — the
vibe_trader.livestack + feature transport v2, built and tested against replayed bars; the paper stack is pre-registered. Remaining (owner-gated): Databento live credentials + a writable paper-ledger store to point it at the feed, and the parent-hourly backfill purchase. Also addresses the macro-calendar proximity deferral from item 2 — the FOMC/CPI/NFP event sleeves run on frozen public calendars committed before data contact.