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.

Last updated 12 October 2026. What changed, and when, is in the changelog at the bottom.

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 are our own cache windows, not guarantees from the providers. A candle is one period's price summary: its open, high, low and close.

SourceWhat it providesRefresh cadence
CoinbaseDaily candles from 20 July 2015: one closing price per UTC day. The default price series. Also the live price a result is valued at.~1 hour; live price ~1 min
KrakenWeekly candles: the optional price series, and the fallback when Coinbase cannot be reached. The days between weekly closes are straight-line estimates. Also the price ticker on the home page, with Coinbase standing in when Kraken has no current quote.~1 hour; ticker ~30s
blockchain.infoDaily market prices from 18 August 2010 to 19 July 2015 (a stored copy); circulating BTC supplyFixed / ~5 min
mempool.spaceBlock height, recent blocks, transaction fees, hash rate, difficulty, Lightning stats30s - 10 min
CoinGeckoGlobal market cap and Bitcoin dominance~5 min
FRED (St. Louis Fed)US consumer price index, series CPIAUCSL: one reading a month, for the after-inflation figures and the purchasing-power card~1 day
Yahoo FinanceS&P 500 total return (^SP500TR, dividends reinvested) and Gold (GC=F) for asset comparisons~1 hour
alternative.meFear & Greed Index~5 min
FrankfurterEuropean Central Bank reference FX rates (EUR, GBP, CAD, AUD, JPY display currencies), from api.frankfurter.dev. Requested only when needed; see Currencies below~12 hours

Those cadences are the calculator's. Pages that are built ahead of time (the DCA scenario pages, the studies and the worked examples on the calculator pages) are rebuilt about once a day, so their figures can trail the live calculator by a day or more. A scenario page says when the price it uses is from.

Two cards on the home page are not feeds. The adoption chart is drawn from published tables, which the card links with the date they were last read. The purchasing-power card sets the FRED consumer price series against the bitcoin price since January 2015, always in US dollars, because US inflation says nothing about other currencies.

The same 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 as your start date). In a month too short to have that day the buy lands on its last day, so a plan started on the 31st buys on the last day of February and again on 31 March. 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.

Past and future. A purchase counts as made once its UTC date has arrived. If a plan's end date is in the future, the calculator runs it to that date and labels the headline figures as projected. The purchases still to come are priced at the live price the stack is valued at, or at the last known price when there is no live one. The chart marks today, and the purchase table lists the later rows marked Planned. Everything that describes what has already happened counts only the purchases dated today or earlier: the statistics under the headline (XIRR, max drawdown, best buy, fees paid), every panel on the Compare tab, the CSV export, the share card, the embed widget and the API. The stacking goal, FIRE and spend-down planners start from that same stack, the coins bought so far.

Fees. Each buy pays your percentage fee plus, if you enter one, a flat fee per buy: fee = amount × fee% + flat fee, and never more than the purchase itself. What is left buys bitcoin: btcBought = (amount − fee) / price. The full amount still counts as invested capital, so fees drag on returns here the same way they do on a real exchange. The fee figures we list for named platforms, and what each one leaves out, are on the exchange fee page.

Currencies. All math runs in USD. An amount you type in another currency (EUR, GBP, CAD, AUD, JPY) is converted to USD first, and results are converted back for display, both at one rate: the European Central Bank's latest reference rate, published once per working day and fetched through Frankfurter (api.frankfurter.dev). Past exchange rates are not used, so a result in euros is the dollar result at that one rate, not what each buy cost in euros on its day. The calculator prints the rate's date beside the result, and the CSV export carries the rate in a column of its own.

