How to check crypto data quality and where it came from
Four checks for crypto price data: missing bars, unfinished candles, exchange gaps and file hashes, with real Bitcoin numbers for each.
Checking crypto data comes down to four questions: are bars missing, is the newest candle finished, do two exchanges agree, and is the file the one you think it is. In our check, Binance's BTCUSDT hourly bars had 0 missing hours since 2019, while Coinbase's BTC-USD had 55 since 2015. On 4 Binance market-days, the daily candle's close and the last hourly close of the same day did not agree.
A basis point (bp) is one hundredth of one percent, so 100 bp is 1%.
The numbers below describe past data. They show how big data differences can be.
Why does the source of crypto data matter?
The same coin trades on many exchanges. Each exchange builds its own price bars. A bar, also called a candle, shows the open, high, low and close price over a set time. Two bars that look the same can come from different markets, with different units, holes and update times.
Without the source, you cannot tell a real pattern from a hole in the file. A good data answer says what it covers, what it leaves out, and how to get the same file again.
Are any bars missing?
Count the bars between the first and last time stamp, and compare that with the bars you have. We did this for 12 hourly markets, with data to October 20, 2026.
| Market | Hourly bars present | Hours missing |
|---|---|---|
| Binance BTCUSDT perp (from September 2019) | 62,359 | 0 |
| All 10 Binance perps we used | 53,225 to 62,359 each | 0 |
| Coinbase BTC-USD spot (from July 2015) | 98,564 | 55 |
| Coinbase ETH-USD spot (from May 2016) | 91,155 | about two hundred |
A perp is a futures contract that never expires. Spot means buying the coin itself.
Binance had no holes at all. Coinbase had a few. A missing hour can mean nothing traded, or it can mean the data has a gap. Either way, it is not a zero move. We left each hole empty and never filled it with the last price. Any test window that touched a hole was dropped.
Is the newest candle finished?
A candle that is still forming keeps changing until its time is up. If you use it, your "close" is just the last price so far.
The fix is a rule: use only completed bars. The same rule applies to what comes after a bar. To measure how Bitcoin moved over the next 24 hours, you need all 24 hourly closes to exist.
In our base-rate test, Binance BTCUSDT had 62,359 hourly bars. The usable windows were fewer, because the newest hours have no full future yet:
| Look-ahead | Complete windows | Share where price was higher |
|---|---|---|
| 12 hours | 62,347 | 51.30% |
| 24 hours | 62,335 | 51.88% |
| 48 hours | 62,311 | 52.23% |
Each count is the number of bars minus the look-ahead, which is exactly the number of newest hours with no full future. These windows overlap, so they are not that many separate tests. Flat moves count as not higher.
Also check what a bar's time stamp means. Some files label a bar by the time it opened, others by the time it closed. Mixing the two shifts every result by one bar. Our guide on when the daily candle closes shows the times.
The same care matters for live data. A live feed that has gone quiet can look calm when it is only stale. Comparand refuses live labels older than 120 seconds, with a live_stale error, and a refused call is not billed. Our post on look-ahead bias shows what happens when a test peeks at a candle that was not finished.
Do two exchanges agree on the price?
Not exactly. We matched each hourly Coinbase BTC-USD close with the Binance BTCUSDT close at the same UTC time. We then measured 10,000 × (Coinbase ÷ Binance − 1). A positive number means Coinbase was higher.
Binance has 62,359 hourly bars and 62,342 matched, so 17 Binance hours had no Coinbase partner.
| Year | Matched hours | Median gap (bp) | 5th percentile | 95th percentile |
|---|---|---|---|---|
| 2019 (from September 8) | 2,741 | 5.90 | −20.39 | 29.77 |
| 2020 | 8,781 | 2.83 | −22.82 | 25.14 |
| 2021 | 8,760 | 1.42 | −15.09 | 15.35 |
| 2022 | 8,760 | 4.99 | −9.51 | 11.82 |
| 2023 | 8,757 | 4.39 | −7.79 | 15.67 |
| 2024 | 8,784 | 0.70 | −12.46 | 10.07 |
| 2025 | 8,755 | 5.33 | −3.95 | 11.13 |
| 2026 (to October 20) | 7,004 | −1.01 | −11.07 | 8.29 |
| All years | 62,342 | 3.26 | −12.36 | 15.05 |
The 5th and 95th percentiles are cutoffs: about one hour in twenty fell below the first, and one in twenty above the second.
Part of this gap is a difference in units: Coinbase quotes US dollars, and Binance quotes USDT, a dollar-linked token. Part is spot versus perp. The last prices in each hour can also come at different seconds. It is not a profit you could take, because it leaves out fees, funding and the cost of moving money. Our post on why Bitcoin price differs between exchanges goes through the causes.
The lesson: if two charts differ by 3 bp, that is normal. If you mix venues in one test, you add this noise without noticing.
Do the daily and hourly candles agree?
They should, but in our check they did not always. On 4 Binance market-days, the daily candle's close and the last hourly candle of the same day disagreed. We could not tell which was right, so we do not publish those individual candle values. Each study stays on one bar size, and we say which.
If your tool gives more than one bar size, compare them on a few days.
Is the file the one you think it is?
A hash is a fingerprint of a file: a 64-character code made by a formula. Change one byte and the code changes. If a publisher lists a hash and yours matches, you have the same file.
For our research, each bar file was saved with its fingerprint and a record of where its bars came from. Binance's files came from public archives that carry their own checksums, with gaps filled from its public API, and Coinbase's came from its public API. Fingerprints show the file did not change. They do not show the exchange's original history was right.
What does this not show?
It does not show which exchange has the "true" price. Binance and Coinbase measure different things. It covers hourly closes only, not order books, fees, spreads, shorter bars or other coins.
How we measured this
We used hourly bars from public Binance archives and the public Coinbase API, through October 20, 2026. For the gap, we matched closes at the same UTC time and calculated the basis-point difference. We counted missing hours by comparing the bars present with the hours between the first and last bar. For the complete-window counts, we required an unbroken run of hourly closes from the anchor to the end of the window. Limits: the 4 daily and hourly disagreements stay unresolved, the markets are a selected set of survivors, and we did not check against a third data source.
Try this in Comparand
Ask your connected AI agent: "Which Hyperliquid days are complete? Then show me the provenance for the one I plan to use."
- hl_coverage lists the archive days, the coin list and which days are complete. Call it first. It takes no arguments and is free.
- hl_coverage_calendar takes a coin. It shows which days hold 1-minute bars, 5-minute bars, funding and labels for that coin, with a status and provenance for each. It is free.
- hl_provenance takes a day and returns the full provenance record for that archive day. It is free.
- hl_bulk_files lists whole archive day files with their size in bytes and sha256 fingerprint, so you can check a download. It is free. Our guide to downloading Hyperliquid data walks through it.
Every answer from Comparand also carries a prov block: the days, digests and code revisions behind it. A meter block shows what the call cost.
For other exchanges, ask: "Which venues can you serve, and how many bars does Binance BTCUSDT have for these dates?" venue_coverage and venue_bars are free, and venue_bars returns completed bars only. You can try 3 coins free, read the tool docs, or see how the answers are built. These are past cases, not a forecast.
The short version
- Check four things: missing bars, unfinished candles, exchange gaps, and file fingerprints.
- Binance BTCUSDT hourly had 0 missing hours; Coinbase BTC-USD had 55.
- Coinbase was a median 3.26 bp above Binance over 62,342 matched hours, with 90% of hours from −12.36 to +15.05 bp.
- Keep holes empty and use only complete windows.
- Ask your tool for coverage and provenance before you trust a result.
Questions people ask
How do I check crypto price data for quality?
Check four things: are any bars missing, is the newest candle finished, do two exchanges agree on price, and is the file the one you think it is. Each check is quick once you know what to look for.
How far apart are Coinbase and Binance Bitcoin prices?
For 62,342 matched hourly closes since 2019, Coinbase BTC-USD was a median 3.26 basis points above Binance BTCUSDT. The middle 90% of hours ran from −12.36 to +15.05 basis points. A basis point is one hundredth of one percent.
Should I fill in missing candles?
No. A missing hour is not a zero move. In our tests, missing closes stayed missing, and any window with a hole in it was dropped.
What is a data hash?
A hash is a fingerprint of a file, made by a formula. If even one byte of the file changes, the fingerprint changes. If your fingerprint matches the published one, you have the same file.
Does Comparand show where its data came from?
Yes. Every answer carries a prov block with the days, digests and code revisions behind it, plus a meter block with what the call cost.