Live Dashboard

Regime Classifier

Daily cross-asset risk-on / risk-off composite. 20 indicators across macro and on-chain panels, recomputed every 24 hours.

Live Composite

Daily regime classification

As of 2026-05-13
Top-line regime
Neutral
composite 0.54 · 73th pct of last 3y
Macro index
0.65
risk-offrisk-on
On-chain index
0.43
risk-offrisk-on
Full historyrisk-offneutralrisk-on

Macro panel

Indicator24moLastSignedWt
10y–2y yield curveSign +1 — rising 10y–2y yield curve reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
FRED · level · sign +1
0.46%656.6%
Real 10y yieldSign −1 — rising Real 10y yield reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
FRED · level · sign -1
1.95%457.0%
5y breakeven inflationSign +1 — rising 5y breakeven inflation reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
FRED · level · sign +1
2.69%1007.8%
HY OAS credit spreadSign −1 — rising HY OAS credit spread reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
FRED · level · sign -1
2.79%8714.9%
DXY (trade-weighted USD)Sign −1 — rising DXY (trade-weighted USD) reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
FRED · level · sign -1
118.04958.1%
Initial jobless claimsSign −1 — rising Initial jobless claims reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
FRED · level · sign -1
200,0009819.1%
VIXSign −1 — rising VIX reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
Yahoo · level · sign -1
18.07296.1%
Copper / Gold ratioSign +1 — rising Copper / Gold ratio reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Yahoo · level · sign +1
0.00142912.0%
S&P 500 50d/200d trendSign +1 — rising S&P 500 50d/200d trend reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Yahoo · trend_50_200 · sign +1
7400.962111.0%
Equity breadth (IWM/SPY)Sign +1 — rising Equity breadth (IWM/SPY) reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Yahoo · level · sign +1
0.3828467.4%

On-chain panel

Indicator24moLastSignedWt
Total DeFi TVLSign +1 — rising Total DeFi TVL reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
DefiLlama · level · sign +1
$86.12B428.5%
Total stablecoin floatSign +1 — rising Total stablecoin float reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
DefiLlama · level · sign +1
$320.67B1009.8%
BTC active addressesSign +1 — rising BTC active addresses reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Blockchain.com · level · sign +1
476,3831813.8%
ETH active addressesSign +1 — rising ETH active addresses reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Coinmetrics · level · sign +1
852,4708812.7%
BTC MVRVSign +1 — rising BTC MVRV reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Blockchain.com · level · sign +1
0.0%
BTC / ETH ratioSign −1 — rising BTC / ETH ratio reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
Yahoo · level · sign -1
35.141512.8%
ETH 50d/200d trendSign +1 — rising ETH 50d/200d trend reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
Yahoo · trend_50_200 · sign +1
2282.102517.9%
New DEX pools (24h)Sign −1 — rising New DEX pools (24h) reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
GeckoTerminal · level · sign -1
1000.0%
DeFi TVL growth (90d)Sign +1 — rising DeFi TVL growth (90d) reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
DefiLlama · change90 · sign +1
-8.7%4015.2%
Stablecoin float growth (90d)Sign +1 — rising Stablecoin float growth (90d) reads as risk-on, so the percentile is used as-is. "Signed" column has the same orientation as "high = risk-on" across every indicator.
DefiLlama · change90 · sign +1
+4.9%369.2%

Predictive power & alignment

Spearman ρ · trailing ~11.9y
Index → forward returnSPX 30dSPX 90dSPX 180dETH 30dETH 90dETH 180d
Composite-0.10-0.07-0.04+0.03+0.02-0.04
Macro-0.24-0.30-0.31-0.07-0.19-0.32
On-chain+0.08+0.16+0.19+0.10+0.18+0.17
Index ↔ current price (alignment)SPX nowETH now
Composite+0.20+0.37
Macro+0.33+0.50
On-chain-0.04+0.12

Forward: ρ = rank correlation between today’s index level and the asset’s log return over the next {30, 90, 180} calendar days, evaluated daily over the trailing window. The predictive measure.

Alignment: ρ between today’s index and today’s log-price. A sanity check, not a prediction — does the panel track the asset right now? Note that price-derived indicators (SPX_TREND, IWM_SPY in macro; BTC/ETH ratio, ETH_TREND in on-chain) inflate this by construction.

Cyan = ρ ≥ +0.15, amber = ρ ≤ −0.15, dim = |ρ| < 0.15. Hover any cell for n. Effective independent obs ≈ n / horizon — short-horizon numbers are more trustworthy than 180d.

Backtest · ETH / cash