Today's rates are requested only when a currency other than US dollars is in use or the calculator's currency picker is opened. Until they arrive, a currency you have picked stays in US dollars, and the currency a shared link was made in is shown at once, at a fixed table dated 12 October 2026. If the rates have not arrived within about two and a half seconds, or cannot be fetched, the site uses the last ECB rates it holds or that table, and says in words that the converted figures are approximate. The Cost Basis Tracker converts each saved plan from the currency it was entered in at the same single rate, so the bitcoin, average cost and ROI of a plan entered in another currency are approximate too.

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: the most recent trade on the exchange you selected, or the other exchange's if that one does not answer. If neither does, the calculator uses the last daily price it loaded for the plan. For a plan that ended in the past that is a price from then, so the result names its date and is not called today's value. The API uses the newest daily price in that case. At a manual price, every buy and the final value use the price you typed.

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. The final value is dated at the moment its price was quoted (the last daily price's day when there is no live quote), not at the plan's end date, and a year is 365.25 days. It isn't shown until 90 days separate the first purchase from that final date, because annualizing a shorter stretch is meaningless.

Max Drawdown

It answers one question: how far underwater did the plan go at its worst point? It is the largest peak-to-trough fall in your stack's value, as a percentage of the preceding peak. Your holdings are valued at the series price on every UTC day, not just the days you buy, from your first holding to your end date or the last available price, whichever comes first. So a crash that starts and ends between two purchases counts. A fall after the end date of a plan that has ended does not, although its value and XIRR run to today. One price a day cannot show a fall inside a single day, and on the Kraken series a fall inside a single week is hidden too (see below), so the figure reads too small there. It is not shown at a fixed manual price.

After Inflation

Each purchase is restated at the price level of the latest US consumer price reading (FRED series CPIAUCSL, one a month) on or before the day the stack is valued: amount × CPI at that reading ÷ CPI for the month of the purchase. Real cost is the sum of those amounts, and real ROI = value ÷ real cost − 1. The value is not adjusted, because it is already at that price level. Inflation is the index change from the first purchase's month to that reading. Money put in later was exposed to less of it, so real ROI is not ROI minus the inflation figure. A reading comes out a few weeks after its month (on 12 October 2026 the latest was August's), and purchases newer than the latest one are not inflated. It measures US prices whatever currency is on display, and it is not shown at a manual price.

Starting Stack

Bitcoin you already held before the first buy. It is costed at the average cost you enter, or otherwise at the series price on your start date (your manual price in manual mode). It is never treated as free. It counts as money invested and as bitcoin held, so it is part of average cost, ROI, max drawdown and XIRR (as one cash flow on the start date). It pays no fee, and it is left out of best buy, worst buy and the purchase count. The lump sum, savings, asset and exchange-fee comparisons and the start-date comparison below are about the buying schedule alone, so they leave it out too.

Yearly Increase

Each purchase is the amount × (1 + increase%) for every full year since the start date. It steps up on each 12-month anniversary, not gradually. A plan started on 29 February has its anniversary on 28 February in other years. The percentage fee is taken from the stepped-up amount; a flat fee does not change.

Data Honesty

The default series is daily closing prices. From 20 July 2015 every day is priced at the close of Coinbase's BTC-USD daily candle for that UTC day. The calculator, the scenario pages, the studies and the API all use this series unless another is asked for. The current day is the exception: it has not closed, so its price is the latest trade at the time the series was fetched.

Before then, the prices are a daily average, not an exchange close. From 18 August 2010 to 19 July 2015 the series is a stored copy of blockchain.info's market-price chart, which blockchain.info describes as the average USD market price across major bitcoin exchanges. Each value is stamped 00:00 UTC, and where it can be checked against exchange candles it tracks the close of the day before its date. Measured on 12 October 2026 over the 4,101 days since July 2015 for which both exist, blockchain.info's value sat a median 0.045% from Coinbase's close of the previous day and 1.47% from its close of the same day. So a purchase before 20 July 2015 is priced about one day earlier in market time than one after it. The values are whole cents, which is coarse while bitcoin was under $1: at $0.06, one cent is a 17% move. It is a fixed copy, since that history no longer changes, and the same rows are used whichever exchange is selected. Nothing before 18 August 2010 is priced, so a plan cannot start earlier.

Those early rows are used as published, including two that look wrong. 15 and 16 September 2010 read $0.09 and $0.15, between days at $0.06. Coin Metrics' daily price for the same two days is $0.0604 and $0.0619. A second index disagreeing does not prove a trade did not happen, so the rows stay, and a purchase dated 16 September 2010 is priced at $0.15. Both sources were read on 12 October 2026: blockchain.info and Coin Metrics.

