Free crypto tick data, and how to backtest it

On most markets, tick data is something you pay a vendor for. Crypto venues publish their own, one file per day, and two of them cover most of what a researcher needs: Binance for trades, Bybit for trades and for the order book. This page lists what each archive holds, how big a day of it is, and how to turn that day into a backtest.

Where the free data is

Four archives, all public, no account needed. The sizes are one day of BTCUSDT, 2 June 2025, as each venue serves it.

ArchiveWhat it holdsOne day
Binance, spot tradesAggregated trades: price, size, millisecond time, and whether the buyer was the maker
data.binance.vision/data/spot/daily/aggTrades/{SYMBOL}/{SYMBOL}-aggTrades-{date}.zip
13.1 MB
Bybit, perpetual tradesEvery print on USDT (linear) and coin-margined (inverse) perpetuals, with its side
public.bybit.com/trading/{SYMBOL}/{SYMBOL}{date}.csv.gz
50.4 MB
Bybit, spot tradesEvery spot print, timestamps to the millisecond
public.bybit.com/spot/{SYMBOL}/{SYMBOL}_{date}.csv.gz
4.5 MB
Bybit, order bookThe book by price level, as a snapshot then every update, for perpetuals and spot. At 200 levels, 2025-09-02: 202 MB
quote-saver.bycsi.com/orderbook/{category}/{SYMBOL}/
296 MB (500 levels)

What is in each file

Binance's aggTrades group the fills of one taker order at one price into a single row, and carry a flag that says whether the buyer was the maker. That flag is the aggressor side, which is what order-flow work needs: a trade where the buyer was the maker was a sell hitting the bid.

Bybit's perpetual trades are stamped in seconds with a decimal fraction, and how fine that fraction is depends on the day. Up to 2021-12-06 it reaches a tenth of a millisecond on the USDT contracts; from 2021-12-07 to 2022-12-20 it is the whole second; from 2022-12-21 a tenth of a millisecond again. On the coarse days several prints share one timestamp, so anything that orders trades inside a second has to keep the file's own order.

Bybit's order book is a snapshot followed by every change. Its depth depends on the market and the date: perpetuals are 500 levels deep up to 2025-08-20 and 200 from the next day, with the BTCUSDT perpetual going back to 2023-01-18; spot is 200 levels from the end of April 2025 (2025-04-29 for BTCUSDT). Options have no book archive.

data.binance.vision · public.bybit.com · quote-saver.bycsi.com
Binance, spot trades since 2017-08-17
Bybit, BTCUSD inverse perpetual trades since 2019-10-01
Bybit, BTCUSDT perpetual trades since 2020-03-25
stamped to the second
Bybit, spot trades since 2022-11-10
Bybit, perpetual order book since 2023-01-18
500 levels200
Bybit, spot order book since 2025-04-29
200 levels
20182020202220242026
How far back the free BTCUSDT archives go, one file per day up to yesterday, checked against each archive. Blue is trades, violet is the order book. Bybit's perpetual trades were stamped to the whole second from 2021-12-07 to 2022-12-20, and its perpetual book went from 500 levels to 200 on 2025-08-21.

When the free archives are not enough

They are daily files, published once a day is over, so they are for research, not for a live signal. They cover two venues. A strategy that trades across many exchanges, or one that needs the book before 2023, is the case a paid vendor such as Tardis.dev exists for: one format for dozens of venues and deeper history, for a subscription. For CME futures or US equities, Databento is the usual source, and Manifold-BT reads it through its Databento connector.

For one crypto venue and the last few years, the free files are enough to answer the question that matters first: whether an idea survives its own fills.

From a day of ticks to a backtest

Manifold-BT reads these archives directly. ingest_trades fetches the tape, ingest_book the book, and bars_from_trades rebuilds bars from the tape with buy and sell volume kept apart, which a venue's own bars do not carry. A day of the book is streamed into the store as changes, about 44 MB for 200 levels instead of 2.7 GB as full ladders. The strategy below reads both the flow and the book:

tick_flow.py
import manifoldbt as bt
from manifoldbt.expr import col
from manifoldbt.helpers import time_range, Interval

# One day of BTCUSDT perpetual trades, from Bybit's public archive
store = bt.ingest_trades("bybit", "BTCUSDT", symbol_id=1,
                         start="2025-06-02", end="2025-06-02",
                         category="linear")

# The order book of the same day, 500 levels deep, same symbol id
bt.ingest_book("bybit", "BTCUSDT", symbol_id=1,
               start="2025-06-02", end="2025-06-02", category="linear")

