All articles
metrics api on-chain cycle bitcoin

Bitcoin Regime Score: Stop Calling the Top, Start Naming the State

Most on-chain indicators are built to answer one question: is bitcoin expensive or cheap? MVRV, NUPL, Reserve Risk, Puell — all of them place price somewhere on a valuation axis, and all of them are useful. But that axis has a blind spot that anyone who lived through 2017 will recognise: expensive and still climbing and expensive and rolling over look identical on a valuation chart, and they are the two most different states a market can be in.

The Bitcoin Regime Score, now available in the BGeometrics API, is an attempt to close that gap. It is a 0-100 composite, but the number is only half the output. The other half is a label: EXPANSION, DISTRIBUTION, CAPITULATION, RECOVERY or TRANSITION.

How it is built

Six dimensions, each weighted, each normalised the same way:

DimensionWeightInputs
On-chain30MVRV Z-Score, NUPL, aSOPR (30d), Reserve Risk, LTH net position change
Trend20Mayer Multiple, price / 200-week MA, 90-day return, RSI
Volatility1030-day realised volatility, 30d/90d volatility ratio
Funding15Perpetual funding rate (7d mean), open interest / market cap
Exchange flows1530d exchange netflow, 30d reserve change, 30d miner netflow
ETF flows1030d net flow of the US spot ETFs, in BTC

Every input is converted to its expanding historical percentile: each day is scored only against days that came before it. There is no look-ahead bias — the value the API returns for 14 December 2017 is computed from data available on 14 December 2017, not from what we know now.

Because funding data begins in 2023 and spot ETFs did not exist before January 2024, the composite is a weighted mean over whatever components exist that day, and the API returns an active_weight field so you always know what went into a given value. It sits at 75 for most of the series and reaches 100 from 2025 onward.

Level plus direction

The regime label comes from combining the score with its own 30-day slope (measured on a 7-day smoothed score, to stop it flickering):

                    score ≥ 60
                        |
       DISTRIBUTION     |     EXPANSION
         (falling)      |      (rising)
    --------------------+--------------------   30-day direction
       CAPITULATION     |      RECOVERY
         (falling)      |      (rising)
                        |
                    score ≤ 40

              40 < score < 60  →  TRANSITION

That single addition is what separates a market that is merely expensive from one that is actively topping out, and a market that is merely cheap from one that is still breaking down.

The part we got wrong first

When we specified the metric, two of the six dimensions were given what seemed like the obvious orientation: a calm market is a healthy, risk-on market, and coins leaving exchanges is bullish accumulation. Both are widely repeated. Both turned out to be backwards.

We tested it rather than assuming it, by correlating every component against a neutral cycle-temperature reference — where price sits within its own trailing four-year distribution. Five components came back negatively correlated. Realised volatility is high at cycle extremes, not low. Exchange inflows and miner distribution are what accompany tops, not outflows.

Correcting those orientations lifted the composite’s correlation with the cycle reference from 0.744 to 0.782, moved December 2017 from TRANSITION to DISTRIBUTION, and moved June 2022 from RECOVERY to CAPITULATION. It is a small reminder that on-chain folk wisdom is worth measuring before it is worth trusting.

What 15 years of history says

The series runs from November 2011 to today — 5,380 days. Grouping every day by its regime and measuring what price did afterwards:

RegimeDaysShareMedian 90dMedian 180dMedian 365d
CAPITULATION1,43726.7%+8.0%+31.2%+93.3%
RECOVERY65412.2%+0.9%+38.3%+88.0%
TRANSITION2,23041.4%+14.2%+36.1%+104.6%
EXPANSION71013.2%+33.6%+43.6%+74.9%
DISTRIBUTION3496.5%−15.9%+3.6%−1.4%

Against a whole-sample median of +91% at one year, one result stands out: DISTRIBUTION is the only state that has historically not paid. It is negative at 90 days, roughly flat at a year, and it is rare — 6.5% of all days. EXPANSION, at the other corner, has by far the strongest 90-day median.

The two cold states behave the way you would hope: weak over three months, strong over a year. Being right about a bottom and being early about a bottom are the same thing.

