An interactive journey through market microstructure: watch orders become prices, feel the spread respond to stress, and discover why these mechanics shape every trade you will ever make.
Shown: an illustrative order book over time, bids below the mid and asks above it.
01The Order Book Comes AliveEvery market starts with two opposing lines: buyers and sellers, stacked by price and size. The order book is not just a record — it is the market's living, breathing state.
Imagine a room where buyers line up on the left and sellers on the right. The person at the front of each line sets the best bid and best ask. The gap between them is the spread. When a buyer gets impatient and crosses over to the seller's side at their price, a trade happens.
Live order bookSimulated
One tick every 500 ms
Mid price
A market order hits
103.07102.0599.00
100 s agonow
PriceSize
103.702.12
103.606.99
103.504.24
103.104.72
102.309.20
102.104.96
spread0.10
102.006.64
101.901.53
101.7014.32
101.3012.42
101.108.98
100.907.20
Price levels in the live order book
Total quantity available at this price
Mid
102.05
Spread
0.10
Last trade
—
Order size
10.0
Shown: an illustrative order book, simulated in your browser. Try a large size (10+) and watch the spread blow out.
Try placing a market buy with a large size. Watch how the order eats through the ask side, consuming liquidity level by level. The spread widens. The midprice shifts. This is in its most elemental form.
Biais, Hillion & Spatt (1995) showed that the shape of the order book — not just the best price — contains predictive information about future price dynamics. The distribution of depth across levels reveals strategic positioning before it shows up as obvious price moves.
The book above is simulated. Our measures the depth of real books, and there's a free sample to try.
Shown: n_trades, hourly, 1–31 January 2024, from this page's Sample CSV · extreme: 1,637,788, 9 Jan, 21:00 UTC · built with trade_size
lowhighextreme
large_order_volume
Large Order Volume
Large Order Volume tracks how much notional traded in the largest size bucket during the interval.
It is useful because the presence of size often changes the meaning of otherwise ordinary moves in price or total volume.
large_order_percentage
Large Order %
Large Order % shows what share of total traded notional came from the largest bucket rather than from all trades equally.
This helps normalize across busy and quiet sessions, making it easier to identify genuine changes in participant mix.
medium_order_percentage
Medium Order %
Medium Order % often acts as the overlooked middle layer between retail-like fragmentation and outright block activity.
Changes here can matter because many transitions in market participation appear first in the medium bucket before they spill into the large one.
small_order_count_percentage
Small Order Count %
Small Order Count % measures how much of the tape was made up of small individual executions.
It is especially revealing when trade count is high but small-order share dominates, since that can point to reactive retail flow or quote-chasing behavior.
n_trades
Trade Count
Trade Count is the raw number of matched trades in the interval, and it remains one of the best gauges of tape activity.
It helps distinguish quiet directional moves from crowded periods where many separate participants are trying to transact at once.
Not all trades carry the same information. A 50tradeanda50,000 trade on the same instrument represent fundamentally different market participants with different motives, horizons, and information sets. Separating them is one of the most powerful decompositions in empirical microstructure.
Total traded notional from small trades under $100
small_order_count
Small Order Count
Number of trades under $100
medium_order_volume
Medium Order Volume
Total traded notional from medium trades from $100 to under $1,000
medium_order_count
Medium Order Count
Number of trades from $100 to under $1,000
large_order_volume
Large Order Volume
Total traded notional from large trades of at least $1,000
large_order_count
Large Order Count
Number of trades of at least $1,000
volume
Total Volume
Total traded notional in the interval
n_trades
Trade Count
Number of trades in the interval
small_order_percentage
Small Order %
Ratio of small-trade notional to total traded notional
medium_order_percentage
Medium Order %
Ratio of medium-trade notional to total traded notional
large_order_percentage
Large Order %
Ratio of large-trade notional to total traded notional
small_order_count_percentage
Small Order Count %
Share of trades that were small trades
medium_order_count_percentage
Medium Order Count %
Share of trades that were medium trades
large_order_count_percentage
Large Order Count %
Share of trades that were large trades
trade_amount_mean
Mean Trade Size
Average trade notional
trade_amount_median
Median Trade Size
Median trade notional
trade_amount_std
Trade Size Std Dev
Standard deviation of trade notional
trade_amount_variance
Trade Size Variance
Variance of trade notional
trade_amount_skewness
Trade Size Skewness
Skewness of the trade-notional distribution
trade_amount_kurtosis
Trade Size Kurtosis
Kurtosis of the trade-notional distribution
trade_amount_min
Min Trade Size
Smallest trade notional in the interval
trade_amount_max
Max Trade Size
Largest trade notional in the interval
trade_amount_range_ratio
Trade Size Range Ratio
Largest trade notional divided by smallest trade notional
trade_amount_cv
Trade Size CV
Coefficient of variation of trade notional
Example Request
# Install the Aperiodic CLI into ~/.local/binmkdir -p"$HOME/.local/bin"curl-fsSLhttps://raw.githubusercontent.com/aperiodic-io/cli/main/install.sh | INSTALL_DIR="$HOME/.local/bin"bashexportPATH="$HOME/.local/bin:$PATH"# Free preview — no API key requiredaperiodictrade_size --preview \--exchangebinance-futures \--symbolperpetual-BTC-USDT:USDT \--interval 5m \--timestampexchange \--start-date2025-05-01 \--end-date2025-05-31 \--output-dir ./data && echo"Saved to $PWD/data"
Live Stream
Every new row as it is computed, over WebSocket at wss://stream.aperiodic.io/v1/stream. Authenticate with your API key in the X-API-KEY header and subscribe to channels named trade_size.<exchange>.<interval>, on intervals 15s, 30s, 1m, 5m, 15m, 30m, 1h, 4h, 1d (15s and 30s on Institutional Live only). Streaming is included on Live plans.
importosfromaperiodic importstreamformessage instream(api_key=os.environ["APERIODIC_API_KEY"],dataset="trade_size",exchange="binance-futures",interval="1m",symbols=["perpetual-BTC-USDT:USDT"], # omit for every symbol on your plan):print(message.channel, message.snapshot, message.data)
Query Parameters
timestampreqstring
string
Timestamp source. 'exchange' uses the exchange-reported timestamp, 'true' uses actual arrival time at our servers.
exchangetrue
intervalreqstring
string
Aggregation time interval for the data. Sub-minute intervals (15s, 30s) require an Institutional plan.
15s30s1m5m15m30m1h4h1d
exchangereqstring
string
Source exchange for the data.
binance-futuresokx-perpshyperliquid-perps
symbolreqstring
string
Trading pair symbol in the format of Atlas' universal symbology: https://github.com/aperiodic-io/atlas
start_datereqstring<date>
string<date>
Start date for the data range (YYYY-MM-DD format). A metric series starts on the first day of the raw series it is computed from (see /metadata/raw); raw trades and quotes start binance-futures from 2020-01-01, okx-perps from 2019-09-01, hyperliquid-perps from 2025-01-01. Earlier days return no files. How far back you can go depends on the plan: 5 years on Pro, full history on Prime, Prime + Raw and Institutional. An earlier start_date than the plan reaches returns 403.
end_datereqstring<date>
string<date>
End date for the data range (YYYY-MM-DD format). Must be greater than or equal to start_date.
Successful response with download URLs for every existing file covering the range from the series' published start — one per month before 2026-08-01, one per day from 2026-08-01 onwards
Schema
filesobject[]required
Files covering the requested date range, in chronological order. Data before 2026-08-01 is split by month (one file per calendar month, no `day`); data from 2026-08-01 onwards is split by day (one file per calendar day, with `day` set). The changeover falls on a month boundary, so a given month is served entirely one way or the other; a range spanning it returns the earlier months as monthly files followed by a daily file per day.
yearintegerrequired
Year of the data file
monthintegerrequired
Month of the data file (1-12)
dayinteger
Day of the data file (1-31). Present only on daily files, i.e. those covering 2026-08-01 onwards. Absent on monthly files, which cover an entire calendar month.
urlstring<uri>required
Presigned URL for direct file download (valid for 5 minutes). URLs are served from dataset-specific subdomains, e.g. ohlcv.aperiodic.io, trade-metrics.aperiodic.io, l1-metrics.aperiodic.io, l2-metrics.aperiodic.io, derivative-metrics.aperiodic.io.