The Kraken series is mostly estimates. Kraken's public API returns only the 720 most recent candles of any size. Its daily candles therefore reach back about two years, and weekly candles are the finest that cover the years since 2015. We date each weekly close on the last day of its week, a Wednesday, and fill the six days in between along a straight line. Those days are estimates, not prices that traded. Totals come out close to the Coinbase series, but anything that reads single days does not: a fall inside one week is flattened, so max drawdown reads too small, and a best or worst buy can land on a price that never traded. Measured on 12 October 2026 with the default plan ($50 a week for 5 years), bitcoin stacked differed by 0.13% between the two series, while max drawdown read 47.1% on Kraken against 48.8% on Coinbase. For the same weekly plan run from 1 January to 30 June 2020, across the March 2020 crash, it read 27.3% on Kraken against 41.1% on Coinbase.

Every price says whether it was observed. Each day in a series is marked observed (a price the source reported for that day) or estimated (a straight-line value between two reported prices, or an earlier price carried forward to a day that has none). The marker travels with every purchase: it is in the CSV export's Price Kind column and in the API's responses, and each result counts how many of its purchases, and how many of the days checked for max drawdown, rest on an estimate. On the Coinbase series that count is normally zero. A file exported at a manual price has no Price Kind column, because none of its prices came from a market.

When an exchange cannot be reached. If the exchange you selected does not answer, the server first reuses the copy of that same series it fetched earlier the same UTC day. Failing that, it serves the other exchange's series, and if neither answers, the last series it holds, provided that is less than a day old. In every case the result carries whose prices they are and when they were fetched. The calculator and the scenario pages print a notice when the prices on screen are another exchange's or an earlier copy. A response with a hole in it is rejected, not filled in: more than 7 days between two Coinbase candles, more than 14 between two Kraken ones, or a series that stops more than 3 days ago.

Gaps use the last known price. If a scheduled purchase lands on a day with no price, the simulation carries the most recent earlier price forward rather than skipping the buy, and marks that purchase as estimated. A purchase dated after today is marked the same way, whichever price it is projected at.

Same Plan, Every Start Date

One backtest is one start date. This comparison asks what the same plan did from all of the others.

What is run. Take your plan's frequency and its length, from its start date to its end date or to today if it ends later, rounded to whole months. The shortest is three months, and the plan has to be shorter than the price history. That plan is replayed from every possible start day in the history, one day apart. Each run buys the same fixed amount on its schedule and is valued at the price on its last day, so the result does not depend on the amount. Daily, weekly and bi-weekly runs buy every 1, 7 or 14 days. Monthly runs buy every 30.44 days, an average month, not on a calendar day-of-month. Your percentage fee is applied to every run. A flat fee, a starting stack and a yearly increase are not.

Which prices. Only the default series, whichever price source you have selected, and only up to the last finished day, which is normally yesterday: today has not closed. It can be limited to exchange closes alone (from 20 July 2015), which leaves out the years when the price is a cross-exchange average. If Coinbase cannot be reached, a copy of its closes fetched within the last day is used. With none in hand there is no comparison to show. It is never run on Kraken's estimates, and it is not shown at a manual price.

What is reported. The worst, 10th percentile, median, 90th percentile and best total return across the runs, the share of runs that ended below what was paid in, and where your own plan's return falls among them. With fewer than 20 runs only the worst and the best are shown.

Your own plan's return. The line marked “Your start” is your schedule measured the way the runs are: the purchases made up to your end date, or up to today if the plan ends later, valued at that last day's price in the series you have selected. It is not the headline return, which uses the live price and counts a starting stack. A plan with a flat fee or a yearly increase is not ranked, because the runs have neither.

Independent periods. The runs overlap almost completely: two five-year runs that start a day apart share 1,825 of their 1,826 days. So the number of runs says how finely the history was sampled, not how much evidence there is. The honest count is how many windows of that length fit end to end in the history, the days of history divided by the plan's length and rounded down. We report it next to the run count as independent periods. Checked on 12 October 2026, on prices through the day before: a five-year weekly plan had 4,073 runs and 3 independent periods (2 on exchange closes alone). A one-year weekly plan had 5,534 runs and 16 independent periods, and with a 0.5% fee 26% of those runs ended below what was paid in.

These are past outcomes. Every figure describes start dates that have already played out. None of it is a forecast or a probability.

Cost-basis percentile. The line on a share card that ranks your average cost uses the same replay, over all history and with no fee. It compares your average cost per bitcoin with the average cost of every run and reports the share of start dates that ended with a higher one, rounded down. Your percentage fee is taken back out of your own average cost first, which is why the line says “before fees”. It needs at least 30 runs, and it is left off for a plan with a flat fee, a starting stack, a yearly increase or a manual price.

