BitMEX Tick Trade Dataset

BitMEX Historical Tick Trade Data

BitMEX public trade executions from futures markets, normalized into the same tick schema used across CryptoHFTData venues.

No credit card · The sample is one real hourly Parquet file and needs no API key

Is this the right dataset?

What “tick data” means on this page

Tick data is an overloaded term. This page owns downloadable execution-level trade history; ticker statistics and L2 order book changes are separate datasets.

Sample

See the data before you sign up

The first rows of one real hour: XBTUSDT on BitMEX, 2026-09-02 at 12:00 UTC. One row per public trade as published by the venue.

bitmex/2026-09-02/12/XBTUSDT_trades.parquetDownload full file
received_timeevent_timesymboltrade_idpricequantitytrade_timeis_buyer_makerorder_type
17883505571632598831788347492933XBTUSDT183748194922442548776607.6100001788347492933falseMarket
17883505571632598831788350555598XBTUSDT625615340984003308176820.1200001788350555598falseMarket
17883508003919010491788350800251XBTUSDT799482819613539047676674.41000001788350800251trueMarket
17883519538078177791788351953657XBTUSDT331719850605091440276968.6200001788351953657falseMarket
17883525924768769111788352592319XBTUSDT10919742212605548676841.6100001788352592319falseMarket
17883527015626644371788352701410XBTUSDT191715135409405541476785.8100001788352701410falseMarket
Showing 6 of 7 rows in this hourTimestamps are raw integers; units are in the schema below

Wire format

From exchange message to Parquet row

Every row starts as a message on the exchange's WebSocket or REST API. Point at a line or a column to see where each value comes from and how we convert it. Our test suite replays these messages through the production pipeline, so the rows shown are the rows you download.

BitMEX (historical)

Reconstructed: BitMEX is closed, and it is not possible to capture its feed now. The trade object is the BitMEX REST record of this trade (GET /api/v1/trade), byte for byte. BitMEX documents that WebSocket rows have the same structure as REST rows. The table/action wrapper uses the documented BitMEX WebSocket format.

Exchange sends

WebSocket message (reconstructed) · trade:<symbol>received 2026-09-02 12:06:40.391901 UTC

{
"table": "trade",
"action": "insert",
"data": [
{
"timestamp": "2026-09-02T12:06:40.251Z",
"symbol": "XBTUSDT",
"side": "Sell",
"size": 100000,
"price": 76674.4,
"tickDirection": "PlusTick",
"trdMatchID": "00000000-006d-1000-0000-00367d7e88f4",
"grossValue": 7667440000,
"homeNotional": 0.1,
"foreignNotional": 7667.44,
"trdType": "Regular",
"pool": "Secondary"
}
]
}

You download

Parquet row · trades

Point at a line in the message or a column in the row to trace where each value comes from. Click a column to pin it.

Rebuilt from published rows; the exchange has closed

All BitMEX (historical) mapping rules →

Conventions for every exchange are in the wire formats overview. Column types and units for tick trade data are in the schema below.

Use cases

What you can build with tick trade data

Order flow and taker imbalance
Split volume into aggressive buys and sells with is_buyer_maker to build trade-flow imbalance and toxicity signals.
VWAP and execution benchmarks
Compute VWAP, realized spread, and slippage from every print rather than from pre-aggregated candles.
Tick, volume, and dollar bars
Build any bar type from raw executions, so your sampling is not locked to a vendor's candle interval.

Coverage

Tick trade coverage

Every venue is stored under its own exchange ID, so spot and derivatives never mix. Bars show each venue's history from its first hourly file to today, or to its last file for a venue that is no longer collected. Symbol counts are live from the symbols API.

Tick trade coverage by venue, exchange ID, market, history start, and live symbol count
VenueExchange IDMarketHistoryTick trade symbols
BitMEXbitmexFutures
2025-09-29 to 2026-09-2212 mo
155

Other exchanges

Tick Trades data on other exchanges

The same schema on every venue, so switching exchange is a one-argument change.

Or compare every venue on the cross-exchange tick trade overview.

Schema · 9 columns

Normalized tick trade schema

Every row is one public trade as published by the exchange, with exchange timing, trade ID, exact price and quantity strings, buyer-maker status, and order type. On most venues a row is one execution; OKX history before the 2026-09 data-integrity release aggregates fills per taker order and price.

