Live Dashboard

Regime Classifier

Daily cross-asset risk-on / risk-off composite. Three independent panels — macro, on-chain, and an equity factor panel — recomputed every 24 hours from open data with point-in-time inverse-correlation weights.

Live Composite

Daily regime classification

As of 2026-06-17
Top-line regime
Risk-on
composite 0.57 · 68th pct of last 3y
Macro index
0.61
risk-offrisk-on
On-chain index
0.34
risk-offrisk-on
Equity factor index
0.76
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.29%546.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
2.14%177.5%
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.31%399.0%
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.71%9222.8%
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
119.298610.0%
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
215,0007024.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.44276.8%
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.00153613.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
$73.19B248.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
$313.49B9210.1%
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
477,4802014.2%
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
857,0998713.5%
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
36.851413.6%
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
1748.482516.1%
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
-23.7%1014.6%
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
-0.1%139.4%

Equity factor panel

Indicator24moLastSignedWt
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
7420.108014.6%
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.39126713.4%
High-beta vs low-volSign +1 — rising High-beta vs low-vol 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
2.05819915.2%
Momentum factorSign +1 — rising Momentum factor 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.443010010.0%
Growth vs valueSign +1 — rising Growth vs value 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.50594412.7%
Utilities leadershipSign −1 — rising Utilities leadership 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
0.06009412.1%
Staples vs discretionarySign −1 — rising Staples vs discretionary 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
0.72466911.1%
Shiller CAPE (cyclically adjusted P/E)Sign −1 — rising Shiller CAPE (cyclically adjusted P/E) reads as risk-off, so we flip the percentile (1 − pctile) before averaging. That keeps "Signed" oriented "high = risk-on" across every indicator.
shiller_cape · level · sign -1
30.814910.9%

Predictive power & alignment

Spearman ρ · trailing ~11.7y
Index → forward returnSPX 30dSPX 90dSPX 180dETH 30dETH 90dETH 180d
Composite-0.04+0.00+0.04+0.06+0.05-0.03
Macro-0.15-0.17-0.22+0.02-0.05-0.23
On-chain+0.00+0.05+0.13+0.07+0.12+0.10
Equity factor+0.03+0.11+0.19+0.06+0.04+0.03
Index ↔ current price (alignment)SPX nowETH now
Composite+0.26+0.39
Macro+0.54+0.61
On-chain-0.14+0.08
Equity factor+0.25+0.28

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.
8.57+30.4%+60.1%-20.6%0.75-69.9%88
Macro bucket
Macro panel only.
5.82+24.3%+45.8%-15.5%0.68-70.5%110
On-chain bucket
On-chain panel only.
3.82+18.0%+28.4%-3.6%0.59-78.0%105
Equity factor bucket
Equity factor panel only (only present in /regime_eq).
11.11+34.7%+65.7%-18.5%0.82-71.9%62
Conservative (N-panel)
Any panel off → off; all panels on → on; else neutral.
11.77+35.6%+58.2%-6.3%0.93-52.9%100
Aggressive (N-panel)
Net sum > 0 → on, < 0 → off, = 0 → neutral.
13.74+38.3%+71.8%-18.2%0.85-73.0%104
Buy-and-hold ETH
Reference: 100% ETH.
2.26+10.1%+19.5%-11.0%0.54-94.0%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.81-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.
2.23+10.4%+10.2%+10.7%0.99-21.3%88
Macro bucket
Macro panel only.
1.56+5.6%+4.7%+7.6%0.69-15.8%110
On-chain bucket
On-chain panel only.
1.54+5.5%+5.3%+6.0%0.51-34.7%105
Equity factor bucket
Equity factor panel only (only present in /regime_eq).
2.01+9.0%+6.5%+14.9%0.76-27.3%62
Conservative (N-panel)
Any panel off → off; all panels on → on; else neutral.
1.45+4.7%+5.4%+3.2%0.76-14.6%100
Aggressive (N-panel)
Net sum > 0 → on, < 0 → off, = 0 → neutral.
1.77+7.3%+6.1%+10.0%0.66-31.3%104
Buy-and-hold SP500
Reference: 100% SP500.
2.75+12.7%+10.1%+19.0%0.72-33.9%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.82-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.14+25.2%+38.9%-2.8%0.88-42.6%88
Macro bucket
Macro panel only.
4.14+19.2%+28.9%-1.5%0.75-40.9%110
On-chain bucket
On-chain panel only.
3.45+16.5%+22.2%+4.0%0.65-52.6%105
Equity factor bucket
Equity factor panel only (only present in /regime_eq).
6.42+25.8%+37.9%+0.6%0.91-42.9%62
Conservative (N-panel)
Any panel off → off; all panels on → on; else neutral.
4.93+21.8%+32.1%+0.2%1.00-34.1%100
Aggressive (N-panel)
Net sum > 0 → on, < 0 → off, = 0 → neutral.
7.21+27.7%+42.0%-1.4%0.91-45.4%104
50/50 ETH + SP500 HODL
Reference: always max-risk.
4.68+20.0%+24.6%+8.5%0.63-73.3%
All-stables
Reference: 100% DTB3 yield.
1.24+2.6%+1.9%+4.3%26.82-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

How it works

  • Macro panel (8): 10y–2y curve, real 10y, 5y breakeven, HY OAS, DXY, initial jobless claims, VIX, copper/gold — sources: FRED & Yahoo.
  • On-chain panel (10): DeFi TVL (level + 90d growth), stablecoin float (level + 90d growth), BTC/ETH active addresses, BTC MVRV, BTC/ETH ratio, ETH 50d/200d trend, new DEX pools per 24h — sources: DefiLlama, blockchain.com, Coinmetrics, Yahoo, GeckoTerminal.
  • Equity factor panel (8): high-beta vs low-vol (SPHB/SPLV), momentum (MTUM/SPY), growth vs value (IWF/IWD), utilities leadership (XLU/SPY), staples vs discretionary (XLP/XLY), S&P 500 50d/200d trend, IWM/SPY breadth, Shiller CAPE — sources: Yahoo Finance and the Shiller spreadsheet mirror. Sign-stable equity risk-appetite + style + valuation signals.
  • Normalization: rolling 3-year percentile rank per indicator, sign-aligned so +1 always means risk-on.
  • Within-panel weighting: point-in-time inverse-correlation. Each day’s weights use only the trailing 3-year window — no look-ahead. Redundant inputs get auto-discounted without manual sub-grouping. 25% per-indicator cap.
  • Composite: arithmetic mean of all three panel indices, then 3y rolling percentile, bucketed at 0.33 / 0.67.
  • 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-eq-snapshot.json. No database.

Why three panels

The macro panel reads upstream causes — monetary policy, credit conditions, the labor market. The on-chain panel reads crypto-native flows and network health. The equity factor panel reads the behavioral response of price-setters who have already digested the upstream inputs and are committing capital. Three independent viewpoints on the same risk regime, blended into one composite. Walk through the comparison and per-panel attribution in the research write-up.

For the original two-panel classifier (macro + on-chain only, kept as a reference) see /regime_2panel. For the full prior-art survey and design-space mapping, see the Regime Detection research brief.