The studies. Lump sum vs DCA, best day to buy and the start-date heatmap each carry their own method note on the page, next to the numbers it explains.

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. The fee fields take a percentage and a flat amount per buy. A spread built into the price a platform quotes you, and the price differences between exchanges, are not modeled unless you add them to the percentage yourself.
  • •One price per day. Every purchase executes at the day's series price. Intraday timing is not simulated, and neither is the price you would actually have been filled at.
  • •One exchange rate. A result in a currency other than US dollars is the dollar result at one recent rate. What each buy cost in that currency on its own day is not modeled.
  • •A short history. The price data starts in August 2010. Only three five-year periods fit in it end to end, so a backtest here describes a handful of market cycles, not a long record.

Changelog

October 2026

Daily closes by default, and every estimate labeled

Several of these change numbers the site had already shown. Where that is so, the entry says by how much.

Prices

  • •Changed: the default price series is Coinbase's daily closes. It was Kraken's weekly closes with the days between filled in. A link or an API call that names no provider now gets Coinbase. Measured on 12 October 2026 with the default plan ($50 a week for 5 years), this and the re-dating in the next entry raised bitcoin stacked by 0.16% and ROI by about 0.3 points, and moved max drawdown from 47.1% to 48.8%. What changed in the API is on the developers page.
  • •Fixed: Kraken's weekly closes were dated one day late, on the Thursday the next week opens. Against Coinbase's daily closes over 586 weeks they were off by a median of about 1.7% as dated and 0.03% one day earlier. Every Kraken-series price after 19 July 2015 moved one day earlier.
  • •New: every price is marked observed or estimated, in the CSV export and the API, and each result counts the purchases and drawdown days that rest on an estimate.
  • •Changed: purchases still to come are priced at the live price the stack is valued at. They were priced at the price history's newest row, up to an hour older, so a plan that had not started could show a gain or loss that was only the gap between the two.
  • •Changed: when a day has more than one price the last is used. This affects the current day on the Kraken series.
  • •Fixed: a live price could be served well after its cache lifetime had passed. A quote that old is now fetched again, and the final XIRR cash flow is dated at the moment the price was quoted.
  • •Fixed: when the S&P 500 total-return index could not be loaded, the comparison used the price-only index under the total-return label. It now says the data is unavailable.

The math

  • •New: a flat fee per buy, alongside the percentage fee.
  • •Changed: the “share of runs that ended in profit” line is gone. It read 100% for the default plan and counted runs that overlap almost entirely as separate evidence. In its place are the range of outcomes across every start date, the share that ended below cost, and the number of independent periods. Start dates step a day at a time (they stepped a week), monthly runs step an average month (they stepped 30 days), and your percentage fee is applied (the runs were fee-free).
  • •Fixed: the example at the top of the home page ran the default plan with no fee while the calculator below it used 0.5%. Both now use 0.5%.
  • •Changed: a yearly increase on a plan started on 29 February steps on 28 February in other years, so a monthly plan gets its raise on the 13th purchase. It stepped on 1 March, the 14th.
  • •Fixed: the after-inflation figures deflated only the final value, and read the price index up to the plan's end date while valuing the stack at today's price. Each purchase is now restated from its own month, up to the day the stack is valued. At a flat price with 3% inflation over five years the old method read −13.7% for a weekly plan where the like-for-like figure is −7.3%.
  • •Fixed: with no live quote, the savings comparison valued bitcoin at the plan window's last daily price but compounded the savings balance on to today. Both sides are now valued on the same day.
  • •Changed: a plan with an amount of 0 and a starting stack makes no purchases. It had listed a purchase of 0 on every scheduled day.

Currencies and fees

  • •New: a result in another currency says, where it is shown, that every buy was converted at one dated exchange rate: in the calculator, the CSV export (in a column of its own), share cards and their images, the embed widget and the Share My Stack card.
  • •Changed: a shared link always names its currency, and a link with an amount but no currency is read as US dollars. Before, a visitor with another currency saved read the same number in their own currency.
  • •Changed: exchange rates come from Frankfurter's ECB endpoint at api.frankfurter.dev. The fixed fallback table had drifted 3% to 7% from the market. It now holds the ECB rates of 12 October 2026, and figures converted with it are labeled approximate.
  • •Changed: the exchange fee figures were re-read from each platform's own page on 12 October 2026. Swan's 0.5% promotion ended on 8 September 2026 and it lists 1%. Coinbase publishes no fixed figure, so no cost is modeled for it: it had been priced at $2.99 plus about 0.5% a buy, the fee page's 6.5% row, which is now a labeled example of a $1 flat fee. A 0.5% to 2% range quoted for Kraken's spread was removed, because Kraken publishes no figure. Details are on the exchange fee page.

