Methodology & Data Sources
A calculator you can't verify is a black box. This page lists every data source, walks through the math behind each number, and is blunt about where the model falls short of reality.
Data Sources
Every request is proxied through our server so responses can be cached, and no personal data is sent to any provider. The cadences below describe our own cache windows. They are not guarantees from the providers. One piece of vocabulary before the table: a candle is one period's price summary, its open, high, low and close.
| Source | What it provides | Refresh cadence |
|---|---|---|
| Kraken | Weekly OHLC candles (default price series), interpolated to daily | Cached ~1 hour |
| Coinbase | Real daily candles from 2015 onward (alternate price source) | Cached ~1 hour |
| mempool.space | Block height, transaction fees, hash rate, difficulty, Lightning stats | 30s - 5 min |
| CoinGecko | Global market cap and Bitcoin dominance | ~5 min |
| FRED (St. Louis Fed) | CPI inflation series (inflation-adjusted returns) | Daily |
| Yahoo Finance | S&P 500 total return (^SP500TR, dividends reinvested) and Gold (GC=F) for asset comparisons | Cached ~1 hour |
| alternative.me | Fear & Greed Index | ~5 min |
| blockchain.info | Circulating BTC supply; daily market prices 2010-2015 (static snapshot) | ~5 min / fixed |
| frankfurter.app | ECB reference FX rates (EUR, GBP, CAD, AUD, JPY display currencies) | ~12 hours |
The same cleaned daily series and the backtest engine behind every number here are available as a free, keyless JSON/CSV API — check our work, or build on it.
How the DCA Math Works
Purchase schedule. Purchases land on UTC calendar days: daily, weekly (every 7 days), bi-weekly (every 14 days), or monthly (same day-of-month, anchored to your start date). Exchange candles are UTC-aligned too. Doing the same math in local time shifts the whole schedule by a day for anyone west of Greenwich, which is why we don't.
Fees. Your fee percentage comes off every purchase before conversion: btcBought = amount × (1 − fee%) / price. The gross amount still counts as invested capital, so fees drag on returns here the same way they do on a real exchange.
Average Cost & ROI
Average cost = total invested ÷ total BTC accumulated. ROI = (current value − total invested) ÷ total invested. Current value is total BTC × the latest price.
XIRR (Annualized Return)
Your yearly return rate, adjusted for the fact that money went in at different times. Formally: the money-weighted annualized return, meaning the discount rate at which the net present value of all your dated purchases plus the final portfolio value equals zero. We solve it numerically, with Newton's method and a bisection fallback. Under 90 days it isn't shown at all, because annualizing a window that short is meaningless.
Max Drawdown
The largest peak-to-trough decline in your portfolio's value across the purchase-day series, stated as a percentage of the preceding peak. It answers one question: how far underwater did the strategy go at its worst point?
Currency Display
All math runs in USD. The other display currencies (EUR, GBP, CAD, AUD, JPY) convert at current ECB reference rates from frankfurter.app, applied at display time. Historical FX rates are not used.
Data Honesty
The default series is interpolated. Kraken, the default source, gives us weekly closes, which we linearly interpolate to daily values. That smooths out intra-week volatility: a purchase on a Wednesday uses an estimate between two real weekly closes, not the actual Wednesday price. Switch the source to Coinbase and you get real daily candles from 2015 onward.
Early history uses real market prices. For dates before an exchange's own candles begin, we fall back to actual daily market prices from blockchain.info covering August 2010 through mid-2015. It's a static snapshot, since that history no longer changes. No prices are fabricated. The earliest supported simulations start in August 2010 at around $0.07.
Gaps use the last known price. If a scheduled purchase lands on a day with no price data, the simulation carries the most recent known price forward rather than skipping the buy.
Known Limitations
- •No taxes. Capital gains and income tax on rewards are not modeled, and neither are cost-basis accounting methods.
- •No withdrawal fees. Moving coins to self-custody costs an on-chain network fee, often plus an exchange withdrawal fee. Both are excluded.
- •No spread modeling. One fee percentage cannot capture bid-ask spreads or the price differences between exchanges, both of which can add a hidden cost on top of quoted fees.
- •One price per day. Every purchase executes at the day's series price. Intraday timing is not simulated.
Changelog
Accuracy & polish overhaul
- •Fixed: future projections double-counted contributions in some scenarios.
- •Fixed: currency conversion inconsistencies across the comparison and planning tools.
- •Fixed: purchase dates now use UTC calendar days everywhere, eliminating timezone-dependent schedule shifts.
- •New: live ECB exchange rates (frankfurter.app) replace hardcoded currency rates.
- •New: XIRR (money-weighted annualized return) and max drawdown statistics.
- •New: redesigned charts with single-axis tabs, plus this methodology page.
- •New: real daily market prices (blockchain.info) for 2010–2015, replacing the earlier synthetic pre-2015 interpolation.
- •New: historical win-rate stat, the share of comparable DCA windows since 2010 that ended in profit.
- •New: result-specific share previews, plan-vs-plan comparison, and prerendered DCA scenario pages.
Reliability pass
API fetch timeouts, currency-aware labels across all tools, and the beginner-friendly mining guide.
Now Run Your Own Numbers
You've seen how the sausage gets made. Go backtest your own DCA schedule with the calculator.
Open the CalculatorDisclaimer: This page describes an educational simulation, not investment advice. Historical and simulated performance does not guarantee future results. Bitcoin is volatile and carries significant risk. Always do your own research before making investment decisions.