Polymarket data for quant research

Polymarket data for quant research means the full record, not a summary of it: every level of every order book, every change to it, every trade, and the outcome, for every recurring Polymarket market type since March 1, 2026, indexed by series. This page is the schema, the measured check behind exact book reconstruction, and a first study in twenty lines, for people who will verify the data before trusting it.

903,238
markets
37.9B
order book rows
280M
trades
207M
candles
March 1, 2026
complete since

What the dataset contains

Order book snapshot
as_of (ms), bids[] and asks[] with price and size at every level, best_bid, best_ask, midpoint, spread, bid_depth, ask_depth

about every 60 s per market, from a few minutes before open

Price change
t (ms), price, side, new size, applied to the snapshot before it

every level move between snapshots; replay rebuilds the book at any tick

Trade
platform_timestamp (ms), price, size, side, fee_rate_bps, market_id

the exchange tape, same connection as the book

Candle
open_time, close_time, open, high, low, close, vwap, volume, trade_count

1s, 5s, 10s, 30s, 1m, 5m, 15m, 1h, 4h, 1d, built from trades

Book metrics
t, best_bid, best_ask, spread, midpoint, bid_depth, ask_depth, bid_levels, ask_levels

per bucket at 1m, 5m, 15m, 1h, 4h, 1d, no replay needed

Market
question, outcomes with platform_token_id, open_time, close_time, resolved_at, winning_outcome, data_start, data_end

the outcome is stored once at resolution; data_start and data_end are the span the market was live in the archive

Timestamps are the exchange's, in epoch milliseconds; prices are probabilities between 0 and 1; sizes are shares. A market with no live book recorded has a data_start of None; skip it on that evidence rather than on a guess.

Exact order book reconstruction, measured

Every price change is linked to the snapshot it follows, so the book at any tick is the last snapshot plus the changes since: snapshot[n+1] = snapshot[n] + changes[n]. On the published BTC 5 minute sample (20 markets, 170 snapshot intervals) 160 intervals reproduce the next snapshot exactly; the 10 that differ each retain one price level the fresh snapshot no longer lists. A reconnection breaks the chain for one interval and the next pair heals it. The sample is public on the dataset page, so the check can be re-run.

A first study in twenty lines

Does order book imbalance before close predict the outcome? Walk an hour of a rolling series, take the book metrics bucket two minutes before each close, and score it against the stored outcome. No book replay is needed; the metrics endpoint serves depth per bucket.

python
from marketlens import MarketLens import pandas as pd client = MarketLens() rows = [] for market in client.series.walk( "btc-up-or-down-5m", status="resolved", after="2026-09-10T12:00:00Z", before="2026-09-10T13:00:00Z", ): if market.data_start is None: # no live book recorded for this one continue last = client.orderbook.metrics( market.id, resolution="1m", after=market.data_start, before=market.close_time - 60_000, ).to_dataframe().iloc[-1] depth = last.bid_depth + last.ask_depth rows.append({"up": market.winning_outcome == "Up", "imbalance": (last.bid_depth - last.ask_depth) / depth}) X = pd.DataFrame(rows) print(X.groupby(X.imbalance > 0).up.mean())

The same question over thousands of markets and months is what the alpha engine is for: one bar per market, target weights, next bar fills, no look-ahead. The SDK repository ships worked examples for microstructure features, execution cost, and implied surfaces.

Reference prices from Binance

Crypto up or down markets settle on an external price, so the archive stores Binance spot candles and trades for BTC, ETH, SOL, XRP, and other underlyings next to the books, as client.reference.candles(symbol) and inside a backtest as ctx.reference_price(). Distance to strike, basis, and lead or lag studies need no second data source.

python
spot = client.reference.candles( "BTC", resolution="1m", after=market.data_start, before=market.data_end, ).to_dataframe() # symbol, timestamp, open, high, low, close, volume

Bulk export and DuckDB

Export a series for a window once and query the Parquet files locally: one compact file per market with snapshot, price change, and trade rows tagged by event_type, plus the Binance reference series. One day of the BTC 5 minute series is 287 markets and about 6.4 million rows; rows are charged once per file and re-downloads are free.

python
import duckdb client.exports.download_series("btc-up-or-down-5m", data_dir="data", after="2026-09-10T00:00:00Z", before="2026-09-11T00:00:00Z") duckdb.sql(""" SELECT date_trunc('hour', to_timestamp(t / 1000)) AS hour, count(*) AS trades, round(sum(size * price), 2) AS notional FROM 'data/history-*-compact.parquet' WHERE event_type = 'trade' GROUP BY 1 ORDER BY 1 """).show()

Academic access

The free tier is full archive access at 25 million rows per day, no card, which covers most papers. Three sample datasets are public on Hugging Face for replication and citation. For a study that needs more than the daily budget, the Pro tier is $39 per month for 5 billion rows a month, and exports charge rows once.

Polymarket quant research data questions

What Polymarket data is available for quant research?

Full order book snapshots about every 60 seconds with every price change between them at millisecond resolution, every executed trade, OHLCV candles from 1 second to 1 day, Binance spot reference prices for crypto, and market metadata with the winning outcome, for 903,238 markets across every recurring Polymarket market type since March 1, 2026: 37.2B price changes, 660M snapshots, 280M trades, indexed by series.

Can the order book be reconstructed exactly at any timestamp?

Each price change is linked to the snapshot it follows, so snapshot[n+1] = snapshot[n] + changes[n] by construction. Measured on the published BTC 5 minute sample (20 markets, 170 snapshot intervals), 160 intervals reproduce the next snapshot exactly and the remaining 10 differ by one retained price level. A reconnection breaks the chain for one interval and the next pair heals it.

Is there academic access to Polymarket historical data?

The free tier gives full archive access at 25 million rows per day with no card, and three sample datasets are public on Hugging Face for citation and replication. Larger pulls run through Parquet exports on the same key.

How do I test a signal across thousands of Polymarket markets?

The SDK's AlphaStrategy engine replays one bar per market per resolution across a whole series or category over long windows and trades to target weights, with next-bar fills so there is no look-ahead. Prove the signal there, then confirm execution with the order level engine over a short window.

Try it

Check it before you trust it

Every level, every change, every trade, with the outcome. The free tier includes 25M rows per day with full archive access, no card required.

bash
$ pip install marketlens