Methodology & Data Sources
A calculator you can't verify is a black box. This page documents exactly where our data comes from, how every number is computed, and where the model falls short of reality.
Data Sources
All requests are proxied through our server for caching; no personal data is sent to any provider. Refresh cadences are server-side cache windows, not guarantees from the providers.
| 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 and M2 money supply series | Daily |
| Yahoo Finance | S&P 500 (^GSPC) 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 |
How the DCA Math Works
Purchase schedule. Purchases are scheduled 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, so using UTC avoids the off-by-one-day shifts that local-time math causes for users west of Greenwich.
Fees. Your fee percentage is applied to every purchase before conversion: btcBought = amount × (1 − fee%) / price. The gross amount still counts as invested capital, so fees show up as a drag on returns — exactly as they do in real life.
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)
The money-weighted annualized return: the discount rate at which the net present value of all your dated purchases plus the final portfolio value equals zero. Solved numerically (Newton's method with a bisection fallback). Not shown for periods under 90 days, where annualizing is meaningless.
Max Drawdown
The largest peak-to-trough decline in your portfolio's value across the purchase-day series: how far underwater the strategy went at its worst point, as a percentage of the preceding peak.
Currency Display
All math runs in USD. Non-USD displays (EUR, GBP, CAD, AUD, JPY) convert at current ECB reference rates from frankfurter.app at display time — historical FX rates are not applied.
Data Honesty
The default series is interpolated. Kraken (the default source) provides 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. Switching the source to Coinbase uses real daily candles from 2015 onward.
Early history uses real market prices. For dates before an exchange's own candles begin, we use actual daily market prices from blockchain.info covering August 2010 through mid-2015 (a static snapshot, since this 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 (a gap in the series), the simulation uses the most recent known price rather than skipping the purchase.
Known Limitations
- •No taxes. Capital gains, income tax on rewards, and cost-basis accounting methods are not modeled.
- •No withdrawal fees. On-chain network fees and exchange withdrawal fees for moving coins to self-custody are excluded.
- •No spread modeling. The single fee percentage does not capture bid-ask spreads or exchange-specific price differences, which can add a hidden cost on top of quoted fees.
- •One price per day. All purchases execute 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 know exactly how the sausage is made. Backtest your own DCA strategy 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.