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: range_bps, hourly, 1–31 January 2024, from this page's Sample CSV · extreme: 810.3 bps, 9 Jan, 21:00 UTC · built with range
lowhighextreme
range_bps
Range (bps)
Range in basis points expresses the bar high-low spread in a way that is directly comparable across symbols and price levels.
That normalization makes it much more actionable than a raw absolute range when you are screening for unusually active intervals.
price_std
Price Std Dev
Price Std Dev measures how dispersed transaction prices were around the mean within the interval.
Unlike the simple high-low range, it tells you whether activity was broadly scattered or concentrated near a central level.
price_skewness
Price Skewness
Price Skewness captures whether the distribution of trade prices leaned toward the upper or lower tail of the interval.
Positive skew often means occasional bursts to the upside, while negative skew suggests the heavier excursions were downward.
price_kurtosis
Price Kurtosis
Price Kurtosis highlights whether price observations were tightly clustered with a few extreme prints or more evenly spread out.
Elevated kurtosis is often a clue that the interval contained bursts, tails, or jump-like behavior despite a modest average move.
price_cv
Price CV
Price CV scales standard deviation by the mean price, creating a relative dispersion measure.
It is especially helpful when comparing instruments with very different nominal prices or when monitoring how variability changes through time.
A candlestick reduces thousands of trades to four numbers: open, high, low, close. This compression discards the path — and the path contains information that the endpoints don't.
High-low trade price range in basis points of the closing price
price_mean
Mean Price
Average trade price in the interval
price_median
Median Price
Median trade price in the interval
price_std
Price Std Dev
Standard deviation of trade prices in the interval
price_variance
Price Variance
Variance of trade prices in the interval
price_skewness
Price Skewness
Skewness of the trade-price distribution
price_kurtosis
Price Kurtosis
Kurtosis of the trade-price distribution
price_range_ratio
Price Range Ratio
Highest trade price divided by lowest trade price
price_cv
Price CV
Coefficient of variation of trade price
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 requiredaperiodicrange --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 range.<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="range",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.