Columns in every tick trade Parquet file
ColumnTypeDescription
received_timeINT64Unix timestamp (nanoseconds) when our system received the trade event
event_timeINT64Unix timestamp when the exchange generated the event (the time unit changes with the exchange)
symbolSTRINGTrading pair symbol (for example, 'BTCUSDT')
trade_idINT64Exchange-specific trade identifier. For OKX history before the 2026-09 data-integrity release, it is the last fill ID of an aggregated row (refer to the venue notes)
priceSTRINGTrade execution price (stored as string for precision)
quantitySTRINGTrade size (stored as string for precision). The unit is the base asset on most venues. OKX derivatives use contracts, and BitMEX uses raw instrument units (refer to the venue notes)
trade_timeINT64Unix timestamp when the trade occurred (the time unit changes with the exchange)
is_buyer_makerBOOLEANTrue if the buyer was the maker (passive side), false if the buyer was the taker
order_typeSTRINGType of order that caused this trade (for example, "LIMIT", "MARKET"), if the venue publishes it. Binance spot does not publish an order type. Thus, the column is always "MARKET" there as a placeholder

Quickstart

From pip install to DataFrame in a minute

The example loads XBTUSDT from BitMEX for 2026-09-02. Change the symbol, exchange, or dates to pull any other slice of the archive.

  1. Install the Python SDK

    pip install cryptohftdata
  2. Create a free API key

    Sign up with email or Google, then generate a key from your dashboard. No credit card.

    Create account
  3. Call get_trades()

    Paste the snippet, replace YOUR_API_KEY, and you get a pandas DataFrame with the columns listed above.

bitmex_trades_data.py
import cryptohftdata as chd

client = chd.CryptoHFTDataClient(api_key="YOUR_API_KEY")

df = client.get_trades(
    symbol="XBTUSDT",
    exchange=chd.exchanges.BITMEX,
    start_date="2026-09-02",
    end_date="2026-09-02",
)

print(df.head())
print(f"Tick trades: {len(df):,}")
REST · no API key needed for single files
curl --fail --location \
  "https://api.cryptohftdata.com/download?file=bitmex/2026-09-02/12/XBTUSDT_trades.parquet" \
  -o XBTUSDT_trades_12.parquet

Caveats

Know this before you backtest

Exchange feeds differ in subtle ways. These are the details that matter for accurate backtests, replay pipelines, and features. Missing hours and pending corrections for every venue are listed on Known Gaps & Corrections.

  1. Each row is a public tick trade as published by the exchange; trade ID semantics and aggregation behavior vary by venue.

  2. is_buyer_maker identifies the passive side. True means the buyer rested and the seller took liquidity; false means the buyer took liquidity.

  3. received_time is recorded in nanoseconds, while exchange event_time and trade_time units are venue dependent. Inspect and normalize timestamp units before joining feeds.

  4. Prices and quantities are stored as strings to preserve exchange precision; cast to decimals or floats as needed.

  5. OKX trades before the 2026-09 data-integrity release are one row per taker order per price level (fills aggregated by the exchange), not one row per fill; from the release they are one row per fill.

  6. Binance spot publishes no order type on its trade stream, so order_type is always MARKET there as a placeholder.

  7. 5–20 % of BitMEX trades are missing on liquid days compared with BitMEX's own trade history; a backfill from the BitMEX REST API is planned. Quantities are in raw per-instrument units.

  8. This page covers 2025-09-29 to 2026-09-22. The exchange has closed, so no new hourly files are published; the existing files remain downloadable.

FAQ

Frequently asked questions

Is BitMEX tick trade data free to download?

Yes. A free CryptoHFTData account with no credit card gives API access to BitMEX tick trade data and every other dataset. Individual hourly files can also be downloaded without an API key on the rate-limited free tier.

How far back does BitMEX tick trade data go?

The hourly files run from 2025-09-29 to 2026-09-22. The exchange has closed, so no new files are added, but the existing files remain downloadable.

What format are the files in?

Each file holds one symbol for one UTC hour, stored as Zstd-compressed Parquet under {exchange_id}/{YYYY-MM-DD}/{HH}/{SYMBOL}_trades.parquet. Parquet reads directly into pandas, Polars, DuckDB, and Arrow.

How do I load BitMEX tick trade data in Python?

Install the SDK with pip install cryptohftdata, create a client with your API key, and call client.get_trades() with a symbol, exchange, and date range. It returns a pandas DataFrame.

What does is_buyer_maker mean?

It identifies the passive side of the trade. True means the buyer's order was resting on the book and the seller took liquidity; false means the buyer was the aggressor.

Start using tick trade data today.

One free API key covers every exchange and every data type. $0.00.