10bps per rebalance · in-sample 2018–Jan 2024 · out-of-sample Feb 2024–
risk_off · 100% cashneutral · 50% cash / 50% ETHrisk_on · 100% ETH
Strategy×CAGRIn-sampleOut-of-sampleSharpeMax DDTrades
Composite bucket
Default rule on the published composite.
9.39+31.4%+52.4%-10.8%0.77-63.5%83
Macro bucket
Macro panel only.
8.48+29.8%+37.1%+12.4%0.76-60.9%106
On-chain bucket
On-chain panel only.
7.22+27.2%+47.9%-14.2%0.72-74.3%95
Macro inverted
Macro flipped — sells when macro reads risk-on.
0.59-6.3%-6.6%-5.5%0.14-80.9%106
Buy-and-hold ETH
Reference: 100% ETH.
2.95+13.8%+19.5%-0.4%0.58-94.0%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.58-0.0%
Equity curves · log scalerisk-offneutralrisk-on

Out-of-sample window starts 2024-02-01. Risky legs earn each asset’s spot return; cash leg earns the daily-compounded DTB3 (3-month T-bill) yield. Transaction cost = ½ × Σ|Δw| × 10 bps charged only when the bucket changes. Chart background is shaded by composite regime (cyan = risk-on, amber = risk-off).

Reading this honestly: a strategy that beats the HODL baseline on Sharpe or max drawdown but loses on CAGR is doing risk management, not alpha. A strategy that beats on CAGR is either (a) catching real signal or (b) overfit — the in-sample / out-of-sample split is the tell. Big gap = overfit; consistent = plausible signal. None of this controls for path-dependence across the single 8y window.

Backtest · SP500 / cash

10bps per rebalance · in-sample 2018–Jan 2024 · out-of-sample Feb 2024–
risk_off · 100% cashneutral · 50% cash / 50% SP500risk_on · 100% SP500
Strategy×CAGRIn-sampleOut-of-sampleSharpeMax DDTrades
Composite bucket
Default rule on the published composite.
1.99+8.8%+8.3%+9.7%0.86-26.7%83
Macro bucket
Macro panel only.
1.53+5.4%+3.9%+8.8%0.69-15.4%106
On-chain bucket
On-chain panel only.
2.26+10.4%+10.3%+10.2%0.83-33.9%95
Macro inverted
Macro flipped — sells when macro reads risk-on.
2.06+9.2%+7.7%+13.1%0.72-25.9%106
Buy-and-hold SP500
Reference: 100% SP500.
2.75+12.8%+10.1%+19.8%0.72-33.9%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.60-0.0%
Equity curves · log scalerisk-offneutralrisk-on

Out-of-sample window starts 2024-02-01. Risky legs earn each asset’s spot return; cash leg earns the daily-compounded DTB3 (3-month T-bill) yield. Transaction cost = ½ × Σ|Δw| × 10 bps charged only when the bucket changes. Chart background is shaded by composite regime (cyan = risk-on, amber = risk-off).

Reading this honestly: a strategy that beats the HODL baseline on Sharpe or max drawdown but loses on CAGR is doing risk management, not alpha. A strategy that beats on CAGR is either (a) catching real signal or (b) overfit — the in-sample / out-of-sample split is the tell. Big gap = overfit; consistent = plausible signal. None of this controls for path-dependence across the single 8y window.

Backtest · ETH + SP500 + cash

10bps per rebalance · in-sample 2018–Jan 2024 · out-of-sample Feb 2024–
risk_off · 100% cashneutral · 50% cash / 25% ETH / 25% SP500risk_on · 50% ETH / 50% SP500
Strategy×CAGRIn-sampleOut-of-sampleSharpeMax DDTrades
Composite bucket
Default rule on the published composite.
6.12+24.7%+34.9%+1.6%0.87-44.2%83
Macro bucket
Macro panel only.
4.82+21.1%+24.1%+13.5%0.82-37.5%106
On-chain bucket
On-chain panel only.
5.81+23.9%+34.2%+0.2%0.84-47.1%95
Macro inverted
Macro flipped — sells when macro reads risk-on.
1.41+4.2%+3.7%+5.4%0.31-55.4%106
50/50 ETH + SP500 HODL
Reference: always max-risk.
5.32+22.1%+24.6%+15.2%0.67-73.3%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.60-0.0%
Equity curves · log scalerisk-offneutralrisk-on

Out-of-sample window starts 2024-02-01. Risky legs earn each asset’s spot return; cash leg earns the daily-compounded DTB3 (3-month T-bill) yield. Transaction cost = ½ × Σ|Δw| × 10 bps charged only when the bucket changes. Chart background is shaded by composite regime (cyan = risk-on, amber = risk-off).