The DISTRIBUTION episodes themselves land where you would want them to:

EpisodeDaysAvg scoreBTC at start
Apr–Jun 20135369$104
Dec 2013 – Feb 20145271$688
Jun–Aug 20173469$2,558
Sep–Oct 20173668$4,615
Dec 2017 – Mar 20184169$13,942
Jan–May 20217873$34,366

Where it fails

An honest launch has to include the failure modes, and this one has three worth knowing before you build anything on it.

It is not a sell signal. Look again at the 2017 rows. The June and September 2017 DISTRIBUTION episodes were followed by 90-day returns of +96% and +267%. The aggregate median of −15.9% conceals enormous dispersion: the state flags elevated risk, and in a parabolic advance elevated risk can persist for months while price triples. Treating a DISTRIBUTION print as an instruction to exit would have cost you the best quarter of that cycle.

The sample of top calls is small. There are 13 DISTRIBUTION episodes in fifteen years and only six lasting more than a month. Every statistic in the table above is computed on overlapping windows, so the effective number of independent observations is far smaller than the day counts suggest. Bitcoin’s secular uptrend also inflates every one-year figure — which is precisely what makes DISTRIBUTION interesting, since it is the one state that escapes it.

It has not flagged the last two cycle highs. This is the big one. The score peaked at 73 in the April 2021 DISTRIBUTION episode, but November 2021 topped out at 65 and read TRANSITION. The October 2025 all-time high of $124,891 scored 55.3 — also TRANSITION. The cause is structural: the amplitude of Bitcoin’s cycles is compressing. Peak MVRV Z-Score was 9.6 in 2013, 10.1 in 2017 and 3.5 by late 2021. An expanding percentile scores each new top against every prior one, so each cycle reads cooler than the last.

We tested a four-year rolling window as the fix. It correlates slightly worse (0.774) and does not rescue November 2021 either, so the expanding percentile stayed. If cycle amplitude keeps decaying, the 60/40 thresholds will need revisiting — and that is a known open question, not a solved one.

Where we are now

As of 5 August 2026, with bitcoin near $64,674:

  • Regime Score: 35.5 — RECOVERY (30-day direction +6.7)
  • On-chain 28.0 · Trend 23.3 · Volatility 23.3 · Funding 55.6 · Flows 54.8
  • active_weight 90 (the ETF component lags by two days)

A cold market that has stopped getting colder. On-chain valuation and trend are both deep in the bottom quartile of their own history, while positioning and flows sit near the middle. On the table above, that is the state with a +88% median one-year return and a roughly flat next quarter — historically a zone for patience rather than urgency.

Using it

The metric is a daily series available from November 2011, recomputed in full every day so that late-arriving upstream data is folded back into the history.

Regime Score is a subscriber endpoint: it requires an API token, and requests without one return 403. You can get a token here — then append it to any of these:

GET https://bitcoin-data.com/v1/regime-score/last?token=YOUR_TOKEN
GET https://bitcoin-data.com/v1/regime-score?token=YOUR_TOKEN
GET https://bitcoin-data.com/v1/regime-score?token=YOUR_TOKEN&startday=2021-01-01&endday=2021-12-31

A single row looks like this:

{
  "d": "2026-08-05",
  "unixTs": 1785888000,
  "regimeScore": 35.5,
  "regime": "RECOVERY",
  "regimeDelta30d": 6.7,
  "activeWeight": 90.0,
  "onchainScore": 27.99,
  "trendScore": 23.31,
  "volatilityScore": 23.32,
  "fundingScore": 55.61,
  "flowScore": 54.76,
  "etfScore": null
}

Every subscore ships alongside the composite, so you can rebuild it with your own weights if you disagree with ours. (etfScore is null here because the ETF flow data runs about two days behind — which is exactly why activeWeight reads 90 rather than 100.) Full schema in the API documentation.

It is also available as a chartable metric in the BGeometrics dashboard under Indexes.

Disclaimer: This article is informational analysis and does not constitute financial advice. Do your own research (DYOR). Investing in Bitcoin carries the risk of total loss.