# One-second bars rebuilt from the tape: buy and sell volume kept apart
bt.bars_from_trades(store, "BTCUSDT", "2025-06-02", "2025-06-03", interval="1s")

# Who was aggressive over the last 30 seconds, and how the top five levels lean
flow = (col("buy_volume") - col("sell_volume")).rolling_sum(30)
imbalance = bt.book.imbalance(5)

strategy = (
    bt.Strategy.create("flow_and_book")
    .signal("flow", flow)
    .signal("imbalance", imbalance)
    .size(bt.when((flow > 0) & (imbalance > 0.2), 0.5,
          bt.when((flow < 0) & (imbalance < -0.2), -0.5, 0.0)))
)

start, end = time_range("2025-06-02", "2025-06-03")
config = bt.BacktestConfig(
    universe=[1],
    time_range_start=start,
    time_range_end=end,
    bar_interval=Interval.seconds(1),
    initial_capital=10_000,
    # Bybit's base-tier perpetual fees: 0.02% maker, 0.055% taker
    fees=bt.FeeConfig(maker_fee_bps=2.0, taker_fee_bps=5.5),
)
result = bt.run(strategy, config, store)
print(result.summary())

The downloads are free and anyone can fetch them. Reading them into the engine, the tape, the book and the bid and ask, is part of the Researcher plan; Community and Pro backtest on bars.

What tick data changes in a backtest

A bar backtest has to guess what happened inside the bar. When a stop and a target both sit inside one bar, it assumes an order, and the assumption usually flatters the strategy. With the tape, the engine reads which one printed first. With the book, a fill pays the spread that was really there, and a resting order waits behind the size shown at its price before it is filled.

Here is one real minute from the Bybit file above. A long entered at the open with a target 50 dollars higher and a stop 50 dollars lower has both inside this bar; only the tape says the target came first. Sellers took 42.5 of the 55.7 BTC that traded in it, which a bar does not record either.

public.bybit.com/trading/BTCUSDT/BTCUSDT2025-06-02.csv.gz
1 bar1,071 tradesbuyer tookseller tookH 105,623.1O 105,571.4C 105,547.0L 105,518.1high, 10.5 s inlow, 47.6 s in00:15:3000:16
Bybit's BTCUSDT perpetual, 2025-06-02 00:15 UTC: the minute as one bar, and the 1,071 prints inside it from the public trade archive, each dot as large as its size. The bar holds 105,623.1 and 105,518.1 but not their order; the tape puts the high 37 seconds before the low, which decides whether a stop or a target in that bar filled first.

That is the difference between a strategy that looks good on closes and one that survives the market it would have traded in. How each of these is modelled is on execution realism, and a passive strategy that depends on the queue is walked through in market making in Python.

Frequently asked questions

Is there free historical tick data for crypto?

Yes. Binance publishes every spot trade, aggregated, one zip per day, and Bybit publishes every trade on its perpetuals and spot markets, one gzipped CSV per day. Bybit also publishes its order book by price level, which is the free source of historical depth. They are daily files, not a live feed: each day appears once it is over.

How big is a day of tick data?

For BTCUSDT on 2 June 2025: 13.1 MB of Binance spot aggTrades, 50.4 MB of Bybit perpetual trades, 4.5 MB of Bybit spot trades, and 296 MB for Bybit's 500-level order book, which inflates to several gigabytes. Stored as changes rather than full ladders, a day of the book 200 levels deep comes to about 44 MB instead of 2.7 GB.

Does the free data go back far enough to backtest?

For the majors, yes. Bybit's trade archive starts the day a contract listed: 2020-03-25 for the BTCUSDT perpetual, 2019-10-01 for the coin-margined BTCUSD. Its order book goes back to 2023-01-18 for the BTCUSDT perpetual, 500 levels deep up to 2025-08-20 and 200 from the next day, and to the end of April 2025 for spot. Venues other than these two, or the years before, are where a paid vendor earns its fee.

Do I need tick data to backtest?

Not for most strategies. Bars are enough when a strategy trades on closes and holds for hours. Ticks matter when the answer depends on the order prices printed inside a bar: a stop and a target in the same bar, a fill at the real bid or ask rather than the close, the flow of aggressive buyers and sellers, or a passive order waiting in a queue.

Keep reading

Run your first backtest

Install Manifold-BT and reproduce the backtest above in seconds. The Rust core runs years of bars sub-second so you can sweep parameters instead of waiting.

$pip install manifoldbt