What it predicted, and what happened
Stored daily after the close, never edited. Bold is the model's pick. Green exactly right · amber right change, wrong regime · red missed or false alarm.
Loading recent predictions…
Five states, with meaningful changes only
A market's regime is not one universal fact. It is defined by which two moving averages you compare.
This site uses two views: 50-day (25 vs 50-day average) and 21-day (10 vs 21-day average). So SPY has a 50-day regime and a separate 21-day regime — four scoreboards in total.
Within a view, every day is classified by two mechanical tests, direction and volatility:
- Direction. Compare a short and a long moving average of price (25-day vs 50-day). If the short one is more than 1.0% above the long one, the market is rising. More than 1.0% below: falling. In between: neutral.
- Volatility. Measure how much price moved over the last 21 trading days. If that reading is in the top 20% of everything seen over the past three years for this market, moves are unusually large. Otherwise, normal.
Direction and volatility together give one of the five states:
| Regime | Direction | Daily moves |
|---|---|---|
| Bull quiet | Rising | Normal |
| Bull volatile | Rising | Unusually large |
| Neutral | No clear trend | Either |
| Bear quiet | Falling | Normal |
| Bear volatile | Falling | Unusually large |
When does a change become official?
Not when a threshold is crossed by a hair. The new state must hold for three trading days and move 25% beyond its boundary. This filters out weak flips while preserving decisive turns. The five states themselves do not change.
Why two views can disagree
After a three-week selloff that followed a two-month rally, the 21-day regime can already read bear while the 50-day regime still reads bull. Neither is wrong: one answers “the trend this month,” the other “the trend this quarter.” The fast view usually turns first; the views are never combined into one answer.
| View | Trend test | Forecasts |
|---|---|---|
| 50-day | 25-day versus 50-day average, 1.0% clear gap | 5 and 10 days ahead |
| 21-day | 10-day versus 21-day average, 0.7% clear gap | 2 and 5 days ahead |
03 · Backtesting Results
How well did it work?
+9.6 pts
average edge over the baseline, all 8 locked tests
Model 91.9% correct vs 82.3% for the baseline, averaged across every market, trend speed and horizon, 2022–2026.
Every prediction is simulated as if it were live. The years 2010–2021 select features and settings; those choices are frozen before testing once on 2022–2026, and no test-year information ever feeds back into a choice.
Context
1999–2009
Validation
2010–2021
Locked test
2022–2026
The bar to beat is the baseline: guess that today's regime is still here a few days from now. Regimes are sticky, so that guess is already right most of the time, which makes it a genuinely hard bar to clear.
Accuracy: how often the forecast matched what happened; the green segment is what the model adds over the baseline. Changes caught: on the days the regime truly changed, how often the model called the new one.
50-day trend
A regime is defined by the 25-day average against the 50-day average.
| Market | Accuracy | Changes caught |
|---|---|---|
| SPY5 days ahead | 97.4%+8.7 pts above baseline baseline 88.7% | 86% |
| SPY10 days ahead | 89.8%+12.2 pts above baseline baseline 77.6% | 72% |
| SOXX5 days ahead | 94.6%+6.6 pts above baseline baseline 88.0% | 80% |
| SOXX10 days ahead | 82.3%+4.2 pts above baseline baseline 78.1% | 59% |
1,141–1,149 predictions per row, 2022–2026.
21-day trend
A regime is defined by the 10-day average against the 21-day average.
| Market | Accuracy | Changes caught |
|---|---|---|
| SPY2 days ahead | 98.9%+8.3 pts above baseline baseline 90.6% | 97% |
| SPY5 days ahead | 88.5%+12.0 pts above baseline baseline 76.4% | 76% |
| SOXX2 days ahead | 99.2%+11.4 pts above baseline baseline 87.8% | 98% |
| SOXX5 days ahead | 84.5%+13.7 pts above baseline baseline 70.9% | 70% |
1,141–1,149 predictions per row, 2022–2026.
Statistical check: daily forecasts overlap, so edges are tested with a moving-block bootstrap. 7 of 8 rows beat the baseline at 95% confidence; SOXX 50-day at 10 days is positive but inconclusive. The engine is also stress-tested against alternatives: 40 controlled experiments across ten further data families failed to beat it under this same protocol. Every negative result is recorded.
04 · Does it generalize?
The same engine, on markets it never saw
The strongest test of whether something is real, not curve-fit: take the exact engine tuned on SPY and SOXX (same features, same blend weights, zero retuning) and point it at six completely different markets it was never shown. Then score it on the same 2022–2026 window.
It beat the do-nothing baseline on all 24 of 24 market-and-horizon cases, by an average of +9 points. Because nothing was fit to these tickers, each is a clean out-of-sample check, and there were no knobs to overfit or memorize.
| Market | Named correctly | Baseline | Avg edge | Weakest case | Beat baseline |
|---|---|---|---|---|---|
| QQQ Nasdaq 100 | 91.7% | 81.7% | +10.0 | +8.6 | 4/4 |
| IWM Small caps | 91.4% | 80.0% | +11.3 | +8.1 | 4/4 |
| TLT Long Treasuries | 94.7% | 87.7% | +7.0 | +4.2 | 4/4 |
| GLD Gold | 90.9% | 83.9% | +7.0 | +6.1 | 4/4 |
| XLE Energy | 90.9% | 79.7% | +11.2 | +9.1 | 4/4 |
| XLF Financials | 90.3% | 81.1% | +9.2 | +8.0 | 4/4 |
Averages are across each market's four cases (two trend definitions, two horizons). Every individual case beat its baseline; the weakest single case was Long Treasuries at +4.2 points. These six markets are shown as a generalization check and are not part of the live product, which tracks SPY and SOXX.
05 · API
Getting it yourself
One endpoint. Pick the market with symbol and the trend definition with variant. Horizons are chosen for you to match the trend speed, so you never have to reason about them.
| What you want | Request |
|---|---|
| SPY · 50-day trend | /v1/regime?symbol=SPY&variant=50d |
| SPY · 21-day trend | /v1/regime?symbol=SPY&variant=21d |
| SOXX · 50-day trend | /v1/regime?symbol=SOXX&variant=50d |
| SOXX · 21-day trend | /v1/regime?symbol=SOXX&variant=21d |
import requests
data = requests.get(
"https://api.regime-api.com/v1/regime",
params={"symbol": "SOXX", "variant": "21d"},
).json()
print(data["current_regime"])
for f in data["forecasts"]:
print(f["days_ahead"], f["regime"], f["change_probability"]){
"symbol": "SOXX",
"variant": "21d",
"as_of": "2026-08-05",
"current_regime": "bear_volatile",
"forecasts": [
{
"days_ahead": 2,
"regime": "bear_volatile",
"change_probability": 0.004,
"probabilities": {
"bull_quiet": 0.001,
"bull_volatile": 0.001,
"neutral": 0.001,
"bear_quiet": 0.001,
"bear_volatile": 0.996
}
},
{ "days_ahead": 5, "regime": "bear_volatile", "...": "..." }
]
}Fresh predictions are computed once per trading day at 21:30 UTC, about 90 minutes after the 4:00 PM New York close.
Returns today's regime plus a probability for each of the five regimes at both horizons. A fresh calculation takes a few minutes; repeat calls the same day are instant. No key required.