1-second aggregates: columns and preview
One parquet table per source and UTC day, built from the raw files of the same day: a row per second, stamped on the collector's receive clock. Every file records in its footer the raw file it was built from and that file's sha256, so an aggregate can be checked against its source.
There are three table shapes: cex_1s for the four exchanges, pm_1s for Polymarket and oracle_1s for Chainlink.
The tables below are drawn from a real free sample: the first rows of each file, as they are in it. Download the sample or see the raw.
Conventions
- Time
tsistimestamp[ns, UTC]and marks the start of the bar: bars are left-closed,[ts, ts + 1 s).- The clock
- Bars are stamped on the collector's receive clock, not on the venue's. It is the only clock on every message of every venue and it is the same physical clock for all of them, so joining two venues on
tsis exact; and it is when the information was actually available to a participant.event_lag_msreturns what this costs: the median of receive time minus venue time over the bar. Subtract it for venue time. A large value means the messages arrived late in a burst. - Sizes
- Every column ending in
_size,_size_NN,_depth_*orquote_volumeis in the quote currency (USDT, USD, USDC), never in the base asset and never in contracts. Base size is recoverable: divide by the price in the same row.volumeandtaker_buy_volumeare in the base asset, as the names usually mean. - Complete calendar
- Every second of the day is present: a second in which nothing happened is a row with
n_messages = 0. The exception is Polymarket, which has rows only while a market is quoted. - Carried forward, and not
- A silent bar keeps the last quote and the last book — the quote is still the standing quote — and says how stale it is in
quote_age_ms,book_age_msandn_messages; filter on those.book_validis not that filter: it says the book was provably in sync when last updated, not that it was updated recently. Trade columns are never carried: no trade istrades = 0and a null price. - Nulls
- A missing value is a parquet null. There are no NaNs standing in for nulls and no zeros standing in for “unknown”.
- Prices are float64
- float32 would round at the scale the data measures.
- Provenance
- The footer carries
schema_version,source_file,source_sha256,producer,bucket_ruleandclock. The generation time is deliberately absent, so rebuilding from the same input gives the same bytes.
Polymarket
polymarket.<coin>.<market>_<day>.v4.1s.parquet · table pm_1s
One row per second per outcome token, both the Up and the Down token, while the market is quoted — so the table is far shorter than a day (about 270 thousand rows for a 5-minute coin). Prices are probabilities between 0 and 1. Keyed and sorted by (ts, condition_id, asset_id).
Preview
Loading the preview…
Columns (82)
Market
| Column | Type | Meaning |
|---|---|---|
| ts | timestamp[ns, UTC] | Start of the bar, on the collector's receive clock. |
| condition_id | string | Market id. |
| asset_id | string | The outcome token: a decimal uint256, it is a string and has to stay one. |
| outcome | string | What this token pays on: Up or Down. |
| coin | string | The coin, e.g. btc. |
| interval_min | int16 | Market length in minutes, 5 or 15. |
| market_start_ts | timestamp[ns, UTC] | Start of the market's own window. |
| market_end_ts | timestamp[ns, UTC] | End of the market's own window. |
| winning_outcome | string | The settled outcome, the same on every row of a market. A label from the future — never a feature. |
| tick_size | double | Current price step; it changes during a market's life (0.01 to 0.001). |
| quote_currency | string | Always USDC. |
Quote
| Column | Type | Meaning |
|---|---|---|
| bid_price | double | Best bid at the end of the bar: a probability, 0 to 1. |
| bid_size | double | Notional at the best bid, USDC. |
| ask_price | double | Best ask. |
| ask_size | double | Notional at the best ask. |
| mid_open | double | Mid at the start of the second. |
| mid_high | double | Highest mid. |
| mid_low | double | Lowest mid. |
| mid_close | double | Mid at the end of the second. |
| mid_twap | double | Time-weighted mid. |
| spread_twap | double | Time-weighted spread in probability points — basis points mean nothing near a price of zero. |
| bbo_count | int32 | Best-quote updates in the bar. |
| quote_age_ms | int32 | Age of the quote at the end of the bar. |
Executions
| Column | Type | Meaning |
|---|---|---|
| open | double | First execution price in the bar; null when nothing traded. |
| high | double | Highest execution price. |
| low | double | Lowest execution price. |
| close | double | Last execution price. |
| vwap | double | Volume-weighted average execution price. |
| volume | double | Shares traded. |
| quote_volume | double | Notional traded, USDC. |
| taker_buy_volume | double | Shares bought by takers. |
| taker_buy_quote_volume | double | The same, USDC. |
| trades | int32 | Number of executions. |
Order book, at the end of the bar
| Column | Type | Meaning |
|---|---|---|
| bid_price_NN / bid_size_NN | double | The ten best bid levels, best first (00 … 09): price and notional. |
| ask_price_NN / ask_size_NN | double | The ten best ask levels. |
| bid_size_total | double | The whole bid ladder, summed. The book of a market is small and known entirely. |
| ask_size_total | double | The whole ask ladder, summed. |
| bid_levels | int32 | Number of price levels on the bid side. |
| ask_levels | int32 | Number of price levels on the ask side. |
Quality
| Column | Type | Meaning |
|---|---|---|
| n_messages | int32 | Messages for this token in the bar. |
| book_updates | int32 | Changes to resting orders — not trades: it counts orders placed and pulled without trading. |
| event_lag_ms | int32 | Median of receive time minus the venue's time. |
| book_age_ms | int32 | Time since the last book update at the end of the bar. |
| book_valid | bool | The replayed book was in sync. |
Left out on purpose
- Market announcements and the catalogue —
new_marketcovers other series' markets and the catalogue is one shared dump; both are in the raw files, which are sold separately.
Notes
- The book is trimmed to the venue's own stated top: a fill does not always delete a level, so a book built from level updates alone would keep bids above the real best bid until the next full snapshot. Without the trim the replayed top disagreed with the venue on 0.18% of updates; with it, on 2 in 3.7 million.
Binance
binance.<coin>_<day>.v4.1s.parquet · table cex_1s
One row per second per instrument — spot and perpetual as separate rows, a complete calendar of 86,400 seconds each, so 172,800 rows a day. Keyed and sorted by (ts, symbol, instrument_class).
Preview
Loading the preview…
Columns (83)
Identity
| Column | Type | Meaning |
|---|---|---|
| ts | timestamp[ns, UTC] | Start of the bar, on the collector's receive clock. |
| exchange | string | binance, bybit, okx or coinbase. |
| symbol | string | The venue's own name: BTCUSDT, BTC-USDT-SWAP, BTC-USD. |
| instrument_class | string | spot or perp. Binance and Bybit call both their spot pair and their perpetual BTCUSDT, so symbol alone is not a key. |
| base | string | The base asset, e.g. BTC. |
| quote_currency | string | USDT or USD. Treated as the same 1.0; no conversion is applied. |
| contract_size | double | Base asset per contract: 1.0, except on OKX swaps (see the OKX notes). |
| size_unit | string | Always quote_notional: every *_size* column is in the quote currency. |
Quote
| Column | Type | Meaning |
|---|---|---|
| bid_price | double | Best bid at the end of the bar. |
| bid_size | double | Notional standing at the best bid, quote currency. |
| ask_price | double | Best ask at the end of the bar. |
| ask_size | double | Notional standing at the best ask. |
| mid_open | double | Mid price at the start of the second. |
| mid_high | double | Highest mid within the second. |
| mid_low | double | Lowest mid within the second. |
| mid_close | double | Mid price at the end of the second. |
| mid_twap | double | Time-weighted mid over the second: keeps the shape of the second that the last value loses. |
| spread_twap_bps | double | Time-weighted spread, basis points. |
| bbo_count | int32 | Best-quote updates in the bar. |
| quote_age_ms | int32 | Age of the quote at the end of the bar: tells a quiet market from a dead feed. |
Trades
| Column | Type | Meaning |
|---|---|---|
| open | double | First trade price in the bar. Null when nothing traded — the previous close is not carried forward. |
| high | double | Highest trade price. |
| low | double | Lowest trade price. |
| close | double | Last trade price. |
| vwap | double | Volume-weighted average trade price. |
| volume | double | Traded volume in the base asset. |
| quote_volume | double | Traded volume in the quote currency. Not derivable from volume exactly, so both are kept. |
| taker_buy_volume | double | The part of volume where the taker bought, base asset. |
| taker_buy_quote_volume | double | The same, quote currency. |
| trades | int32 | Number of trades. 0 when none. |
| taker_side_inferred | bool | true on Coinbase only: the taker side is derived there, not given by the protocol. |
Order book, at the end of the bar
The book is replayed from the raw messages. Depth is computed on the whole replayed book, not on the ten levels.
| Column | Type | Meaning |
|---|---|---|
| bid_price_NN / bid_size_NN | double | The ten best bid levels, best first (00 … 09): price, and notional at the level in the quote currency. |
| ask_price_NN / ask_size_NN | double | The ten best ask levels, the same. |
| bid_depth_1bps | double | Notional resting within 1 basis point of the mid, bid side. |
| bid_depth_2bps | double | Within 2 basis points. |
| bid_depth_5bps | double | Within 5 basis points. |
| ask_depth_1bps | double | Within 1 basis point of the mid, ask side. |
| ask_depth_2bps | double | Within 2 basis points. |
| ask_depth_5bps | double | Within 5 basis points. |
| book_span_bps | double | How far the maintained book reaches, the narrower side. Read every depth column against it: a venue that keeps few levels cannot have depth beyond its reach, and that is a limit of the subscription, not a thin market. |
Quality
| Column | Type | Meaning |
|---|---|---|
| n_messages | int32 | Messages of any kind for this instrument in the bar. 0 means silence. |
| event_lag_ms | int32 | Median of receive time minus the venue's time over the bar's messages; null if none carried a venue clock. |
| sequence_gaps | int32 | Sequence discontinuities detected in the bar. |
| book_valid | bool | The replayed book was provably in sync when last updated. Read it with book_age_ms. |
| book_age_ms | int32 | Time since the last depth update, at the end of the bar. |
Notes
- Binance publishes no book snapshot on its websocket. Where the capture has the REST snapshot the book is exact; where it does not, the book columns are null with
book_valid = falserather than filled with a guess.
Bybit
bybit.<coin>_<day>.v4.1s.parquet · table cex_1s
The same table as Binance: spot and perpetual as separate rows, 172,800 rows a day.
Preview
Loading the preview…
Columns (83)
The same table as Binance — 83 columns, listed there. What differs is in the notes below.
OKX
okx.<coin>_<day>.v4.1s.parquet · table cex_1s
The same table: spot and swap as separate rows, 172,800 rows a day.
Preview
Loading the preview…
Columns (83)
The same table as Binance — 83 columns, listed there. What differs is in the notes below.
Notes
- OKX swaps quote in contracts and
contract_sizerecords the conversion: 0.01 BTC, 0.1 ETH, 1 SOL, 100 XRP, 1000 DOGE per contract. Every size here is already converted to notional. - OKX keeps 400 levels, which on the BTC swap span roughly 8 basis points:
*_depth_5bpsis complete, anything wider would be censored.book_span_bpsstates the reach of every bar.
Coinbase
coinbase.<coin>_<day>.v4.1s.parquet · table cex_1s
The same table, spot only: 86,400 rows a day. There is no BNB file.
Preview
Loading the preview…
Columns (83)
The same table as Binance — 83 columns, listed there. What differs is in the notes below.
Notes
- Coinbase does not publish the taker side. Its trade
sidebehaves like the maker's, sotaker_buy_volumeis derived and every row carriestaker_side_inferred = true. - Coinbase sends a book snapshot on connect and on reconnect, not on a schedule. Before the first one in a capture the book columns are null with
book_valid = false.
Chainlink
chainlink.<coin>_<day>.v4.1s.parquet · table oracle_1s
The Chainlink feed that settles the markets and its two smoothed views: one row per second, a complete calendar of 86,400 rows. There is no order book and no tape. Keyed and sorted by (ts, symbol).
Preview
Loading the preview…
Columns (10)
Oracle
| Column | Type | Meaning |
|---|---|---|
| ts | timestamp[ns, UTC] | The oracle round, not the arrival time. A round is published about 1.7 s after the second it is stamped with. |
| symbol | string | BTC/USD. |
| price | double | The unsmoothed oracle price. |
| twap_30s | double | 30-second rolling mean, published on the same feed. The 5-minute markets settled on it before 2026-08-14. |
| twap_60s | double | 60-second rolling mean: what the markets settle on now. |
| price_e18 | decimal(38, 18) | price exactly as published on chain, unrounded. |
| twap_30s_e18 | decimal(38, 18) | twap_30s, unrounded. |
| twap_60s_e18 | decimal(38, 18) | twap_60s, unrounded. Use the _e18 columns wherever the value settles money. |
| event_lag_ms | int32 | Median of receive time minus the round's time: about 1,700 ms. |
| n_topics | int8 | How many of the three series arrived for that round; 3 is complete. |
Left out on purpose
- The exchange-price series (
crypto_prices) — The exchanges' own spot prices are in their own files.
Notes
tsis the round, not the arrival. Joining this table to an exchange table ontsand acting on the result uses information about 1.7 seconds before it existed: shift byevent_lag_msfor a point-in-time join.
Limits worth knowing
- Feed outages are real and marked, not hidden — Sockets drop. When one does,
n_messagesfalls to zero,sequence_gapscounts the discontinuity where the venue numbers its updates, andbook_validgoes false until the book can be proven again. - USD and USDC are treated as 1.0 USDT — No conversion between quote currencies is applied;
quote_currencysays which one a row is in.