Reading this honestly: a strategy that beats the HODL baseline on Sharpe or max drawdown but loses on CAGR is doing risk management, not alpha. A strategy that beats on CAGR is either (a) catching real signal or (b) overfit — the in-sample / out-of-sample split is the tell. Big gap = overfit; consistent = plausible signal. None of this controls for path-dependence across the single 8y window.

Composite = 0.5 × macro + 0.5 × onchain. Each panel is a weighted mean of sign-aligned 3y rolling percentile ranks; weights within a panel are inversely proportional to each indicator’s mean absolute correlation with the rest of the panel. Bucket thresholds: composite percentile <33 = risk-off, >67 = risk-on.


Methodology

This implementation

A minimal Tier 1 build of the framework described in the research brief. 20 indicators, two panels, all sources free and key-less.

  • Macro panel (10): 10y–2y curve, real 10y, 5y breakeven, HY OAS, DXY, initial jobless claims, VIX, copper/gold, S&P 50d/200d trend, IWM/SPY breadth — sources: FRED & Yahoo.
  • On-chain panel (10): total DeFi TVL (level + 90d growth), total stablecoin float (level + 90d growth), BTC active addresses, ETH active addresses, BTC MVRV, BTC/ETH ratio, ETH 50d/200d trend, new DEX pools per 24h — sources: DefiLlama, blockchain.com, Coinmetrics community, Yahoo, GeckoTerminal. The last four are crypto market-/firehose-level signals rather than strictly on-chain metrics; included here as crypto risk-regime proxies. The two 90d-growth indicators sit alongside their level versions because position (level) and flow (growth) answer different questions. New DEX pools is an accumulate-forward indicator (GeckoTerminal exposes only the live firehose, not history), so it enters the composite once ~60 days of daily samples are persisted. Spot BTC/ETH ETF flow and SOL active addresses were prototyped via Farside and Coinmetrics community but dropped after upstream APIs added auth/IP restrictions; SoSoValue is a viable free replacement for ETF flows when re-added.
  • Normalization: rolling 3-year percentile rank per indicator, sign-aligned so +1 always means risk-on.
  • Within-panel weighting: inverse-correlation. Each indicator’s weight is inversely proportional to its mean absolute correlation with the rest of its panel — redundant inputs (e.g. correlated rate series) get auto-discounted without manual sub-grouping.
  • Cross-panel: 50/50 average → top-line composite ∈ [0, 1].
  • Bucketing: 3y rolling percentile of the composite — <33 risk-off, >67 risk-on, otherwise neutral.
  • Smoothing: the published regime label requires 5 consecutive trading days in the new bucket before switching, OR a single-day move in composite percentile exceeding of its trailing 1y daily-change distribution (with direction consistent with the new bucket). Filters out boundary-noise flips while still responding quickly to legitimate fast regime shifts.
  • Storage: long-format CSV (atomic write) committed daily to git; current snapshot in public/data/regime-snapshot.json. No database.

Note on regime smoothing

A naive bucket-by-percentile rule (flip the day the composite crosses 0.33 or 0.67) is hypersensitive to noise: data revisions on a handful of recent days cascade through the inverse-correlation panel weights and can flip historical regime labels by 0.001–0.005 in percentile space — enough to cross a hard threshold but well below any meaningful signal. We observed exactly this in production: 8 historical days reclassified between two consecutive cron runs from a single DefiLlama TVL revision. The smoothing rule above (5-day confirmation + 2σ fast-track override) suppresses those single-day flickers while preserving fast response to genuine regime shifts.

The 5-day window sits at the middle of the published convention for daily-frequency regime-switching models: trend-following systems and volatility-regime literature commonly use 3–7 consecutive closes as a confirmation rule (longer windows kill more false positives at the cost of detection lag). The 2σ fast-track is the standard circuit-breaker overlay — calibrated to fire on roughly the top 5% of daily moves (about 12 events per year), which historically matches the cadence of legitimate fast regime shifts like the COVID March 2020 cascade or the August 2024 VIX spike. Both knobs are set from the data’s own noise distribution rather than tuned against backtest CAGR, to avoid p-hacking. See Hamilton (2005) on regime-switching, the BIS bulletin on the August 2024 VIX spike for fast-regime context, and the trend-following whipsaw literature (N-day confirmation filters) for the calibration ranges.

For the full prior-art survey, alternative methods, and design-space mapping behind this build, see the Regime Detection research brief.