Planners, tracker and cards

  • •Changed: the spend-down planner opens at a price change of 0% a year. It opened at +15%.
  • •Fixed: the planner's largest withdrawal that lasts 30 years is rounded down. Rounded to the nearest unit it could print an amount that ran out a month early.
  • •Fixed: a comma typed as a decimal point in the planner's stack, withdrawal and floor fields is read as one. “0,5” BTC had been read as 5.
  • •Fixed: the cost-basis tracker refuses a fee outside 0 to 50%. It had saved such a plan at 50% or 0% without saying so.
  • •Changed: the equal-split figure divides 21 million BTC by 8.3 billion people and comes to 253,012 sats. It used 8.1 billion and read 259,259.
  • •Changed: the supply card's lost-coin figure is a range from a 2017 study, 2.78 to 3.79 million BTC, with its source. It was a flat 3.7 million with none, and the “available” figure worked out from it is gone.
  • •Changed: the adoption card shows Crypto.com's estimates of Bitcoin owners for December 2022 to 2025, about 365 million at the latest. It showed 560 million, and a line back to 2010, with no source.
  • •New: the price ticker names the exchange it quotes, each network card says when it could not refresh and when its figure was last updated, and the Lightning card prints the day mempool.space dates its figures.
  • •Fixed: amounts shortened for a phone are rounded half up from the cent, so 13,050 reads 13.1K in every currency.

Scenario pages and studies

  • •Fixed: on the DCA scenario pages, “Value at year end” was the value at that year's last purchase, which is 1 December for a monthly plan. It is now the value on 31 December. Those pages also moved to daily closes: measured on 12 October 2026, max drawdown reads deeper on all 112 of them, by as much as 9.1 points, and best buy changed date on 18.
  • •Changed: a scenario page values its stack at the newest price it holds: an exchange's quote, or the latest trade in its price history when that is newer. It used the quote even when it was the older of the two.
  • •Changed: the three studies (lump sum vs DCA, best day to buy, the start-date heatmap) are computed on finished Coinbase daily closes only, never the Kraken fallback or today's unfinished price. When those closes cannot be loaded a study keeps its last published version. The best-day page replaced its rankings over the last 10, 5 and 2 years with a test of each day's price against the seven days centered on it.
  • •Changed: the drawdown table also lists the fall still under way, and says what its counts are without 15 and 16 September 2010 (11 and 8).
  • •Changed: the “from 2013 peak” preset starts on 30 November 2013, the day the scenario page uses. It started on 4 December.
August 2026

Accuracy fixes

  • •Fixed: XIRR dated its final cash flow at the plan's end date while valuing the stack at today's price, which squeezed years of growth into the plan's window. A 2016 to 2018 plan read +574% a year instead of about +54%.
  • •Fixed: max drawdown was sampled only on purchase days, so a monthly plan missed any crash that began and ended between two buys. It now checks every UTC day, and reported drawdowns can be deeper than before.
  • •Fixed: a start date before 18 August 2010 was priced at the first price in the series, $0.07. Earlier dates are no longer accepted.
  • •Fixed: Kraken's weekly closes were paired with the start of their week, which dated them about six days early.
  • •Changed: the S&P 500 comparison uses the total-return index, with dividends reinvested. The price-only index it used before understated the S&P by roughly 1.5% to 2% a year.
  • •Fixed: blockchain.info's daily prices now run to 19 July 2015 on both series. That closed a 19-day stretch that had been filled in and stopped the Kraken series discarding about 630 days of daily data.
  • •Fixed: the asset comparison values every asset at the same moment, XIRR's final value is dated at the last daily price when there is no live quote, and max drawdown is blank at a manual price.
  • •New: starting stack and yearly increase, a free public API, and a cost-basis percentile on share cards.
  • •Changed: the best-day-to-buy page stopped naming a winning weekday. Its ranking was measuring start dates, not weekdays.
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. Replaced in October 2026.
  • •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.