How every chart is computed.
The source-of-truth for every formula, window length, and reconstruction choice on the site. One section per chart, deep-linkable.
Every model on btc oak is reproducible from the same daily-close history, the same halving schedule, and the same nightly-refit regression. This page is the authoritative methodology reference — every formula, every window length, every reconstruction choice, every conscious deviation from a published canonical, indexed by chart slug. Each chart slug below has its own section; click through to deep-link straight to the indicator you’re auditing.
Where btc oak’s number disagrees with a third-party reference, the disagreement is documented in that section’s notes — see the data sources page for upstream attribution. Numbers refresh nightly; the timestamp at the bottom of every chart page tracks the most recent run.
Cycles
7 chartsThe Rainbow Chart
Bitcoin's price plotted on a log axis against an OLS regression of log₁₀(price) = a · ln(days_since_genesis) + b, refit nightly. Nine valuation bands sit at parallel 0.1-log₁₀ offsets above and below the centre line. The fit traces back to a 2014 BitcoinTalk thread by user Trolololo, with the rainbow-band visualisation contributed separately by Reddit user azop and merged by Blockchain Center in 2019.
Stock-to-Flow
Formula. S2F(t) = stock(t) / flow(t); flow(t) = subsidy_t × 144 × 365. The model regression is ln(price_i) = a + b · ln(S2F_i); implied model price price_model = exp(a) · S2F^b. Framing: PlanB, Modeling Bitcoin's Value with Scarcity, Medium, 22 Mar 2019, with reported coefficients a ≈ 14.6, b ≈ 3.3 on a market-cap regression and R² ≈ 95%. Window. Full price history; coefficients refit nightly. Inputs. Daily closes plus the halving schedule (block 210,000 / 25 BTC on 2012-11-28, 420,000 / 12.5 BTC on 2016-07-09, 630,000 / 6.25 BTC on 2020-05-11, 840,000 / 3.125 BTC on 2024-04-19) and the 144-blocks-per-day target. Reconstruction notes. The 144-blocks-per-day target underestimates realised issuance by ≈ 2% (real blocks land at ~147/day) but preserves the doubling step at each halving — the feature the model is built to highlight. Stock is cumulative completed-era issuance plus pro-rated current-era issuance; flow is the current annualised subsidy, not a rolling average. Known divergences. The 2021–2024 divergence between model and realised price is the chart's headline feature and is documented in detail on /stock-to-flow. Adversarial sources (Cordeiro 2020, Burger 2022, Wall's catalogue) are cited on the page, not buried.
Power-Law Corridor
Formula. log₁₀(price_i) = n · log₁₀(days_i) + log₁₀(A) + ε_i, fit by OLS on every daily close since 18 Jul 2010. The corridor is drawn at ±1.5σ of the residual log₁₀(price) − (n · log₁₀(days) + log₁₀(A)); on a normal-residual approximation that bounds ≈ 87% of historical observations. Days are counted from the Bitcoin genesis block (3 Jan 2009 UTC). Window. Full price history; refit nightly. Inputs. Daily closes only. Reconstruction notes. Two canonical primary sources differ slightly in coefficient naming. Burger's 2019 piece used price = 10^(a + b·log₁₀(d)) with a = −17.01593313, b = 5.84509376; Santostasi's 2024 reframing uses price = A · days^n with n ≈ 5.8. The two are equivalent up to a base-of-logarithm change. There is no peer-reviewed Santostasi-authored paper; the user-supplied arXiv ID 2409.03676 is a different paper (Ghosh / Biswas / Chakrabarti, Signature of maturity in cryptocurrency volatility) that cites Santostasi but is not authored by him. Known divergences. The exponent flattens slowly cycle by cycle as new data arrives; today's fit sits a few percent below the 2019 published value. The model carries the spurious-regression critique (Stolte, Amdax 2022) and the early-history-weighting bias (Cox, mNAV Insights) explicitly on the chart page.
Pi Cycle Top
Formula. 111DMA(t) = mean(price[t−110..t]); 350DMA(t) = mean(price[t−349..t]); trigger(t) = 2 × 350DMA(t). A signal is recorded on day t when 111DMA(t−1) ≤ trigger(t−1) and 111DMA(t) > trigger(t) — one-directional, no down-cross signal published. Framing: Philip Swift, April 2019; canonical statement reprinted in The Golden Ratio Multiplier, Medium, 17 Jun 2019. Ratio 350 ÷ 111 ≈ 3.153 ≈ π. Window. Both MAs are simple, daily, calendar-aligned (Bitcoin trades every day so the calendar/trading-day distinction collapses). Inputs. Daily closes only. Known divergences. Some implementations express the indicator as a ratio (111DMA ÷ 350DMA against a fixed 2.0 threshold) rather than a crossover. The two are mathematically equivalent at the trigger; the crossover form is author-canonical. The 2024 and 2025 ATH windows have come and gone without a cross — the first time the indicator has missed two consecutive ATHs on the daily-close record. This is documented on the chart page itself.
200-Week Moving Average Heatmap
Formula. 200WMA(t) = mean(price[t−1399..t]); delta_4w(t) = (200WMA(t) − 200WMA(t−28)) / 200WMA(t−28) × 100. The four-week rate of change of the moving average is the colour-mapped quantity. Window. 1,400 daily closes (200 calendar weeks); 28-day rate-of-change window. First fully-formed reading lands 18 May 2014 (1,400 days after the 18 Jul 2010 series start); rows before that are excluded. Inputs. Daily closes only. Reconstruction notes. The original 200WMA-heatmap framing (PlanB, January 2019; reproduced widely on mainstream explainer pages) describes the colour mapping qualitatively as “month-on-month percentage change of the 200 week moving average” without publishing exact breakpoints. The colour bands at 2% / 4% / 6% / 8% / 10% are conventional and bracket the historical bottoming and topping windows; they are not author-canonical. The /200w-ma page exposes the underlying 4w-RoC numerically alongside the heatmap so a reader can audit the colour assignment. Known divergences. Different implementations of the 200WMA heatmap can disagree on which colour a given date falls into — the disagreement is always at the threshold boundary, not in the underlying rate-of-change number. The 2024–2025 readings stayed inside the cool-mid band; this is the chart's signature blind-spot for the post-ETF cycle and is documented on the page itself.
Golden-Ratio Multiplier
Formula. 350DMA(t) = mean(price[t−349..t]); band lines drawn at m × 350DMA(t) for m ∈ {1.6, 2, 3, 5, 8, 13, 21}. Band assignment at any date is the largest m that price equals or exceeds. Framing: Philip Swift, The Golden Ratio Multiplier, Medium, 17 Jun 2019. Window. 350 daily closes — Swift selected the window because it produced the cleanest band alignment with the 2013 and 2017 cycle tops at publication. Inputs. The upstream-published 350-day MA series and the seven canonical multipliers (1.6 / 2 / 3 / 5 / 8 / 13 / 21). Reconstruction notes. Band lines are drawn from the multipliers against the live MA series, so the multiplier set is the only definitional input. Pre-warm-up rows (the first 349 daily closes after series start, ≈ Jul 2010 – Jun 2011) are excluded; the 2011 cycle peak therefore sits before the indicator's first defined day. Known divergences. The peak-multiplier mapping Swift originally published (×21 / ×13 / ×8 / ×5 for 2011 / 2013 / 2014-echo / 2018 high) is anchored to specific cycle dates; the table on /golden-ratio recomputes the price ÷ 350DMA at the canonical cycle peaks against the live MA series and continues the sequence through 2024.
Drawdown from All-Time High
Formula. For every daily close t, ath[t] = max(price[0..t]) and dd[t] = price[t] / ath[t] − 1; the series is non-positive by construction and resets to zero whenever a new running maximum is set. days_since_ath[t] is the calendar-day count since the running maximum was last set. Window. Full daily-close history from 18 Jul 2010 onward; no smoothing, no warm-up. Inputs. A single series — daily closes (Mt. Gox-era CSV merged with the live daily close feed). Regime bands. Empirical thresholds at −15% (correction), −35% (bear territory), −55% (deep bear), −80% (historic-bottom zone); not author-canonical, set to bracket the four cycle troughs on record. Reconstruction notes. Daily closes round off intraday lows, so the canonical 2011-Jun flash-crash and a handful of 2014 prints register as shallower drawdowns than an intraday-resolution series would. The bear-market-anatomy table on /drawdown emits one row per multi-month underwater stretch (≥ 60 days, ≥ 20% drawdown), filtering out single-day blips. Known divergences. Glassnode's market.PriceDrawdownRelative uses an equivalent definition; the two agree to within rounding on close-data drawdown depth.
On-chain
14 chartsFear & Greed Index
Formula. A 0–100 daily composite of six fixed-weight components — Volatility 25%, Market Momentum / Volume 25%, Social Media 15%, Surveys 15% (currently paused), Dominance 10%, and Trends 10%. Each sub-score is normalised 0–100 against trailing 30 / 90-day baselines on its own input series, then weighted into the composite. Regimes. Canonical 0–25–50–75 splits — Extreme Fear / Fear / Greed / Extreme Greed. Active since launch on 1 February 2018; the regime cuts have not changed. Window. Daily; series back to 2018-02-01. Inputs. The daily 0–100 scalar from the upstream index, plus our daily Bitcoin closes for the cycle overlay and forward-return cluster. Reconstruction notes. Five of the six components derive from market data (volatility, volume, dominance, social and trends are price-or-attention-sensitive); only the survey component is independent, and that component is currently paused. The structural consequence is that the index moves with price more often than ahead of it. The forward-return cluster on /fear-greed reports median 30 / 90 / 180-day BTC returns from every Extreme Fear and Extreme Greed print on the daily-close record. Known divergences. The lowest reading on the daily series is 6, printed inside the June 2022 Three-Arrows / Terra stress window; the November 2018 cycle-low region produced single-digit prints. The 2021 cycle topped twice with sustained Extreme Greed for weeks. The 2024 pre-halving high cleared 90 in early March 2024. Sustained regimes can persist for months — the index is a regime confirmation, not a trigger.
Puell Multiple
Formula. Puell(t) = Issuance_USD(t) / SMA365(Issuance_USD), where daily issuance USD is the deterministic product of today’s subsidy in BTC × 144 blocks-per-day target × spot. Framing: David Puell, The Puell Multiple, Medium, 30 Mar 2019. Window. 365-day SMA on the denominator; halving steps remain visible because the SMA window crosses each halving over six months. Inputs. The halving schedule (210k / 420k / 630k / 840k blocks) and daily closes. Reconstruction notes. The 144-blocks-per-day target underestimates realised issuance by ≈ 2% (real blocks land at ~147/day) but preserves the doubling step at each halving — the feature the model is built to highlight. Subsidy-only construction; fee revenue is excluded by design (the original Puell framing). Known divergences. Peaks have decayed monotonically: 10.49 (Apr 2013) → 9.29 (Nov 2013) → 6.62 (Dec 2017) → 3.46 (Apr 2021) → 1.95 (Nov 2021) → 2.44 (Mar 2024). The 4× blow-off ceiling has not fired since 2017; trough band has held at ~0.30–0.43 across all four cycle bottoms. The half-year windows after each halving are biased low due to the SMA trailing the new lower subsidy — documented on /puell-multiple.
Net Unrealized Profit / Loss
Formula. NUPL(t) = (market_cap(t) − realized_cap(t)) / market_cap(t) = 1 − 1 / MVRV(t). The mathematical identity with MVRV is exact — NUPL re-expresses the same gap on a 0-to-1 normalised scale. Framing: the term entered common usage via Adamant Capital’s Bitcoin Investor Guide (2018), but the five named bands (Capitulation / Hope-Fear / Optimism-Anxiety / Belief-Denial / Euphoria-Greed) are downstream framing. Window. Daily, full history; pre-exchange zero-fill rows are dropped so the chart Y-axis doesn’t compress around zero. Inputs. Reuses the MVRV inputs — same realized-cap reconstruction, same circulating-supply schedule. Reconstruction notes. Cycle peak readings: 0.83 (2013-Apr) → 0.84 (2013-Nov) → 0.79 (2017-Dec) → 0.75 (Apr 2021) → 0.66 (Nov 2021) → 0.64 (Mar 2024). Time-in-band distribution is the page’s distinctive angle: Euphoria (>0.75) hosts 14% of cycle-1 days, 0.6% of cycle-2 days, 0% of cycle-3 days, 0% of cycle-4 days. Known divergences. Adamant’s primer doesn’t name “NUPL” or define the five-band partition explicitly — that nomenclature was popularised downstream. Documented on /nupl.
AHR999 Index
Formula. AHR999 = (price / GeoMean200) × (price / LogFit(t)), where GeoMean200 is the 200-day geometric mean of spot, and LogFit(t) is a power-law fit price ≈ a × t^b with t = days since the Bitcoin genesis block (3 Jan 2009 UTC). Framing: Chinese pseudonymous analyst Ah Hui (阿瓜 / 999), mid-2018, on Chinese-language Bitcoin forums. Window. 200-day geometric mean for the medium-term factor; expanding-window OLS on the log-fit factor (refit nightly). Inputs. Daily closes only. Reconstruction notes. The two-factor product compresses both timeframes onto one scale — the “DCA zone” threshold of 0.45 only fires when price is depressed on both. Cycle troughs sit in a tight band: 0.285 (Jan 2015), 0.282 (Dec 2018), 0.244 (Mar 2020 — record low), 0.273 (Nov 2022). Known divergences. The log-fit factor drifts as data accumulates — modern AHR999 is not directly comparable to 2014 readings in absolute terms. Bottom-side threshold has held cycle-over-cycle; top-side has compressed by an order of magnitude (45.98 in 2013 vs 1.95 in 2024). Documented on /ahr999.
Reserve Risk
Formula. ReserveRisk(t) = price(t) / HODLBank(t), where the HODL bank is the path-integral of value-days-destroyed weighted by how cheaply coins have been held over their lifetime. Framing: Hans Hauge, 2019, building on the Coin-Days-Destroyed primitive ByteCoin introduced in bitcointalk #11178 (April 2011). Window. Full chain history; the HODL bank is a near-monotonic accumulator. Inputs. The upstream Reserve Risk series (HODL-bank denominator computed upstream from on-chain spend data). Reconstruction notes. The display window starts 2013 once the HODL bank has accumulated enough mass to make the denominator stable; pre-2013 prints are unreliable. Known divergences. The 0.008 ceiling has compressed dramatically: 0.0373 (2013-Apr) → 0.0387 (2013-Nov) → 0.0323 (2017-Dec) → 0.0094 (Apr 2021) → 0.0055 (Nov 2021) → 0.0025 (Mar 2024). Bottom-side has held: 0.00104 / 0.00159 / 0.00120 / 0.00079 (the 2022 post-FTX low is the deepest reading on the entire series). The HODL bank is invisible to off-chain custody (ETF wrappers, lending positions); documented on /reserve-risk.
RHODL Ratio
Formula. RHODL(t) = (RealizedCap_1w(t) / RealizedCap_1y2y(t)) × supply_factor(t), where the buckets are 1-week and 1-to-2-year HODL Waves slices respectively, and the supply factor rescales by total circulating supply at time of calculation. Framing: Philip Swift (LookIntoBitcoin / DecenTrader), February 2020, building on the HODL Waves age-band framework Unchained Capital introduced in 2018. Window. Full HODL-wave history since 17 Aug 2010 — among the longest of any indicator on the site. Inputs. The upstream RHODL series. Reconstruction notes. Log-axis display because the indicator spans roughly four orders of magnitude across a cycle. Known divergences. The 50k Swift ceiling fired only at 2013-Nov (212k) and 2017-Dec (106k). Modern peaks compressed: 15.3k (Apr 2021) / 14.7k (Nov 2021) / 7.8k (Mar 2024). Cycle troughs stayed tight: 102 (Feb 2015), 192 (Jan 2019), 198 (Dec 2022). Custodial reshuffling and ETF flows age-reset coins without implying real distribution — biases the 1-week numerator up post-Jan-2024. Documented on /rhodl.
STH / LTH SOPR
Formula. SOPR(t) = meani ∈ spends(t)( price_spenti / price_acquiredi ). STH-SOPR restricts to outputs < 155 days old; LTH-SOPR restricts to outputs ≥ 155 days old. Framing: Renato Shirakashi, Introducing SOPR, Medium, 24 Apr 2019; the cohort split follows Schultze-Kraft & Heeg (2020), which identifies 155 days as the empirical point at which coin spending probability stabilises. Window. Daily, no smoothing; many analysts apply a 7-day MA for visualisation. Inputs. Upstream STH-SOPR and LTH-SOPR series. Reconstruction notes. The 155-day boundary is the same one used by realized-price and RHODL — it’s a convention, not a hard economic distinction. Known divergences. STH SOPR cycle peaks have been remarkably stable across cycles (1.11 to 1.40); LTH SOPR has compressed by an order of magnitude (35 / 298 / 56 / 13 / 5.1 / 5.6) as the cohort matures and lost-coin distortion grows. The April 2018 Coinbase Multibit migration produced a multi-day spike that is a known historical artefact. Documented on /sopr.
STH / LTH Realized Price
Formula. Two cohort cost-basis lines — STH and LTH realized price — published as separate series. The 155-day cohort boundary is the empirical threshold from Schultze-Kraft & Heeg (2020). Framing: realized-cap framework from Antoine Le Calvez and Nic Carter, Baltic Honeybadger 2018 conference. Window. Daily, full history. Inputs. Upstream STH-realized-price and LTH-realized-price series. Reconstruction notes. Spot crossing below LTH realized price has historically marked durable cycle bottoms; the 2020 Covid flush bottomed at +5.34% above LTH ($5,032.50 spot vs $4,777.30 LTH on 2020-03-17) — the Covid bottom did not actually go below LTH on the daily-close record, despite the framing of cycle-bottom narratives that conflate it with 2018 and 2022. Known divergences. Loss-residency (% of all-time days where spot < LTH cost basis) is documented on the chart page and provides cross-cycle anchoring. STH/LTH spread reads as a cycle-phase indicator: tight spread = early cycle, wide spread = late cycle. Documented on /realized-price.
MVRV Ratio
Formula. MVRV(t) = market_cap(t) / realized_cap(t); realized_cap(t) ≈ STH_supply(t) × STH_RP(t) + LTH_supply(t) × LTH_RP(t). Market cap = spot × circulating supply (deterministic from halving schedule). Framing: Mahmudov & Puell, MVRV Ratio, 1 Oct 2018, building on the Le Calvez/Carter realized-cap framework. Window. Daily, full history (~5,000 days). Inputs. Holder-supply (STH/LTH cohort series), realized-price (STH/LTH cohort series), daily closes, halving schedule. The realized cap is reconstructed entirely from cohort holder-supply and realized-price series. Reconstruction notes. The two-bucket realized-cap reconstruction tracks per-UTXO ground-truth realized cap to within a few percent across the full history. The gap is most material near the 1.0 and 3.7 thresholds; cohort migration (coins ageing past 155 days) lifts LTH realized price mechanically and contributes a small upward bias to realized cap during strong bull regimes. Known divergences. The 3.7 topping ceiling has not fired since December 2017: 5.63 (Apr 2013) → 5.39 (Nov 2013) → 5.11 (2017) → 3.94 (Apr 2021) → 2.93 (Nov 2021) → 2.76 (Mar 2024). Bottom-side compression: 0.54 (2015) → 0.69 (2018) → 0.80 (2022). Documented on /mvrv.
MVRV Z-Score
Formula. Z(t) = (market_cap(t) − realized_cap(t)) / Stdevexpand(market_cap), where the stdev is computed on every observation since 18 Aug 2011 (the expanding window, Awe & Wonder original definition). Framing: pseudonymous analyst Awe & Wonder, 2018, building on the MVRV ratio. Window. Expanding-window stdev so cycle thresholds remain comparable; LookIntoBitcoin’s reconstruction also uses expanding (not rolling). Inputs. MVRV-Z reuses the same realized-cap inputs as MVRV; both refresh in one nightly pass. Reconstruction notes. The expanding stdev grows with each new observation, mechanically lowering the Z-equivalent of any future market-cap gap. The mirror of Awe & Wonder’s original Medium post (the Medium URL was deleted) is preserved at cryptowords.github.io/bitcoin-mvrv-z-metric. Known divergences. The +7 ceiling fired only in 2011, 2013 (×2), and 2017. Modern peaks: +6.90 (Apr 2021) / +3.54 (Nov 2021) / +2.97 (Mar 2024). Cycle troughs: −0.61 (2015) / −0.46 (2018) / −0.16 (2020 Covid) / −0.35 (2022 FTX). Documented on /mvrv-z.
HODL Waves
Formula. LTH(t) = supply held in UTXOs last spent ≥ 155 days ago / circulating(t); STH(t) = 1 − LTH(t). The 90-day change in LTH dominance, in fractional points, is the direction signal carried in the reading row. Cohort threshold. The 155-day boundary is the empirical threshold Rafael Schultze-Kraft and Kilian Heeg established in their 2020 cohort-analysis paper as the day count at which an unspent transaction output’s conditional spend probability flattens to a near-constant baseline. The same threshold drives /sopr, /realized-price, /mvrv, and /rhodl. Framing. Dhruv Bansal’s Bitcoin Data Science (Pt. 1): HODL Waves, April 2018; the canonical chart slices supply into a dozen age bands. The two-bucket form on this site collapses those bands at the 155-day cohort boundary. Window. Daily; coverage since 2011-08-18. Inputs. Daily STH and LTH share of total supply, plus the implied total circulating supply derived from the STH+LTH sum. Reconstruction notes. Cohort dominance is a supply-age statement, not an ownership statement. A spot-ETF custody wallet that holds coins on behalf of underlying shareholders ages those coins through the 155-day boundary identically to a self-custody cold wallet; the on-chain record shows accumulation while the underlying ownership may have churned through hundreds of distinct shareholders. The gap between supply-age and distinct-owner ownership has widened materially since January 2024. Known divergences. The per-cycle peak-to-trough swing is the page’s headline read — prior cycles redistributed 20+ percentage points of LTH dominance from accumulation peak to topping trough; the 2024 cycle has so far moved the smallest band on record. Lost coins (Patoshi-era and otherwise) sit permanently in the LTH band by construction, lifting the structural LTH baseline by a few percentage points. Documented on /hodl-waves.
Active Addresses
Formula. AA(t) = | { addr : addr appears as input or output of a confirmed tx on day t } |; sma30(t) = mean(AA(t−29) ... AA(t)); yoy(t) = sma30(t) / sma30(t−365) − 1. Each distinct address counts once per day; coinbase issuance rows with no sender address are excluded. Regime. Keyed off the year-over-year change on the 30-day SMA — > +30% Expansion, < −10% Contracting, otherwise Stable. Window. Daily; coverage since 2010-08-17. Inputs. Daily unique-address counts and the 30-day rolling mean. Reconstruction notes. Address-clustering convention varies across publishers — some dashboards collapse known-exchange wallet sets into a single entity, some don’t. Cross-publisher comparisons should check the clustering rule before reading the absolute level; the YoY direction is more robust to the choice. Known divergences. Three structural distortions matter. First, a custodial exchange routes transactions for thousands of customers through a small handful of addresses (under-counts retail). Second, a privacy-conscious user can rotate through a fresh address per receive (over-counts a single user). Third — the post-2023 story — inscription protocols generate large volumes of base-layer transactions while reusing a small handful of marketplace addresses, so address counts compress while transaction counts and fees rise. The per-cycle peak table on /active-addresses shows USD-per-active-address rising threefold across cycles even as the address set itself flattened. Reading the chart as a clean adoption proxy in 2026 is a category error.
New Addresses
Formula. NA(t) = | { addr : addr appears on chain for the first time on day t } |; sma30(t) = mean(NA(t−29) ... NA(t)); sma90(t) = mean(NA(t−89) ... NA(t)); yoy(t) = sma90(t) / sma90(t−365) − 1. First-touch only — an address that has ever previously appeared in any confirmed transaction is excluded. Regime. Keyed off the YoY change on the 90-day SMA — > +30% Accelerating, < −15% with positive price YoY Adoption divergence, otherwise Normal. Window. Daily; coverage since 2010-08-17. Inputs. Daily first-touch address counts plus the 30 / 90-day rolling means. Reconstruction notes. The first-touch convention is standard across major on-chain dashboards. The structural over-count from HD-wallet receive-address rotation grows with the share of activity routed through wallet defaults; cross-cycle level comparisons should weight the SMA direction over absolute counts. Known divergences. The 30-day SMA of new addresses has bottomed before each Bitcoin cycle price low on the record — the lead has averaged two to four months. The cycle-lead table on /new-addresses walks the four major lows (2015, 2018, 2020 Covid, 2022 post-FTX) and prints the lead in days. Inscription waves (Ordinals from January 2023, Runes from the April 2024 halving) produce single-day spikes of single-use receive addresses that inflate the count without representing first-time human on-boarding; the 90-day SMA absorbs most of the spike but not all of it.
Bitcoin Correlations
Formula. ρ90d(BTC, X)t = Cov(rBTC, rX) / (σBTC · σX) where r denotes daily log returns (ln(close / close−1)) and the covariance and standard deviations are computed over the trailing 90 aligned trading days. Reference universe. Five exchange-traded funds — GLD (gold), QQQ (Nasdaq-100), SPY (S&P 500), IWM (Russell 2000 small-caps), and TLT (20+ Year Treasury Bond). ETFs are used over the underlying indices so the dividend-and-distribution-adjusted total-return matches what an investable benchmark would actually deliver. Regime. Keyed off the strongest-by-magnitude coefficient — |ρ| < 0.30 Idiosyncratic; top-by-magnitude TLT Risk-off-linked; top GLD Gold-linked; top SPY/QQQ/IWM Risk-on-linked; flipping top correlate Mixed. Window. Daily; coverage since 2010-09-15. Equity returns are New-York-close-to-New-York-close; Bitcoin’s 24/7 returns are folded onto the equity calendar so the Friday-to-Monday bar carries the weekend price action. Inputs. Per-asset daily 90-day Pearson correlation rows, plus daily Bitcoin closes for the cycle overlay. Reconstruction notes. The 90-day window is the conventional choice; shorter windows whip on every macro surprise, longer windows lag too much to read regime turns. The GLD-vs-QQQ crossover detection on /correlations uses a 30-day-minimum run-length filter on the sign of (ρGLD − ρQQQ); runs shorter than 30 days are absorbed into the surrounding regime. Known divergences. The 90-day BTC–GLD correlation has averaged about +0.10 across the post-2015 record, with a peak of +0.57 and a trough of −0.37. Bitcoin has spent roughly a fifth to a third of its time in a gold-led regime (BTC-GLD > BTC-QQQ) on the full daily-close record; the Nasdaq-led regime dominates the time-in-regime budget, especially since mid-2020. Tail-event coupling (acute liquidity flushes) is captured poorly by the 90-day rolling window — the 2020 Covid March case is the canonical example, where the coefficient barely moved during the two-week shock. Documented on /correlations.
Mining
2 chartsHash Rate
Formula. hashrate ≈ D · 2³² / 600, where D is the network's current difficulty target and 600 is the protocol's ten-minute target block interval in seconds (per the Bitcoin wiki). Output rendered in EH/s — one exahash per second is 10⁹ GH/s, 10⁶ TH/s, or 10³ PH/s. Window. Daily back-out from realised block intervals and the difficulty target; recent series presented at full daily resolution, pre-2020 data downsampled to a ≈4-day cadence by the upstream feed and stitched into the same series. Inputs. The upstream daily hash-rate series in GH/s, converted to EH/s; daily closes for spot-on-day in the historical-readings table. Reconstruction notes. Hash rate is modelled, not measured — Ben Celermajer captured the principle as in a distributed process like mining, it is near impossible to obtain reliable hash rate figures from the universe of miners
(Decrypt, 2020). Pre-mining-rig days where converted hash rate fell below 10⁻⁶ EH/s (1 TH/s) are dropped to keep the log axis legible; the modelled-not-measured caveat is surfaced in § 02 of the chart page. Known divergences. Daily readings can swing several percent on lucky / unlucky block-interval runs without any change in real-world hashpower; the 30-day rate of change on the chart absorbs most of the noise. The May–July 2021 China-ban window is the most important data event in the series — the chart page reconstructs the peak / trough / recovery dates from the same daily series the chart consumes.
Hash Ribbon
Formula. ma30(t) = mean(hashrate[t−29..t]); ma60(t) = mean(hashrate[t−59..t]). Capitulation begins when ma30(t) < ma60(t); a recovery upcross prints on day t when ma30(t−1) ≤ ma60(t−1) and ma30(t) > ma60(t). Window. Both SMAs are simple, daily, calendar-aligned. Inputs. The same upstream hash-rate series that powers /hash-rate, with the GH/s → EH/s conversion applied before the SMA pass. Reconstruction notes. Charles Edwards's canonical Hash Ribbons & Bitcoin Bottoms (Capriole, October 2019; updated April 2023) defines a two-step buy signal: the 30/60 hash-rate cross plus a 10-day-over-20-day price-SMA confirmation. The chart ships the unfiltered 30/60 upcross, which matches the dated buy-signal list circulating on Bitcoin Magazine and on Capriole's own TradingView script. Edwards's full price-momentum filter is documented in § 02 of the chart page; readers wanting the strict-Edwards signal can layer the 10/20 price-SMA cross on top of the chart's accent dots. Known divergences. The unfiltered 30/60 upcross fires before, not after, the price-momentum confirmation in roughly two or three of the historical signals (the January 2015 false positive being the headline example Edwards flagged in his original article). Every cross is counted, including consecutive crosses inside one cycle window — the chart's batting-average section accounts for that double-count.
Statistical
10 chartsDaily Issuance
Formula. btc(t) = reward(t) × 144; usd(t) = btc(t) × price(t); inflation(t) = (btc(t) × 365) / supply(t). The reward at any date is fixed by the protocol's halving schedule (block 210,000 / 25 BTC on 2012-11-28; 420,000 / 12.5 on 2016-07-09; 630,000 / 6.25 on 2020-05-11; 840,000 / 3.125 on 2024-04-19). Window. Full daily history aligned with the daily-close series; supply is closed-form from genesis (no rolling window). Inputs. The halving schedule and daily closes — no external on-chain feed. Reconstruction notes. The 144-blocks-per-day target underestimates realised cadence by ≈ 2% (real blocks land at ~147/day) but preserves the doubling-step at every halving, which is the feature the chart is built to highlight. The next-halving date is projected as the most recent halving + 4 calendar years; on-chain reality is block-based and drifts a few weeks. The 33rd halving rounds the per-block reward to zero satoshis — daily issuance reaches zero a few halvings before calendar 2140. Known divergences. The post-halving inflation-decay table on /issuance is the page's distinctive: the 2012 halving took inflation from 12.5% to 11.1% over the following year (1.4-pp slide); the 2024 halving took it from 0.83% to 0.83% (0.01-pp slide), two orders of magnitude smaller. The annual decay is now vanishing into the noise floor.
Rolling CAGR
Formula. CAGRn(t) = (price(t) / price(t−n))365/n − 1 for windows n ∈ {365, 1095, 1825, 3650} days — the 1-, 3-, 5-, and 10-year rolling annualised returns. Each line is the ratio of today's close to the close n days ago, geometrically annualised. Window. Per-window rolling lookback; blank values during the warm-up period when the lookback would precede series start (2010-07-18). Inputs. Daily closes only. Reconstruction notes. The headline reading on the page recomputes each window against the live spot price (binary-search lookup of price(t−n) in the daily series) so the four CAGRs tick with spot through the day. The cycle-anchor table holds each anchor's reading constant for cross-cycle comparability. Known divergences. The 10-year window is the chart's quiet contribution: cross-cycle 10-year CAGRs converge into a 25–55% band even when 1-year readings span −70% to +500%. The compression is the empirical case for long-horizon return modelling; the 1y / 3y / 5y windows oscillate on cycle phase. The 1-year line goes deeply negative through bear-market windows (2014, 2018, 2022) and positive through bulls; the 10-year line never has, in any cycle on record.
Rolling Volatility
Formula. ri = ln(pricei / pricei−1); voln(t) = stdev(r over the trailing n days) × √365. Rolling lookback windows of 30, 90, and 365 days, annualised by the conventional √365 factor (continuous-compounding convention; cryptoasset markets clear seven days a week). Window. Three rolling windows; first valid reading at warm-up + 1 day. Inputs. Daily closes only; log returns rather than arithmetic returns to keep the additive scaling correct under annualisation. Reconstruction notes. The page's distinctive is the per-halving-epoch table — mean and stdev of each window across five eras (pre-2013, 2013–2016, 2016–2020, 2020–2024, 2024+). Realised vol has compressed monotonically by epoch: ~120% in the early eras, ~70% in the 2016–2020 era, ~55% after the 2020 halving, and a low-40s regime post-2024. The compression is structural, not a single-cycle anomaly. Known divergences. Realised vol (this chart) and implied vol (CBOE / Deribit DVOL) converge in late-2020s readings; the gap was much wider pre-2018. Compared to traditional benchmarks: today's BTC realised vol sits in the same band as historical equity-index vol around major event windows (Q1 2020, Q4 2008), where Bitcoin used to live two to four times above.
Profitable Days
Formula. For every historical day d, profitable(d) = price(today) > price(d). lifetime_ratio = #{profitable(d)} / total_days; the 30-day rolling ratio is the same proportion over a trailing 30-day window. Window. Full daily-close history; lifetime ratio recomputes against live spot through the day (cheap O(n) recount on every spot tick). Inputs. Daily closes only. Reconstruction notes. The chart's defining design choice is that the reference price is literally today — a day's colour can flip back and forth as spot moves through that day's old close. The all-time-low ratio walks every historical day and re-anchors the lifetime ratio at that anchor; an O(n²) computation that runs once per render in under 100 ms at n ≈ 5,700. A 365-day warm-up on the ATL search prevents the early-history sample from dominating the result. Known divergences. Path-dependent: every new all-time-high lifts the leading edge of the longest unprofitable window into the green; every drawdown extends one. The page's headline finding is the all-time-low reading of 58.04% on 2011-11-20, in the depths of the post-Mt Gox bear — a regime that has not repeated since the chart left its first 18 months of history.
Halving-Cycle Overlay
Formula. For each halving cycle i and day d from 0 to min(1,460, today − halvingᵢ), multiple_i(d) = price(halvingᵢ + d) / price(halvingᵢ). The halving-day close is the day-0 anchor. Window. Per cycle, capped at 1,460 days (≈ 4 years) — the next halving begins the next cycle's day 0. Inputs. Daily closes (Mt. Gox-era CSV merged with the live daily close feed); halving block-confirmation dates from consensus block heights — block 210,000 on 2012-11-28, 420,000 on 2016-07-09, 630,000 on 2020-05-11, 840,000 on 2024-04-19. Reconstruction notes. Where the requested day-d falls between two daily closes (or after the last close), the most recent prior close is used; nearest-prior policy keeps the line continuous on the chart even with gaps. The 2012 cycle line is visibly noisier than the others because Mt. Gox-era daily closes had thin order books and wide spreads — that volatility is part of the historical record and stays unsmoothed. Known divergences. Several published cycle overlays anchor to the halving block-time UTC rather than the daily-close UTC date; on day 0 the difference is at most one daily print, and the difference fades to zero as cycles age. The peak-multiple decay reported on the chart (94× → 30× → 8× → current) is robust to anchor choice.
Time in Band
Formula. For each daily close, classify into one of nine Rainbow valuation bands using the live OLS regression coefficients (a, b) from /rainbow — band k is bounded by 10(a × ln(days_since_genesis) + b + offsetk), where the per-band offsets come from BAND_OFFSETS in $lib/theme. Histogram across the full history and across each cycle window. Window. Five cycle windows pegged on halving dates: pre-2013 (genesis → 2012-11-28), 2013-2016 (2012-11-28 → 2016-07-09), 2016-2020 (2016-07-09 → 2020-05-11), 2020-2024 (2020-05-11 → 2024-04-19), 2024+ (2024-04-19 → today). Inputs. Daily closes plus the live Rainbow regression coefficients (refit nightly when the chart pipeline runs). Reconstruction notes. The bands move slightly when the regression refits, so a cell's per-cycle count can shift by a few days between consecutive nightly builds. The histogram caps at the chart's first defined day (the underlying Rainbow series, not genesis). Known divergences. The page's headline finding is the Euphoria-band frequency drop: band 9 (the topmost) hosts a measurable share of cycle-1 days, a smaller share of cycle-2 days, and zero days in cycles 3 and 4 across the post-2014 history. The shape is the visual case for “each cycle is smaller in ratio space than the last” that NUPL, MVRV, and several other indicators record in their own units.
Monthly Returns Heatmap
Formula. monthly_return(y, m) = close(last trading day of month m, year y) / close(last trading day of prior month) − 1. Cells are coloured by sign and magnitude; rows are years and columns are months. Annual totals are compounded across the year's months. Window. Full history from July 2010 forward; partial-month cells (the current trailing month) are flagged in the chart's tooltip and excluded from the per-month statistics. Inputs. Month-boundary daily closes only. Reconstruction notes. The page's distinctive is the per-month statistical table — for each calendar month, sample size n, mean return, standard deviation, median, t-statistic against zero, and positive-count. The t-critical at n = 14 (df = 13) for a two-tailed test at p < 0.05 is 2.16; we use 2.14 for the post-2024 sample at n = 15 (df = 14) which is the bulk of the table. Known divergences. The headline finding is that almost every month's t-statistic fails the two-tailed 95% significance threshold. October's reputation as “Uptober” rests on a small-sample mean that does not survive the test of dispersion; the same applies to most named seasonal effects. Sullivan, Timmermann, and White (2001) and Bouman & Jacobsen (2002) both make the same point about equity seasonality at much larger sample sizes — Bitcoin's 14–15 observations per month make these claims even harder to sustain.
Daily Transaction Count
Formula. count(d) = number of confirmed transactions in blocks mined that day. sma30(d) = mean(count(d−29) … count(d)); yoy(d) = sma30(d) / sma30(d−365) − 1. Regime. Buckets keyed off yoy on the 30-day SMA — > +30% Expansion; < −10% Contracting; otherwise Stable. Window. 30-day SMA, 365-day YoY lookback, full daily-close history. Inputs. Stitched from two upstream endpoints — timespan=all (≈4-day cadence pre-2020) merged with timespan=6years (daily on the recent tail). The merge takes the daily-cadence value where both feeds carry the same date. Reconstruction notes. Pre-2020 readings carry a coarser effective resolution; SMA windows are wider than their names during that era. Known divergences. The page's distinctive is the count-vs-price decoupling table: the 2017 cycle top printed roughly 392k transactions on the day at ≈$19k, the 2021 cycle top printed roughly 301k at ≈$69k (3.6× the price, fewer transactions). Two structural shifts — Lightning mainnet (March 2018) and exchange-internal batching — account for the 2017→2021 decoupling; the 2023–24 inscription waves (Ordinals, BRC-20, Runes) re-inflated the count from a different mechanism. Documented on /transactions.
Daily Fees
Formula. fees(d) = sum of (inputs − outputs) across all confirmed transactions in d, in USD; subsidy_usd(d) = reward(d) × 144 × price(d); share(d) = fees(d) / (fees(d) + subsidy_usd(d)); sma7(d) is the 7-day mean. Regime. Four-band map keyed off SMA level and fee share: Quiescent (< $1M and < 5%); Active ($1–5M or 5–15%); Congested ($5–25M or 15–35%); Eruption (> $25M or > 35%). Window. 7-day SMA, full history. Inputs. Stitched from two upstream endpoints same as transactions; reward(d) and the 144-blocks-per-day target reused from /issuance; daily closes for the subsidy-USD denominator. The reading row recomputes the share live against spot. Reconstruction notes. Pre-2020 daily resolution drops to a 4-day cadence; the 7-day SMA is effectively 28-day during that era. The chart caps the visible y-axis at $100M to keep the log-scale legible across four orders of magnitude. Known divergences. The page's distinctive is the fees-beat-subsidy cluster around the April 2024 halving: 2024-04-20 (the day of the Runes launch and block 840,000) printed a fee share of 73.8% at $81M in fees against a $29M subsidy — the highest fee-share day on record. The handful of other days where share exceeded 50% all cluster within a fortnight of that print. Documented on /fees.
NVT Ratio & Signal
Formula. NVT(t) = market_cap(t) / tx_volume_usd(t) (Woo); NVT_Signal(t) = market_cap(t) / SMA90(tx_volume_usd)(t) (Kalichkin). Market cap is the deterministic price(t) × circulating_supply(t) from the halving schedule. Framing: Willy Woo's BTC NVT Ratio, February 2017; Dmitry Kalichkin's Rethinking NVT Ratio: introducing the NVT Signal, 4 February 2018. Regime. NVT Signal < 100 Undervalued; 100–220 Normal; > 220 Overvalued. Window. 90-day SMA on the denominator; the chart begins after that warm-up. Inputs. Upstream estimated on-chain transaction volume in USD; deterministic supply schedule for the market-cap numerator; daily closes. The reading row recomputes both ratios against live spot. Reconstruction notes. Our denominator is the raw on-chain transaction volume, which runs roughly 2× Kalichkin's adjusted volume (his nets out change outputs and exchange self-transfers). Applied directly, his canonical 45/150 thresholds on a 2×-bigger denominator would mark almost every post-2017 reading as Overvalued. We recalibrated to 100 / 220 to preserve Kalichkin's 20/60/20 percentile split — bottom quintile, middle 60%, top quintile — on our series. Known divergences. Layer-2 migration (Lightning, sidechains, batching) shrinks the on-chain volume denominator without an underlying utility loss; structurally biases late-2020s NVT Signal readings upward. The 2022 post-FTX low printed signal ≈ 131 (Normal band), the first cycle low in our data not to reach Undervalued. Documented on /nvt.
Flows
3 chartsBitcoin ETF Flows
Formula. NetFlow_USD(t) = Σi NetFlow_USDi(t) across every tracked US spot Bitcoin ETF issuer i; Cumulative(t) = Σk≤t NetFlow_USD(k); AUM_i(t) is each issuer’s reported assets under management at the daily close. Spot universe is the eleven products approved in the SEC’s 10 January 2024 omnibus order plus the Grayscale Bitcoin Mini Trust (BTC, spun off 31 July 2024) — twelve products in total. ProShares BITO, a CME-futures product, is filtered out of the per-issuer ranking on the chart page even though some upstream lists carry it. Regime. Keyed off the trailing 5-day net dollar flow — > +$2B Strong inflows; < −$1B Outflows; otherwise Neutral. Thresholds bracket the post-launch distribution and are descriptive cuts, not author-canonical levels. Window. Daily close from 2024-01-11 (the first spot-ETF trading session) onward. The Hashdex DEFI conversion to spot on 27 March 2024 and the Grayscale Mini Trust spin-off on 31 July 2024 are reflected in their first respective daily closes. Inputs. Per-issuer daily flow in USD and the snapshot per-issuer AUM list; the cumulative inflow series is computed client-side from the daily-flow primary so the line stays reproducible from the JSON the chart consumes. Reconstruction notes. AP creations cleared in-kind move bitcoin from the AP’s wallet into the trust’s custody without adding new market demand; cash creations force the issuer’s OTC desk to source bitcoin at the daily benchmark fixing. The flow report aggregates the two identically. The IBIT prospectus names Coinbase Custody Trust Company, LLC as the bitcoin custodian, with FBTC the significant exception (Fidelity self-custodies); a creation in IBIT therefore prints as a Coinbase-exchange outflow on /exchange-flows against an ETF inflow here. Known divergences. Q1 2024 produced GBTC outflows of $14.7B against $13.9B into IBIT, $7.5B into FBTC, $2.2B into ARKB and $1.8B into BITB — a record reading by absolute size that Bloomberg ETF analysts attributed roughly one-third to fee-arbitrage rotation and the rest to GBTC-conversion mechanics plus the Genesis bankruptcy estate’s court-approved $1.3-$1.4B liquidation. The early-2026 drawdown decoupled flow from spot most cleanly — bitcoin fell roughly forty percent peak-to-trough while only ~6.6% of ETF AUM exited via redemption (Coindesk, 5 Feb 2026). Documented on /etf-flows.
Exchange Reserves & Net-Flow
Formula. Reserves(t) = Σv Reservesv(t) across every tracked centralised-exchange wallet cluster v; NetFlow_30d(t) = Reserves(t) − Reserves(t−30d), denominated in BTC. The page-level chart also computes a custom anchor-date 30-day net by recovering the historical reserves for any anchor and differencing. Regime. Thresholds on NetFlow_30d — ≤ −50,000 BTC Heavy outflows; ≥ +20,000 BTC Heavy inflows; ≤ −15,000 BTC Outflows; ≥ +5,000 BTC Inflows; otherwise Balanced. Window. Daily close from 2024-05-01 forward — the start of the upstream feed’s coverage window. The chart and methodology are honest about the gap: the 2022 FTX cliff is documented on the chart page as text via Week 46 / Week 47 primary citations, not as a row in the historical table. Inputs. Per-venue daily reserves snapshot and a daily total. Reconstruction notes. The post-2024 era materially changed the meaning of an exchange outflow. Pre-ETF, an outflow was a presumptive self-custody move — coins leaving exchange wallets for cold-storage on-chain. Post-ETF, the largest single sink for outflows became Coinbase Custody Trust Company, LLC, which serves as the spot-custodian for most Day-1 ETF issuers (FBTC the significant exception, self-custodied through Fidelity Digital Asset Services). Coins moving from a Coinbase trading wallet to a Coinbase Custody wallet show up as a centralised-exchange outflow with a corresponding ETF-creation print on /etf-flows; the “same coins, different wrapper” framing is canonical. Known divergences. Different on-chain providers identify exchange wallet clusters slightly differently — reserve totals across publishers can disagree by 100k+ BTC on the same day at the aggregate level. The chart page documents the 2022 FTX cliff inline (~$15B-$20B in BTC moved off centralised venues across November) using the contemporaneous primary record. Coinbase is normalised to one venue label across upstream endpoints to keep the per-day breakdown internally consistent. Documented on /exchange-flows.
Derivatives
4 chartsLong/Short Ratio
Formula. The canonical construction takes the top 20% of accounts on the highest-volume perpetual-futures venue ranked by margin balance, classifies each as net long or net short on current open positions, and computes Long Account % = Accounts of top traders with net long positions / Total accounts of top traders with open positions; the ratio is Long Account % / Short Account %. The verbatim spec is published in the venue’s API documentation. Window. Daily close on the same venue from 2023-07-26 forward; coverage is bounded by what the upstream feed retains. Inputs. The single per-venue snapshot of the account-weighted ratio plus daily Bitcoin closes for the cycle-context overlay. Reconstruction notes. The single-venue choice is intentional — each venue defines its own ratio surface (top-X-percent by margin on one, all open-position holders on another, top traders by recent volume on a third), snapshots on its own cadence, and exposes only the precomputed result; there is no shared account-classification spec to sum across, so an aggregated “global” long/short does not exist upstream. The same venue also publishes a position-weighted ratio that often disagrees with the account-weighted version; we plot the account-weighted version because retail positioning — the contrarian signal — lives in account counts, not notional. Known divergences. The dominant perp venue rotates cycle-to-cycle on regulatory, geographic, and product-design timescales, so a long/short series spliced across venue regimes is not a like-for-like comparison even within the same dashboard. The November 2022 venue-discontinuity event is the cleanest concrete example. Documented on /long-short.
Funding Rate
Formula. The canonical perpetual-funding construction, identical in shape across the major venues with only minor variation in clamp magnitude: F = P + clamp(I − P, −0.05%, +0.05%), where F is the funding rate per 8-hour interval, P is the time-weighted average premium of the perpetual price over the index across the funding window, and I is a fixed interest baseline of +0.01% per 8 hours on USD-collateralised contracts. An outer cap then bounds F itself to roughly ±0.30% per 8h. The mechanism originated with the first Bitcoin perpetual contract (May 2016). Window. Volume-weighted across the major perpetual venues at each daily close; settlement cadence on each venue is three settlements per day (00:00, 08:00, 16:00 UTC) which we aggregate to a single daily close for cross-chart consistency. Coverage from 2023-07-26 forward. Inputs. The volume-weighted upstream funding feed, plus daily Bitcoin closes for the chart’s muted price overlay. The upstream value is in percent units (0.0073 means 0.0073% per 8h); the convention is preserved end-to-end. Reconstruction notes. Two consequences of the structural +0.01% interest baseline are worth flagging. A “neutral” reading is not zero — it is centred on the interest baseline, and anything within a few basis points of +0.01% is the formula clearing its throat. Sustained negative readings are mechanically harder to produce than sustained positive ones because the perpetual has to trade persistently below spot to drag the (interest minus premium) clamp negative; that is why deep-negative stretches concentrate around cycle-bottom panic windows. Known divergences. The regulated, cash-settled futures leg has no funding mechanism — quarterly contracts settle on expiry instead — so during cycles where regulated capital drives marginal price action the perp funding feed can decouple from spot behaviour; the regulated leg shows up on /open-interest instead. Venue-discontinuity windows (the post-FTX November 2022 dispersion) can leave a stale or absent venue cell averaged with live feeds, biasing the volume-weighted aggregate toward neutrality during what was actually a violent dislocation; affected days are dropped where the upstream feed flags them. Documented on /funding-rate.
Open Interest
Formula. OI_total(t) = Σv OI_v(t) across covered perp + cash-settled futures venues, with the residual outside the top five rolled into a single Other bucket; OI/mcap(t) = OI_total(t) / (price(t) × circulating_supply(t)) is the leverage proxy that drives the regime classifier (thresholds > 2.5% Leveraged, < 1.5% Deleveraged). Window. Daily close from 2020-02-28 forward; the per-venue daily breakdown is the chart’s primary surface, the aggregate is the thin line at the top of the stack. Inputs. Each venue’s reported USD open interest at the daily close, the deterministic Bitcoin circulating supply on that day (closed-form from the halving schedule, no pricing-feed dependency), and the daily Bitcoin closes for the muted price overlay. Reconstruction notes. Three reporting conventions matter. OI is published in three equivalent forms across venues — contract count, USD notional, coin notional — and a coin-margined contract’s USD value moves with spot even when no new contracts are opened, so on coin-margined exposure the dollar reading carries a small mechanical price-sensitivity. Regime thresholds are descriptive cuts on the post-2020 distribution, not bright-line laws. The OI/mcap ratio is a coarse leverage flag, not a fine-grained percentile. The per-venue stack’s top-five list rotates as venues gain or lose share; coverage drift adds slow upward bias to the absolute total but not to the ratio. Known divergences. The November 2022 venue-discontinuity event is the cleanest case: aggregate OI fell ~19% across three weeks because one venue’s positions were socialised into bankruptcy, not because every other venue’s holders closed out. The post-FTX market-structure record puts the lost share at roughly 15% of all derivatives flow; whenever the stack has a step-change in venue composition, treat the total as discontinuous. The post-spot-ETF era (Jan 2024 onward) has seen the regulated cash-settled leg roughly triple its share of the stack, structurally lowering the volatility a given OI/mcap reading produces. Documented on /open-interest.
Liquidation Heatmap
Formula. A two-dimensional density grid: 20 log-spaced price buckets × daily columns over a rolling 1-year window, each cell encoding the modelled USD of leveraged positions that would be force-closed if price reached that bucket. The signal classifier sums modelled liquidation USD within ±5% of spot at the latest column — cluster_up in (spot, spot × 1.05], cluster_down in [spot × 0.95, spot), ratio cluster_up / cluster_down — classified > 2.0 short-squeeze, < 0.5 long-liquidation, balanced otherwise. Window. Rolling 1-year (~360 daily columns); the upstream endpoint returns at most one year at the cell-grain we ship. Inputs. The fine-grained upstream heatmap (~360 daily bins × 283 price levels) is resampled to 20 log-spaced price buckets per column so the JSON ships under 100 KB; the daily-close price line is the upstream candlestick close at each column. Reconstruction notes. No exchange publishes individual position liquidation prices, so every public liquidation heatmap is a modelled estimate — built from open-interest snapshots, leverage-tier assumptions (typically 100× / 50× / 25× longs and shorts), and standard maintenance-margin formulas per venue. The canonical methodology page is explicit on the central caveat: the Liquidation Heatmap predicts where liquidation levels are opening but not closing. Thus, the actual number of liquidations will be lower.
Dense cells are upper bounds on potential flow, not forecasts of realised flow. Known divergences. The “magnet” framing — that price seeks dense clusters — held in many windows (spring-2024 wicks toward sub-$50k upside clusters before extending higher) and broke in others. The clearest counter-example is November 2022: the dominant downside cluster sat on a venue that ceased to exist mid-month, so price did not seek the magnet because the magnet evaporated. Treat the framing as a heuristic, not a law, and treat dense clusters during dislocation windows with extreme scepticism. Documented on /liquidations.
Macro
4 chartsBitcoin Dominance
Formula. Dominance(t) = btcMcap(t) / totalCryptoMcap(t), daily, expressed as a fraction. The 60-day trend cell is the change in dominance over a rolling 60 trading days, expressed in percentage points; thresholds at ±2 pts classify Expanding / Stable / Contracting. Window. Daily; series back to 2013-05-01 — among the longest single-line histories on the site. Inputs. The upstream daily Bitcoin market cap and total cryptoasset market cap; the implied total is recovered as btcMcap / dominance. Reconstruction notes. Bitcoin market cap is the deterministic product of spot × circulating supply (the latter from the canonical halving schedule, including any coins long since lost). The total cryptoasset market cap is the sum of every tracked asset’s market cap, including stablecoins (USDT, USDC, DAI…) and wrapped tokens (WBTC, stETH…). Different publishers track different baskets and apply different inclusion rules, so dominance numbers across sites disagree by a percentage point or two on the same day. Known divergences. The chart’s dominance line carries a basket-of-the-era caveat: pre-2017 had a few dozen alts in the denominator; 2017-2018 added thousands of ICO tokens; 2020-2021 added DeFi governance and L1 chains; the 2022 Luna collapse erased ~$45B from the denominator overnight; the 2024+ ETF era added structural BTC numerator demand against a ~$300B stablecoin denominator drag. Cycle-over-cycle dominance comparisons rest on a basket whose character has changed at least four times. The dominance ATL of 31.1% on 2018-01-16 is documented on /dominance alongside the stablecoin-and-non-PoW-stripped variant as a cross-check.
Stablecoin Market Cap
Formula. Aggregate float(t) = Σi circulating_supplyi(t) across every tracked USD-pegged stablecoin i, with each issuer’s circulating supply valued at the $1.00 peg. Wrapped representations of the same underlying token (e.g. bridged USDC on multiple chains) are deduplicated by issuer. Regime. Keyed off the trailing 30-day percent change in the aggregate — > +5% Expansion, < -2% Contraction, otherwise Stable. Window. Daily; series back to 2015-02-25, when the float was effectively a single issuer (USDT) at a small fraction of its current scale. Inputs. Per-issuer USD supply per row, summed into the aggregate; price-list field is unused (we value every coin at par). Reconstruction notes. The aggregate values every issuer’s circulating supply at $1.00 by construction, regardless of whether the underlying redemption is being honoured. The USDC SVB week (10-13 March 2023) — the canonical depeg-and-recovery edge case — is the aggregate’s blind spot: secondary markets cleared at $0.87 while the float kept printing par. Known divergences. Composition shifts cycle-to-cycle: USDT-only era (2015-2018), USDT + USDC duopoly (2018-2022), today’s USDT / USDC / DAI / FDUSD / long-tail basket (~$315B aggregate as of April 2026). Per-issuer breakdown is not surfaced — the aggregate is the macro signal, with the SVB-week reconstruction documented on /stablecoin-supply.
Altcoin Season Index
Formula. The canonical methodology reads verbatim: If 75% of the Top 50 coins performed better than Bitcoin over the last season (90 days) it is Altcoin Season.
Stablecoins (USDT, USDC, DAI…) and asset-backed tokens (WBTC, stETH, cLINK…) are excluded from the eligible sample. The index value is the share of the eligible Top-50 sample whose 90-day return has beaten Bitcoin’s, scaled to 0-100. Zones. 0-24 BTC Season; 25-49 BTC-leaning; 50-74 Altcoin-leaning; 75-100 Altcoin Season. Window. 90 calendar days (cryptoasset markets clear continuously, so calendar = trading days); the Top-50 is rebalanced daily as market-cap ranks shift. Inputs. The upstream Altcoin Season Index series; daily Bitcoin closes for cycle-context overlay. Reconstruction notes. Different publishers run the same methodology against slightly different baskets — the canonical 75-of-50 form on blockchaincenter.net versus a top-100 variant on CoinMarketCap’s panel. We ship the top-50 form. Known divergences. The 90-day window means an Altcoin Season call lags the underlying rotation by 30-60 days; readings cross 75 weeks after the rotation began. Sample composition changes cycle-to-cycle: 2021’s top-50 leaned DeFi and meme-tokens; 2024’s leans L1 infrastructure and restaking. Documented on /altcoin-season.
BTC vs Global M2
Formula. Two paired series — daily Bitcoin price and the M2 supply level on the chosen basket — with a 180-day rolling Pearson correlation as the regime classifier (> +0.8 Strong positive; > +0.5 Positive; < -0.5 Negative; otherwise Decoupled). YoY growth is derived locally as m2(t) / m2(t−365d) − 1, with the matching observation chosen as the closest available print to the same calendar day one year prior (within a 14-day tolerance). The page-level rendering also recomputes 90-day and 365-day rolling Pearson correlations inline. Window. Daily; coverage starts 2014-05-12 (global) / 2011-06-29 (US). Inputs. Two upstream feeds, one per basket: global_m2_supply + price per row; us_m2_supply + price per row. Both shipped as separate static JSON files; the chart toggles between them with a URL-state basket selector. Reconstruction notes. “Global M2” is a provider construction, not a published statistic — no central authority publishes a single canonical global aggregate. The aggregate is a USD-translated sum of major central-bank money supplies; methodology choices (country list, FX-translation, definitional reconciliation across jurisdictions) make different providers' numbers diverge by trillions on the same day. The US series is the Federal Reserve’s H.6 release (methodology page). Known divergences. The 180-day correlation we ship is the conventional middle window; the page also shows the 90-day (more reactive) and 365-day (smoother) Pearson reads at every cycle anchor — the decay across windows is the chart’s headline contribution. The liquidity thesis (Lyn Alden / Sam Callahan, September 2024) is presented alongside the contested counterpoint (Joseph Wang on QE and M2, August 2020) on /btc-vs-m2.
Reference
4 pagesBitcoin All-Time High
Formula. ath(t) = max(price[0..t]) on the daily-close series; days_since_ath is the calendar-day count since the running maximum was last set; distance_from_ath(t) = price(t) / ath(t) − 1. Cycle peaks are the local daily-close maxima within each halving window, not the running maximum. Window. Full daily-close history from 18 Jul 2010; no smoothing, no warm-up. Inputs. Daily closes (Mt. Gox-era CSV merged with the live daily close feed) and the halving schedule for cycle-window boundaries; the live spot drives the headline distance-from-ATH cell. Reconstruction notes. Daily closes round off intraday wicks, so the canonical 2011-Jun and 2014-Mar intraday highs print lower than an intraday-resolution series would. The cycle-by-cycle table on /all-time-high records the close-space ATH per cycle plus days-to-surpass to the next ATH. Known divergences. Pre-2011 history carries thin order books and wide spreads, so reading those prints as comparable to post-ETF prints understates measurement-error. Some publishers anchor cycle peaks to intraday high (TradingView convention); we use daily close throughout for cross-cycle comparability. Documented on /all-time-high.
Bitcoin Halving Countdown
Formula. Live block-anchored countdown — blocks_remaining = next_halving_height − current_height; days_remaining ≈ blocks_remaining × avg_block_interval / 86,400. The reward formula matches halving dates; cycle progress is (current_height − prior_halving_height) / 210,000. Window. A single moment; the page recomputes as new blocks land. Inputs. Current block height and the closed-form halving schedule; the running block-interval estimate uses the trailing 2,016-block difficulty epoch. Reconstruction notes. Two countdowns are commonly shown across explainer sites: the calendar-from-prior-halving projection (prior date + 4 years) and the block-anchored projection. The block-anchored read is the canonical one because consensus is block-driven, not date-driven; the calendar projection is a planning shorthand. Known divergences. Different feeds report current height with second-to-minute lag depending on confirmation policy (1-conf vs 6-conf), so the projected halving date can swing by hours over a few-day window without anything material changing. The four-year-from-prior calendar estimate has overshot every actual halving date so far by two to four weeks. Documented on /halving-countdown.
Bitcoin Halving Dates
Formula. halving_block(i) = i × 210,000; subsidy(i) = 50 × 0.5i BTC until rounding to zero satoshis at i = 33. The four-year cadence is shorthand for 210,000 × 10 minutes; the realised average has been closer to 9.6 minutes per block, so every halving so far has arrived several weeks ahead of the four-year-from-prior projection. Framing: BIP-0042 (Pieter Wuille, 2014). Window. Closed-form from genesis; per-event rows reach back to 2012-11-28 (block 210,000) and forward through projected H8. Inputs. Block heights from the consensus rule, daily closes for the halving-day price column, and the daily close 365 days later for the forward-12-month return. Projected halvings (H5 onward) extrapolate from the running average block interval since genesis. Reconstruction notes. Forward-12m return at H4 is the softest of the four: 8,749% (H1), 285% (H2), 559% (H3), and a much smaller print at H4 — the per-cycle table on /halving-dates records the actual numbers. The decay decade-over-decade is the page’s headline. Known divergences. Some publishers project halvings from the date of the prior halving + 4 calendar years; we use the running average block interval since genesis to project H5–H8, which lands those dates weeks earlier. The exact block-mining moment also drifts ± one daily close from the calendar UTC date depending on which side of midnight the block confirms. Documented on /halving-dates.
Bitcoin Total Supply
Formula. subsidy(n) = floor(50 × 108 / 2n) sats per block in epoch n; epoch_total(n) = 210,000 × subsidy(n) sats; asymptote = Σn=0..32 epoch_total(n) = 2,099,999,997,690,000 sats ≈ 20,999,999.9769 BTC. The 33rd halving rounds the per-block reward to zero. Framing: BIP-0042 (Pieter Wuille, 2014) formalised the schedule and added a guard against over-shifting the reward past the 64-halving boundary. Window. Closed-form from genesis; no rolling window. Inputs. The protocol consensus rule; no external feed for the asymptote, daily closes only for the live price-context column. Reconstruction notes. Truncated integer right-shift inside the consensus rule produces the ≈ 0.023 BTC shortfall against 21,000,000 — the cap is hard, the round number is the rounding. Lost-coin estimates (the 2.78–3.79M BTC range across published methodologies — Patoshi-era cluster work, dormancy heuristics, exchange-rehypothecation gaps) are ranges, not point figures, and the upper end ages quickly. Known divergences. “Circulating”, “total”, and “max” supply mean different things across publishers. Bitcoin’s consensus rule has no burn mechanism, so circulating supply equals total supply equals everything ever mined; max supply is the asymptote. Documented on /total-supply.
When pages drift from upstream
notesWhen btc oak’s published number diverges from a third-party reference, the cause is usually one of three: a different upstream feed (we are transparent about which feeds we draw on — see sources), a different smoothing window (NVT Signal’s 90-day SMA, our recalibrated NVT thresholds), or a different reconstruction (the two-bucket realized-cap split, where a per-UTXO feed isn’t available to us).
Where the divergence is material we document it in that chart’s section above; otherwise it is well within rounding-error tolerance and reflects a published-canonical difference, not a btc oak error.