What we tested, what worked, what didn't
Every idea we tried on the Markov regime engine, including the ones that failed. The evaluation is public. The recipe stays private: signals are described by what they measure, not by their settings.
How we test
- Ten years, one rule. Labels since Feb 2026 are live. Earlier labels replay the same production rule on index prices, with no fitted parameters. When the rule changes, the whole history is re-run and the change is dated on this page.
- Next-close execution. A signal seen today is acted on at the next session's close. No costs, taxes or slippage.
- Drawdown episode. The S&P 500 ETF falling 10% or more from a peak.
- False alarm. A Risk-Off entry not followed by a further 5% decline within 20 sessions.
- In-sample honesty. Thresholds for the newer signals were chosen on the full history. Where we split 2016–21 from 2022–26 we show both halves. Only the forward log at the bottom is truly out of sample.
- Survivorship. Breadth studies use today's index members, which flatters the past slightly.
- What is live, what is dated. The receipts and strategy rows are read from the current replay (re-run 2026-09-14). The signal studies were run on 2026-09-13.
The receipts: every 10% drawdown since 2016
Bar = how deep the drawdown went. Dot = how far down the market was when the model flipped to Risk-Off. Dashed line = the −10% mark.
It measures risk, not direction
Annualized volatility of daily S&P 500 returns in each state.
Risk-Off days have also been followed by higher average 20-session returns than Risk-On days, with far wider swings. The label tells you the ground is shaking, not which way the next move goes.
What stepping aside would have done
Hypothetical: sell when the label turns Risk-Off, buy back on one of three re-entry rules. 2016–2026, next-close execution.
Table view
| Strategy | Annual return | Volatility | Sharpe | Worst drawdown | In market |
|---|---|---|---|---|---|
| Buy & hold SPY | 15.1% | 17.8% | 0.89 | -33.7% | 100% |
| Step aside in Risk-Off, re-enter when it clears | 9.8% | 9.4% | 1.04 | -11.4% | 70% |
| Step aside in Risk-Off, re-enter on breadth recovery | 14.7% | 13.9% | 1.06 | -20.4% | 88% |
| Step aside in Risk-Off, re-enter on sector rotation (Recovery) | 13.9% | 10.7% | 1.28 | -12.6% | 76% |
Changes, dated. 2026-09-13: an earlier version of the breadth re-entry row exited again the day after re-entering, which overstated it; fixed. 2026-09-14: VIX backwardation joined the rule and every row was re-run (strategy rows as of 2026-09-14).
Signal by signal
Adopted = changes what the page tells you. Display-only = shown as context, not part of the regime label. Rejected = tested and dropped.
VIX backwardation as a rule input
✓ Adopted 2026-09-14Should a close with 30-day VIX above 3-month VIX (an inverted, or backwardated, curve) turn the label Risk-Off on its own?
Why adopted: it is the plain definition of inversion, an industry-standard stress signal, with no tuned setting. It adds a little warning time and slightly improves every stepping-aside row without raising the false-alarm rate. The receipts and strategy rows on this page were re-run the same day. Live backwardation watch →
Sector rotation re-entry ("Recovery")
✓ Adopted, display stateDuring a Risk-Off stretch, does cyclical sectors' breadth pulling clearly ahead of defensive sectors mark a better time to get back in than waiting for the label to clear?
Why adopted: better in both halves of the sample, not just one lucky period, and the other re-entry ideas we tried bought false bottoms. Shown as a hatched "Recovery" state on the page; the regime label itself is unchanged.
Early-warning score
◐ Display-onlySix tells: breadth falling fast, index/breadth divergence, sector stress, bond volatility high and rising, the VIX curve flattening toward inversion, and the 2-year yield pulling above Fed funds. When several line up on a calm day, does trouble follow?
Why display-only: thresholds were picked on the full sample and the day counts are small. As a hard exit rule it raised the Sharpe ratio but deepened the worst drawdown. The strongest readings on a calm day have happened twice: 2021-12-07, before the 2022 bear market, and 2026-09-10.
Index vs breadth divergence
◐ Display-onlyWhat happens when the S&P 500's own trend is still positive but most of its stocks have already rolled over?
Why display-only: the near term was fine, the next three months were weaker, and about half the episodes had a 5–9% pullback within 60 sessions (roughly 30% normally). Only one went past −10%. With two to eight episodes depending on the variant, that is a watch signal, not a proven one.
Breadth speed
◐ Display-onlyWhen the share of S&P 500 stocks in an uptrend drops fast over a week, does the label follow?
Why display-only: it anticipates the label, not the market. The S&P 500's next 20 sessions after a fast drop were normal (+0.71% vs +0.76%). Used as an exit trigger it added seven false alarms for noise-level gains.
VIX curve shape
◐ Display-onlyDoes the shape of the VIX curve say how rough the next three months get?
Why display-only: a steep, calm curve is genuinely reassuring (forward realized volatility 9.6 vs 14.8 normally). The inverted end of the curve is now part of the rule (see above); the rest of the shape grades the storm rather than timing it.
2-year yield above Fed funds
◐ Display-onlyWhen the 2-year Treasury yield sits above the Fed funds rate and the gap is widening, the bond market is pricing hikes or sticky inflation. Does that hurt stocks?
Why display-only: effectively two episodes, and they split: the 2022 bear market and the spring-2026 rebound (+14.7% in three months). It stays as one of the six early-warning tells.
Trend breadth as a model input
✕ RejectedWould the share of stocks in an uptrend (equal-weight, cap-weight or by sector) make the regime label better?
Why rejected: it is redundant with the trend conditions the model already reads. Breadth averages about 70% in Risk-On and 38% in Risk-Off. Cap-weighting made it more redundant, not less. It stays on the page as context, and it feeds the sector rotation read above.
Trend-oscillator crosses and speed
✕ RejectedDoes the S&P 500's momentum oscillator crossing its signal line, or accelerating, flag the next move?
Why rejected: direction barely matters; the zone matters more, and it is contrarian. Speed added nothing beyond zone and regime. One state-dependent effect held up: inside Risk-Off, a rising signal line cut the worst 20-session outcome from −21.8% to −12.1%.
Breadth as a lead on the flip
✕ RejectedDoes breadth turning before the label give advance notice of a regime change?
Why rejected: breadth and the label move together. 96% of Risk-On days have a majority of stocks in uptrends, and 76% of Risk-Off days have a minority. Confirmation, not a lead.
Single-signal bottom calls
✕ RejectedCan one bounce signal on its own call the bottom: a raw breadth bounce or thrust, the VIX coming off its peak, the S&P 500 back above its 20-day average, or the VIX curve returning to normal?
Why rejected: used on its own, each buys back into bear-market rallies. The published "re-enter on breadth recovery" row works differently: it waits for a breadth recovery confirmation and then holds until the Risk-Off period ends, instead of treating one bounce as the bottom. The curve-normalizing trigger looked good only at one fragile setting, and most of its edge came from 2020.
Also tested, briefly
- ✕ RejectedBond volatility (MOVE) as a trigger. No improvement on the receipts. It survives as one of the six early-warning tells.
- ✕ RejectedEqual-weight leading cap-weight as re-entry. No edge.
- ◐ Display-onlySector washouts and bounces. Sectors with broad weekly breakdowns tended to bounce in Risk-Off markets and kept falling in Neutral markets with rates rising, so the page shows breakdowns without a bounce call.
- ◐ Display-onlyNarrow leadership. On 2026-09-11, 55.5% of the index by weight was in an uptrend but only 36.4% of its stocks. Context for the divergence card, not an input.
Pre-registered from here
In-sample results are only a start. These are logged every trading day, before the outcome is known, and a logged day is never rewritten, so the forward record can be checked against this page.
Early-warning score
Daily count and which tells were on. Forward record starts 2026-09-14.
Sector rotation
Daily cyclical vs defensive breadth and the Recovery state. Forward record starts 2026-09-14.
Rule changes
2026-09-14: VIX backwardation added; receipts and strategy rows re-run. Any future change is dated here, with before and after.
Hypothetical results from a replay of the production rule, not a track record of real trades. No costs, taxes or slippage. Past behavior does not guarantee future results. Not investment advice. Breadth studies use current index members. Back to the Markov regime engine →