Equity Microstructure Data
Tick-level datasets used in Chapter 3 (Market Microstructure) and related chapters. Four independent sources at different granularities and cost points.
| Dataset | Granularity | Source | Access | Disk |
|---|---|---|---|---|
| Trade & Quotes (TAQ) | Tick (trades + NBBO quotes) | AlgoSeek slim | Manual (reader package) | ~87 MB |
| Market by Order (MBO) | Per-order | Databento XNAS.ITCH |
Paid (~$5, free credit covers) | ~1 GB |
| NASDAQ ITCH | Raw binary (all messages) | NASDAQ public FTP | Free | 4-6 GB/day |
| IEX HIST | Tick (TOPS / DEEP) | IEX public | Free | 150 MB - 10 GB/day |
Every loader lives in data/equities/loader.py and raises
DataNotFoundError with a runnable download command when data is missing.
Trade & Quotes (TAQ)
AlgoSeek TAQ slim slice — AAPL on 2020-03-13 (pre-stress) and 2020-03-16 (COVID crash). Two days preserve the original Hive layout so the loader is identical to the full commercial feed.
| Property | Value |
|---|---|
| Source | AlgoSeek (slim reader package, hosted) |
| Frequency | Tick (trades + NBBO quote events) |
| Dates | 2020-03-13, 2020-03-16 |
| Symbols | AAPL |
| Rows | ~2.5M events |
| Schema | timestamp (µs), symbol, event_type, price, quantity, exchange, conditions |
| License | Commercial — slim slice redistributed under reader license |
# Slim package download (URL + instructions pending AlgoSeek reader bundle)
# For book readers: fetch the bundle, unpack under:
# $ML4T_DATA_PATH/equities/market/microstructure/trade_and_quotes_slim/
from data import load_nasdaq100_taq
df = load_nasdaq100_taq(symbol="AAPL")
The re-encoder that produced the slim slice lives at
build_taq_slim.py (zstd level 22, same schema).
Notebooks: 03_market_microstructure/02_taq_microstructure.py,
03_market_microstructure/03_taq_liquidity_fragmentation.py.
Market by Order (MBO)
Databento XNAS.ITCH MBO schema — NVDA across November 2024 (10 trading
days). Full order-level messages (add / cancel / modify / fill / trade)
for order-book reconstruction.
| Property | Value |
|---|---|
| Source | Databento Download Center or API |
| Frequency | Tick (per-order) |
| Dates | 2024-11-04 to 2024-11-15 |
| Symbols | NVDA |
| Disk | ~1 GB |
| Cost | ~$5 (under $10; new accounts get $125 free credit) |
| Schema | ts_event, symbol, action, side, price, size, order_id, flags |
| License | Paid (per-job cost); redistribution prohibited |
Manual download is preferred — see
MBO_DOWNLOAD.md for click-through Databento Download
Center steps.
API-driven alternative (requires DATABENTO_API_KEY):
# Always estimate first to avoid surprise charges
uv run python data/equities/market/microstructure/mbo_download.py --estimate-only
uv run python data/equities/market/microstructure/mbo_download.py
from data import load_mbo_data
df = load_mbo_data(symbols=["NVDA"])
files = load_mbo_data(symbols=["NVDA"], list_files=True) # lazy iteration
Notebooks: 03_market_microstructure/04_order_book_reconstruction.py
and subsequent order-book analysis.
NASDAQ ITCH
Raw TotalView-ITCH message stream from NASDAQ's public FTP mirror. Includes all order-book messages (add, cancel, delete, execute, trade, imbalance, status changes).
| Property | Value |
|---|---|
| Source | NASDAQ public FTP (emi.nasdaq.com) |
| Frequency | Tick (all message types) |
| Dates | Various sample dates (default: 2020-01-30) |
| Disk | 4-6 GB per date (compressed binary) |
| Cost | Free |
| License | NASDAQ ITCH Specification (no restriction on educational use) |
uv run python data/equities/market/microstructure/nasdaq_itch_download.py --list
uv run python data/equities/market/microstructure/nasdaq_itch_download.py --date 01302020
from data import load_nasdaq_itch
messages = load_nasdaq_itch(date="20200130", msg_type="trade")
Files are raw binary — parsing happens in the download script; parsed
output lives under equities/market/microstructure/nasdaq_itch/messages/.
Notebooks: 03_market_microstructure/05_itch_order_book.py.
IEX HIST
IEX exchange historical data, updated T+1 with a rolling 12-month window. Two feed types available — TOPS (top of book) is small; DEEP (full depth) is required for limit-order-book reconstruction.
| Property | Value |
|---|---|
| Source | IEX public (iextrading.com/trading/market-data) |
| Frequency | Tick (TOPS: BBO + trades; DEEP: full depth updates) |
| Retention | 12 months rolling |
| Disk | TOPS ~150-500 MB/day; DEEP ~5-10 GB/day |
| Cost | Free |
| License | IEX Historical Data Terms of Use — attribution required |
uv run python data/equities/market/microstructure/iex_download.py --list
uv run python data/equities/market/microstructure/iex_download.py --smallest # tiny TOPS sample
uv run python data/equities/market/microstructure/iex_download.py --date 20241220 --deep
from data import load_iex_hist
df = load_iex_hist(feed="tops", data_type="trades", symbols=["AAPL"])
raw = load_iex_hist(feed="deep", get_raw_files=True) # pcap paths for custom parsing
Raw pcap files must be parsed before use — the IEX LOB reconstruction
notebook handles this and writes results back under the canonical
iex/{feed}/parsed/ location.
Notebooks: 03_market_microstructure/16_iex_lob_reconstruction.py.
Expected On-Disk Layout
equities/market/microstructure/
├── trade_and_quotes_slim/ # AlgoSeek slim (primary loader target)
│ └── symbol=AAPL/date={YYYYMMDD}.parquet
├── trade_and_quotes/ # full AlgoSeek TAQ (optional; same schema)
│ └── symbol={SYMBOL}/date={YYYYMMDD}.parquet
├── market_by_order/
│ └── {SYMBOL}/xnas-itch-{YYYYMMDD}.mbo.dbn.parquet
├── nasdaq_itch/
│ ├── raw/{date}.bin.gz # binary downloads
│ └── messages/{msg_type}/{date}.parquet # parsed
└── iex/
├── tops/{YYYYMMDD}.pcap.gz
├── tops/parsed/ # populated by 16_iex_lob_reconstruction.py
├── deep/{YYYYMMDD}.pcap.gz
└── deep/parsed/
Dataset Card
Run the executable dataset card for a side-by-side view:
uv run python data/equities/market/microstructure/dataset_card.py
Loader Surface
| Loader | Returns | DataNotFoundError prints |
|---|---|---|
load_nasdaq100_taq(symbol=...) |
DataFrame (tick events) | AlgoSeek reader package instructions |
load_mbo_data(symbols=..., list_files=...) |
DataFrame or list[Path] | mbo_download.py --estimate-only |
load_nasdaq_itch(date=..., msg_type=...) |
DataFrame | nasdaq_itch_download.py --date ... |
load_iex_hist(feed=..., data_type=..., symbols=..., get_raw_files=...) |
DataFrame or list[Path] | iex_download.py --smallest or --deep |