Research track v5 — oil term structure, systematic Fed rollover, stagflation tail
Evaluation window 2011-01-03 → 2026-11-13 (ETF era only) · generated 2026-11-14T02:02:04+00:00 · Live dashboard · Monitor v5 (live v5 rules) · Expected returns · v1 backtest · v2 backtest · v3 backtest · Backtest v5 · Monitor v5 · Regime analog · Stagflation stress
Side-by-side: v1 vs v3 vs v5 (full ETF-era window, 2011–present)
| Metric | Current system (v1) | v3 † | v5 † |
|---|---|---|---|
| Episodes (≥15%) | 5 | 5 | 5 |
| Hit rate (warned at peak) | 0 / 5 (0%) | 0 / 5 (0%) | 0 / 5 (0%) |
| Median lead (hits) | n/a | n/a | n/a |
| False-positive share of red days | 4.3% (1 / 23) | 39.2% (138 / 352) | 19.4% (40 / 206) |
| State flips | 18 | 322 | 88 |
† v3 and v5 metrics are design-contaminated: v3's parameters were chosen after observing v2's 2021–2026 failure, and v5's after observing the v1–v3 results. Neither column can be evidence of skill.
Episodes in the evaluation window (v5 states)
| # | Peak | Trough | Max drawdown | v1 at peak | v3 at peak | v5 at peak | v5 lead / lag | v5 red share of decline |
|---|---|---|---|---|---|---|---|---|
| 1 | 2011-04-29 | 2011-10-03 | -18.6% | PHASE 1 | PHASE 1 | PHASE 1 | no warning | 0% |
| 2 | 2018-09-20 | 2018-12-24 | -19.3% | PHASE 1 | PHASE 1 | PHASE 1 | stale warning ended 103 td before peak | 0% |
| 3 | 2020-02-19 | 2020-03-23 | -33.7% | PHASE 1 | PHASE 1 | PHASE 1 | -13 td (lag) | 46% |
| 4 | 2022-01-03 | 2022-10-12 | -24.5% | PHASE 1 | PHASE 1 | PHASE 1 | -53 td (lag) | 20% |
| 5 | 2025-02-19 | 2025-04-08 | -18.8% | PHASE 1 | PHASE 1 | PHASE 1 | -16 td (lag) | 54% |
Conditional drawdown frequency by v5 state (statistics only)
For each historical day: did a ≥15% SPY drawdown episode begin (peak) within the next 12 months (252 sessions)? Split by the v5 state on that day, with raw cell counts. The final 252 sessions are excluded - their forward window is unobservable, and they are never counted as negatives.
| v5 state | Days | ≥15% drawdown began ≤12m | Frequency |
|---|---|---|---|
| PHASE 1 | 3,461 | 998 | 28.8% |
| ARMED | 88 | 59 | 67.0% |
| PHASE 2A | 96 | 10 | 10.4% |
| PHASE 2B | 94 | 22 | 23.4% |
| TAIL OVERRIDE | 0 | 0 | n/a |
| All days (base rate) | 3,739 | 1,089 | 29.1% |
Illustrative, small-sample, design-contaminated left of 2026-09-21; forward test accumulates from freeze. Frequencies are ex-post conditional frequencies, not probabilities of future drawdowns; states with few days (ARMED/2A/2B/TAIL) have single-digit cell counts by construction.
Gate-count conditioning — hot Tier-1 latches vs subsequent drawdowns (statistics only)
For each historical day: how many of the three Tier-1 latches (G1/G2/G3, each 45 sessions) were hot, and did a ≥15% SPY drawdown episode begin (peak) within the next 12 months (252 sessions)? Same ex-post construction as the state table above; the final 252 sessions are excluded (forward window unobservable, never counted as negatives). Buckets are latch counts, not states — they feed no gate, leg, latch, state, or exit.
| Hot Tier-1 latches (of G1/G2/G3) | Days | ≥15% drawdown began ≤12m | Frequency |
|---|---|---|---|
| 0 | 3,153 | 883 | 28.0% |
| 1 | 514 | 206 | 40.1% |
| 2 | 72 | 0 | 0.0% |
| 3 | 0 | 0 | insufficient in-window observations |
| All days (base rate) | 3,739 | 1,089 | 29.1% |
Lead-time distribution: for episodes whose drawdown began, sessions from the first day ANY Tier-1 latch was hot (start of the contiguous hot run containing the peak) to the drawdown peak, bucketed by the number of hot latches on the peak day. Buckets with <5 episodes are suppressed (count shown). Ex-post lead to peak; ex-ante unknowable in real time.
| Hot Tier-1 latches at the peak | Episodes | Median lead | IQR | Min–max |
|---|---|---|---|---|
| 1 | 0 | suppressed — <5 events (n=0) | ||
| 2 | 0 | suppressed — <5 events (n=0) | ||
| 3 | 0 | suppressed — <5 events (n=0) | ||
| 0 (no latch hot at peak — no defined lead) | 5 | — | ||
Design-contaminated left of 2026-09-21; forward test accumulates from freeze. These are ex-post conditional frequencies, not forward probabilities; the 3-hot estimate rests on ~2 episodes.
extended window 1997–present — 2-3 historical episodes only; illustrative.
The same gate-count and lead-time statistics rerun on the full reconstructed frame from 1997-01-01, to capture the 2000–01 and 2007 episodes. Same frozen thresholds, no recalibration. Data limits, disclosed: G2 (CCC) has no history before ≈2023-09 (FRED serves only a rolling 3-year window of ICE BofA data; there is no long-history CCC proxy), so 2-hot/3-hot cells left of that window mechanically exclude G2; G1 runs on the Moody’s Baa proxy (BAA10Y) before the ICE window, as in the main backtest — conservative, tighter and less volatile than HY; G3’s 200-day z-leg warms up ~200 sessions into the window (its absolute 5.10% leg is unaffected).
| Hot Tier-1 latches (of G1/G2/G3) | Days | ≥15% drawdown began ≤12m | Frequency |
|---|---|---|---|
| 0 | 4,966 | 1,417 | 28.5% |
| 1 | 2,206 | 851 | 38.6% |
| 2 | 91 | 0 | 0.0% |
| 3 | 0 | 0 | insufficient in-window observations |
| All days (base rate) | 7,263 | 2,268 | 31.2% |
Lead-time distribution, extended window. Ex-post lead to peak; ex-ante unknowable in real time.
| Hot Tier-1 latches at the peak | Episodes | Median lead | IQR | Min–max |
|---|---|---|---|---|
| 1 | 2 | suppressed — <5 events (n=2) | ||
| 2 | 0 | suppressed — <5 events (n=0) | ||
| 3 | 0 | suppressed — <5 events (n=0) | ||
| 0 (no latch hot at peak — no defined lead) | 7 | — | ||
In-drawdown confirmation by v5 state (statistics only)
Confirmation-metric sibling of the v6 scoping study, on the unchanged 2011+ window: for each day, is it inside one of the pinned drawdown windows (the v6 study's peak → trough anchors)? Split by the v5 state on that day, with raw counts. An in-window indicator needs no forward window, so no sessions are excluded (unlike the 12m conditional tables above). 5 of 6 pinned windows fall inside the frame — the 2007–09 window predates the 2011 sample start. Reference labels from the v6 study's full daily-era frame: base rate 12.4% (780 window days over 6,309 valid days); this frame covers the 5 post-2011 windows (430 window days).
| v5 state | Days | In drawdown window | Frequency |
|---|---|---|---|
| PHASE 1 | 3,645 | 360 | 9.9% |
| ARMED | 140 | 0 | 0.0% |
| PHASE 2A | 112 | 46 | 41.1% |
| PHASE 2B | 94 | 24 | 25.5% |
| TAIL OVERRIDE | 0 | 0 | n/a |
| All days (base rate) | 3,991 | 430 | 10.8% |
Illustrative, small-sample, design-contaminated left of 2026-09-21; forward test accumulates from freeze. Frequencies are ex-post conditional frequencies, not probabilities; this section reports only and feeds no gate, leg, latch, state, or exit.
v5 mechanics (frozen 2026-09-21)
- Tier 1 gates, each latched for 45 sessions (identical to v3): G1 · HY credit stress (HY OAS +65 bps over 20 sessions OR >= 425 bps); G2 · CCC stress (CCC & Lower OAS >= 1200 bps OR +150 bps over 20 sessions); G3 · yield exhaustion (DGS10 >= 5.10% OR 200-day z >= +3.0).
- Tier 2 quorum — at least 2 of 5 confirmations, each latched for 15 sessions: claims 4-week MA ≥ trailing 1-year min + 25k; GLD/CPER > 1.15× its 50-day SMA; SPHB/SPLV below its 50-day SMA; Brent term structure — prompt-to-6M calendar spread ≤ $0.50/bbl (contango flip), sourced live from the yfinance Brent contracts (BZ=F vs the +6-month contract built from the month codes F G H J K M N Q U V X Z, e.g. BZH27.NYM), with a roll-yield proxy fallback (BNO 60-day return minus Brent spot 60-day return ≤ -2%) when the contract data is unavailable or thin; T10Y2Y ≥ trailing 12-month min + 0.25. This oil leg replaces v3's BNO 20-day momentum leg (≤ -8.0%).
- States: PHASE 2A when a Tier 1 latch is hot AND the quorum is met (banner: “PHASE 2A: ROTATE DURATION TO 25%, EXIT CYCLICALS”); ARMED when a Tier 1 latch is hot without the quorum; PHASE 1 otherwise. PHASE 2B = 2A AND the automated Fed-rollover flag — DGS2 < (DFEDTARU+DFEDTARL)/2 − 0.25 — computed from FRED daily (banner: “PHASE 2B: DURATION TO 32%”). config.json is not used.
- TAIL_OVERRIDE supersedes all states (purple): weekly DGS10 close > 5.40% AND Brent spot > $120, where the weekly close is the last available observation of the calendar week. Banner: “STAGFLATION TAIL: NO DURATION ADDS - HOLD CARRY/TIPS/GOLD”; all 2A/2B rotation instructions are suppressed while it is active. It exits when either condition lapses for 5 sessions. The 2A/2B machine keeps running underneath, so an exit or the time stop can close 2A while the override is displayed.
- Exits from 2A/2B (first one wins; all require persistence): HY credit below its 50-day SMA for 3 consecutive sessions; SPHB/SPLV above its 50-day SMA for 3 consecutive sessions; or 60 sessions elapsed in state. After any exit, a 10-session cooldown blocks re-entry (no same-day re-entry; an exit day closes non-red). During the cooldown the quorum may still be hot while re-entry is blocked — the strict state definitions then read ARMED only when the quorum is not met, PHASE 1 otherwise.
- Live twin: monitor v5 evaluates these exact rules on live data every day (same code, imported from backtest_v5.py) and logs the oil-leg source and the Fed-rollover and TAIL_OVERRIDE inputs in status.json each day.
Sample discipline — read this first
- Parameters frozen 2026-09-21 (first deploy date; 54 days ago). No parameter changes are permitted after this date; any future change ships as a new research track.
- The entire historical record is DESIGN-CONTAMINATED for v5: it was designed after observing the v1–v3 results (v1's live record, v2's out-of-sample failure, v3's reconstructed history). Historical metrics here are illustrative only — they cannot be evidence of skill. The true test is forward performance from the freeze date.
- ETF availability: SPHB/SPLV start May 2011, BNO mid-2010, CPER late 2010, GLD late 2004. ETF-based indicators do not exist before 2011, so this track evaluates 2011-01-01 onward and makes no claims about pre-2011 performance.
Data notes
- Credit gates pre-2023-09 run on the Baa proxy (Moody's BAA10Y, same data break as v1/v2/v3) and are conservative: Baa is investment-grade debt and runs tighter and less volatile than HY. The real HY series would have fired Aug 2007 in a GFC-like episode, so the reconstructed record understates credit-gate lead time.
- Oil leg: Brent +6M contract history is thin, so the backtest's C4 leg uses the roll-yield proxy (BNO 60-day return minus Brent spot DCOILBRENTEU 60-day return ≤ -2%) throughout and is marked approximate. The live track prefers the actual calendar spread and falls back to the proxy; the source used is logged in status.json each day.
- CCC & Lower OAS: FRED BAMLH0A3HYC. Like all ICE BofA series, FRED serves only a rolling 3-year window, so G2 is inactive before ≈2023-09 — there is no long-history CCC proxy.
- TAIL_OVERRIDE weekly close: last available DGS10 observation of the market week (weeks ending Friday), so a partial current week uses its latest observation — the same convention as the v4 invalidation panel.
- Data repair (2026-09-23 hotfix, no parameter change): the DCOILBRENTEU Brent spot input was data-suspect on 56 session(s) (deviation > 15% from the BZ=F front-month close); the BZ=F close stands in on those dates for the tail-override and oil-proxy inputs. The DCOILBRENTEU series is stale at source (last print 2026-11-11; confirmed on FRED's own CSV, not a fetch/parse bug), so the BZ=F close also backstops 49 missing session(s). Flagged data-suspect.
- Same caveats as v1/v2/v3: FRED publication lags ignored, no vintage adjustment, spliced proxies for pre-ETF history, closing prices only.
Limitations
- This is a research track, not the live system; monitor.py is unchanged. The latches, exits, cooldown, override and every threshold are exogenous design choices — only the freeze discipline is claimed, not optimality.
- For scoring, TAIL_OVERRIDE days count as red days (it is a defensive alert state); that raises its apparent false-positive share relative to a pure recession signal, which the stagflation case accepts by design.
- The exit/cooldown asymmetry is deliberate: quick re-entry after a whipsaw exit is impossible for 10 sessions, so a V-shaped recovery can run for up to two weeks with the state non-red. The flip count in the comparison table is the honest cost of the hysteresis.
- The Fed-rollover flag compares a market price (DGS2) to the target midpoint with a fixed 0.25-pt margin; around target changes it can flicker day to day. It gates only the 2A→2B escalation, never an entry.