Does a Regime Model Actually Predict Crypto Prices?
Every vendor selling an "AI regime signal" implies the same promise: know the regime, know where price is going. We built a Hidden Markov Model (HMM) crypto regime engine — trained on 56,762 hours of market data (2020 → now) that classifies the whole market and every Hyperliquid perp — and then did the thing most vendors skip: we scored its own calls against what BTC actually did next.
The results are worth publishing precisely because two are flattering and one is not. In one line each:
- It identifies market state reliably — a nowcast, accurate within hours of a change.
- It routes strategies measurably — which playbook to run, not which way to bet.
- It does not predict direction — 52.8% vs a 52.1% base rate. No edge.
Everything below is reproducible against the live /market-regimes model and its history endpoints. Here are the base rates.
Nowcast, Not Forecast: What the Model Actually Does
A nowcast tells you the state of the world right now; a forecast tells you the next move. The HMM is a nowcast. It reads price, volatility and funding that are already in motion and names the regime — usually within hours of a state change.
That's why the regime timeline looks so prescient: green bands sit right on top of rallies. But that agreement is by construction, not prophecy. Measured at the first bar of each regime episode (n=418 bull, 376 bear):
- When the model flips to
bull, BTC has already risen +6.6% over the prior 7 days. The next 7 days average just +1.3% — roughly unconditional drift. - When it flips to
bear, −2.5% has already happened; the next 7 days average +0.9% (positive — the bounce).
The band is a recognition of the move already underway, not a call on the next one. That's an honest — and still useful — thing for a model to be, as long as you use it as state, not signal.
Finding 1: It Identifies Market State — Reliably
Scored bar-by-bar against the following 24 hours, the volatility regimes carry real information. During vol_spike, 79.5% of the next-24h windows on BTC saw above-median realized volatility — against a 50% base rate. And the state transmits across the whole book, not just BTC:
- Market
vol_spike→ an individual coin's own forward 24h vol above its median: 72.9% of coin-hours (16 majors, multi-year) and 79.0% (all 175 Hyperliquid perps, recent). - Market
range→ coin vol stays low, symmetrically.
| Regime | Claim tested | Accuracy | Base | Lift |
|---|---|---|---|---|
vol_spike | fwd 24h vol > median | 79.5% | 50% | +29.5pp |
squeeze | vol expansion (fwd > trailing) | 64.5% | 49.1% | +15.4pp |
choppy | fwd 24h vol > median | 58.8% | 50% | +8.8pp |
range | fwd 24h vol < median | 58.7% | 50% | +8.7pp |
The honest limit: every vol regime beats a coin flip, but none beats trailing 24h realized vol as a forecaster — it encodes the current vol state, it doesn't see further than a good rolling-vol estimate. Use it as a universe-wide sizing and stop-width layer: one market-level call to set position size, stop distance and liquidation buffers across every coin you hold.
Finding 2: It Routes Strategies — Measurably
Here's where the model earns its keep. A plain 24h-momentum strategy is dead flat unconditionally (Sharpe ≈ 0). Split the same strategy by regime and it separates into large, opposite-signed pockets — and the pattern replicates across three independent datasets: BTC (2020–26), 16 major alts, and all 175 HL perps.
| Regime | BTC 2020–26 | 16 majors | 175 HL perps | Verdict |
|---|---|---|---|---|
bear | −2.09 | −1.07 | −5.06 | Fade — stable |
vol_spike | −2.17 | −2.81 | −0.54 | Fade — stable |
squeeze | +0.75 | +1.71 | +1.50 | Momentum — mild |
choppy | +2.46 | +1.10 | −7.31 | Unstable — skip |
Values are the Sharpe of a 24h-momentum strategy inside each regime; negative means fading / mean-reversion is what works. Read it as a strategy selector:
- Fade
bearandvol_spike— mean-reversion wins on every dataset (all-negative momentum Sharpe). - Lean momentum in
squeeze— positive on all three. - Ignore
choppy— the sign flips between datasets (+2.46 on BTC, −7.31 on HL perps). Unstable, not tradeable.
As a BTC exposure filter, holding only during bull returned +579% at Sharpe 1.21 with a 30% max drawdown — versus a 200-day-SMA filter's 0.93 Sharpe and 63% drawdown for roughly the same return. Half the drawdown, a third of the time in market. (Read the next section before you trade that one.)
Finding 3: It Does NOT Predict Direction
Now the unflattering part, stated plainly. P(BTC up over the next 24h | bull) was 52.8%. The unconditional base rate is 52.1%. That +0.7pp is not significant (episode-level p = 0.21). Raising the confidence threshold to ≥0.7 doesn't rescue it — still 52.9%. The bull leg's real edge is drift concentration (bull bars carry ~2.5× average drift), not sign prediction.
The bear label is worse than useless as a short signal: mean BTC return during bear is mildly positive, and shorting it lost money on every dataset. If anything, bear flags bounce conditions — across the 175-perp universe, per-coin bear→down lift was negative for 98% of 174 coins.
This is not a quirk of our model. No regime model — ours or anyone's — predicts short-horizon direction. A regime is a description of the present. Vendors who sell it as a direction oracle simply aren't showing you the base rate. You can check ours yourself:
curl -H "X-API-Key: cdk_live_your_key" \
"https://cryptodataapi.com/api/v1/quant/market?horizon=24h"{
"scope": "market", "horizon": "24h",
"regime": {"label": "strong_trend_bull", "confidence": 0.71},
"probabilities": {
"directional": {"strong_up": 0.10, "mild_up": 0.43, "flat": 0.05,
"mild_down": 0.33, "strong_down": 0.09}
}
}Add it up: P(up) = 0.10 + 0.43 = 0.53 — a hair above the base rate, exactly as the scoring says. The directional head is a transition-matrix projection, not a realized-outcome forecast, and we label it that way in the docs on purpose.
The Honest Caveat: Most of This Is In-Sample
One more disclosure, because a post about base rates has no business hiding its own. Almost all of the above is in-sample. The HMM's parameters and the state→label mapping were both chosen looking at the full 2020–2026 window, so the strategy-routing and drawdown numbers carry some circularity — the bull-exposure edge in particular is partly a product of the state having been labeled "bull" by inspecting that same window.
Only ~546 bars (about 23 days) are genuinely out-of-sample so far — too few to conclude anything. On that thin slice, the bull filter was slightly negative and bear was again a bounce. So we rank the findings by how much we trust them:
- Most trusted — strategy routing. Replicated on three independent datasets; the least circular result.
- Reliable — the vol nowcast. Transmits to every coin; it's a state read, not a fitted bet.
- Provisional — the drawdown headline. Real but circularity-inflated; needs the live tail to confirm.
We score the live out-of-sample tail as a separate segment as it accrues (it becomes meaningful around 2,000 bars, ~3 months). The fold-honest history is downloadable so you can re-run every number above yourself:
curl -H "X-API-Key: cdk_live_your_key" \
"https://cryptodataapi.com/api/v1/quant/regimes/history" # Pro Plus, full 2020→now
How to Use a Regime Nowcast Without Fooling Yourself
Put together, the model is a context layer, not a crystal ball. Match each job to what the scoring actually supports:
| Use it for | Don't use it for |
|---|---|
| Position sizing & stop width (vol nowcast) | Predicting the next 24h direction |
| Strategy selection (fade bear/vol_spike, momentum in squeeze) | A standalone long/short entry signal |
| BTC exposure gating (risk-adjusted, provisional) | Shorting a "bear" regime — it bounces |
import httpx
m = httpx.get("https://cryptodataapi.com/api/v1/quant/market?horizon=24h",
headers={"X-API-Key": "cdk_live_your_key"}).json()
regime = m["regime"]["label"]
# 1. Size by volatility state, not by a price forecast
size = 0.5 if regime in ("vol_spike", "choppy_high_vol") else 1.0
# 2. Pick the playbook the regime historically rewards
strategy = ("mean_reversion" if regime in ("strong_trend_bear", "vol_spike")
else "momentum" if regime == "squeeze" else "flat")
# 3. Gate directional exposure - never short 'bear', it bounces
allow_long = regime == "strong_trend_bull"- Sizing layer: one market call sets risk across your whole book — the most reliable use.
- Selector, not predictor: the regime picks which strategy runs, never which way to bet.
- Verify, don't trust: replay the calls yourself via the no-hindsight timeline and
/quant/history.



