The model forecasts Bitcoin's USD price over a 12-month horizon. It combines a ridge regression on macro and on-chain factors with a Monte Carlo layer to produce a median path and realistic confidence bands.
The forecast is anchored on the live spot price at inference time, eliminating the month-end drift common in models that anchor on monthly averages.
| Source | Series | Frequency | Purpose | Latency |
|---|---|---|---|---|
| Blockchain.info | Daily BTC market price (2009–present) | Daily → aggregated monthly | Primary price history | ~1 hour cache |
| CoinGecko | Daily BTC market price (fallback) | Daily → aggregated monthly | Price history fallback | ~1 hour cache |
| FRED (St. Louis Fed) | M2 Money Supply (M2SL) | Monthly | Global liquidity proxy | ~2 months lag |
| CoinGecko / Blockchain.info | Live BTC spot price | Real-time | Forecast anchor | 30s cache |
| Hardcoded | Halving dates (2009, 2012, 2016, 2020, 2024) | Fixed | Cycle phase encoding | N/A |
All price data is aggregated to monthly averages (mean of daily values within each calendar month) to reduce noise.
The model uses 7 engineered features, all computed at monthly frequency:
| Feature | Formula | Interpretation |
|---|---|---|
mom3 |
logP[t] - logP[t-3] |
3-month momentum (short-term trend) |
mom6 |
logP[t] - logP[t-6] |
6-month momentum (medium-term trend) |
mom12 |
logP[t] - logP[t-12] |
12-month momentum (long-term trend / yearly return) |
phaseS |
sin(2π · monthsSinceHalving / 48) |
Sine component of 4-year halving cycle |
phaseC |
cos(2π · monthsSinceHalving / 48) |
Cosine component of 4-year halving cycle |
m2yoy |
ln(M2[t]) - ln(M2[t-12]) |
Year-over-year M2 growth (global liquidity) |
fairGap |
Residual from rolling regression logP ~ logM2 (48-month window) |
Deviation from M2-implied fair value (mean-reversion signal) |
For the live anchor point (current incomplete month), features are computed at sub-monthly precision: momenta reference exact month-ago price levels, cycle phase uses today's date, and M2 values are carried forward from the latest FRED release.
A separate ridge regression (L2 penalty λ = 1.0) is fit for each
forecast horizon h = 1..12 months. The target rh is the
cumulative log-return over h months:
rh = logP[t+h] - logP[t].
Features are standardized (zero mean, unit variance) per horizon before fitting. The ridge penalty shrinks coefficients toward zero, reducing overfitting on the relatively small (~180 month) training sample. Minimum 24 training samples required per horizon fit.
Raw per-horizon predictions tend to over-extrapolate recent momentum into far horizons. To prevent
unrealistic compounding, the cumulative predicted return at horizon h is blended
toward the historical long-run average monthly growth:
Where μlong is the mean monthly log-return over the full history.
Near horizons (h ≤ 3) follow the model closely; far horizons revert to the
unconditional average.
The forecast originates from a synthetic feature vector built on the live spot price at inference time. This anchors the entire simulation at today's market level, avoiding the systematic lag of monthly-average-only models.
h = 1..12:
logP[t+h] - logP[t]t, target at t+h(X'X + λI)β = X'y via matrix inversions retained for uncertainty
The median forecast is constructed by taking the month-over-month increments of the
blended cumulative predictions:
monthRet(h) = blendCum(h) - blendCum(h-1), then compounding from the live price.
300 stochastic paths are simulated by drawing monthly shocks from Bitcoin's historical return distribution, scaled by the current volatility regime. Each path evolves monthly around the median forecast. This produces a fan where the band widens with horizon and the tails reflect Bitcoin's actual historical kurtosis.