Skip to main content

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.

SourceWhat it providesRefresh cadence
KrakenWeekly OHLC candles (default price series), interpolated to dailyCached ~1 hour
CoinbaseReal daily candles from 2015 onward (alternate price source)Cached ~1 hour
mempool.spaceBlock height, transaction fees, hash rate, difficulty, Lightning stats30s - 5 min
CoinGeckoGlobal market cap and Bitcoin dominance~5 min
FRED (St. Louis Fed)CPI inflation series (inflation-adjusted returns)Daily
Yahoo FinanceS&P 500 total return (^SP500TR, dividends reinvested) and Gold (GC=F) for asset comparisonsCached ~1 hour
alternative.meFear & Greed Index~5 min
blockchain.infoCirculating BTC supply; daily market prices 2010-2015 (static snapshot)~5 min / fixed
frankfurter.appECB 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

July 2026

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.
February 2026

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 Calculator

Disclaimer: 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.