Quant Memo
Core

L1, L2 and L3 Data Fidelity for Simulation

Market data comes in tiers of detail — top-of-book only, full depth by price level, or every individual order — and each tier of fidelity unlocks a different class of question a backtest can answer honestly, at a correspondingly steeper cost in data size and complexity.

Prerequisites: Simulator Fidelity Versus Speed

Before choosing how to simulate fills, you first have to decide what you can even see. Exchange data is typically sold and delivered in three tiers of increasing detail, conventionally labeled L1, L2, and L3, and the tier a backtest is built on puts a hard ceiling on what questions it can answer honestly — no amount of clever modeling substitutes for data the simulator never had.

The three tiers

L1 (top of book) gives only the best bid, best ask, and their sizes — enough to know the current spread and whether a marketable order would fill, but nothing about what's behind the best price. L2 (market by price) aggregates resting size at every price level, showing full depth of the book, but collapses all orders at a given price into one number — you know there's 500 shares resting at the best bid, but not whether that's one order or fifty, or which one would fill first. L3 (market by order) shows every individual resting order with its own ID, size, and — critically — its position in the queue, letting a simulator determine exactly which specific order would be filled next and by how much.

L1 best bid/ask only L2 depth by price level L3 individual orders + queue position
Fidelity increases left to right: L1 shows only the top price, L2 shows full depth aggregated by price, and L3 shows every individual order and its queue position within a price level.

Worked example: what breaks at each tier

A team backtesting a passive market-making strategy that posts limit orders at the best bid needs to know, for any resting order, whether it would fill and roughly when. On L1 data, the simulator can tell an order was marketable or not but has no way to estimate queue position at all — it might assume "if the best bid traded, my order filled," which wildly overstates fill rates since it ignores everyone else resting ahead. On L2 data, the simulator can see total size at the best bid (say 2,000 shares) and, if it knows its own order joined when 1,800 shares were already resting, can estimate it needs roughly 1,800 shares of trading through that level before its own order is reached — a reasonable approximation, but still blind to whether the resting size ahead is one large order or many small cancelable ones. Only L3 data would let the simulator track the strategy's own specific order against every other individual order queued ahead of it, capturing that some of that ahead-queue size might cancel before it's ever hit.

What this means in practice

Match the data tier to the strategy: signal research on daily or hourly horizons is usually fine on L1 or even bar data, since queue mechanics don't matter at that timescale; anything that posts passive limit orders and cares about fill probability needs at least L2, and serious market-making or queue-position-sensitive strategies need L3 to be simulated honestly. Using a lower tier than the strategy needs doesn't just lose precision — it removes the simulator's ability to represent the exact mechanism (queue position, competing orders) the strategy's edge actually depends on.

L1, L2, and L3 market data provide successively more detail — best price only, full depth by price, or every individual order with queue position — and a simulator can never see more than its data tier allows. Strategies whose edge depends on queue position or fill probability need L2 or L3 data; using coarser data doesn't just reduce precision, it removes the ability to model the mechanism the strategy relies on.

Related concepts

Practice in interviews

Further reading

  • Harris, Trading and Exchanges, ch. 4
ShareTwitterLinkedIn