100 trades. A 0.04% taker fee. A 0.02% slippage assumption. Those numbers can make a backtest look measured, but the surprising one is the last: a single slippage rate says almost nothing about whether your orders could have traded at those prices.
Slippage depends on what you trade, when you trade, and how large your order is compared with the liquidity available at that moment. A backtest built from candles usually knows the first two only roughly and the third not at all. Treating its average fill as a fact can give a strategy an execution record it never earned.
Why can’t OHLCV tell me my average fill?
A candle records the range and aggregate volume over an interval. It does not say how volume was distributed across prices, how much sat at the best bid and ask, or whether your order arrived before or after the trades that made the candle's low. A low printed once on a tiny trade and a low that absorbed steady volume have the same OHLC value.
Imagine a 1-minute bar with $200,000 of volume and a $50,000 market buy. The order is 25% of bar volume. That doesn't prove it would move the market by 25%, or that it could fill at the bar's open. It tells you the order is large enough relative to the bar that a zero-impact assumption deserves suspicion. If the same order is only 0.2% of volume, the concern is smaller, though volume alone still doesn't reveal the book's depth or replenishment.
This is why “slippage is 2 basis points” is a model choice, not a property of the symbol. It can be a useful baseline. It cannot be a universal answer.
How should I estimate market impact from bar data?
Start with a scale your data can support. For each order, calculate participation: order notional divided by the bar's traded notional. Then examine how the strategy's results change across participation bands. Here is a deliberately simple illustration; the assumed impacts are stress inputs, not estimates of a particular venue's execution.
| Order / bar notional | Illustrative one-way impact | What to ask |
|---|---|---|
| 0.2% | 1 bp | Is spread and taker fee already larger than this? |
| 2% | 5 bp | Does the edge survive a wider spread and slower fill? |
| 20% | 25 bp | Would participation itself change the price path? |
One basis point is 0.01%. If a strategy turns over $100,000 in each direction, 5 bp of impact on both sides costs about $100 round trip, before fees. That arithmetic is simple; deciding whether 5 bp is plausible needs more evidence. If your signal trades exactly when volume spikes, a bar-wide volume denominator may even make participation appear safer than it is during the minutes when your order actually arrives.
What should a slippage stress test include?
Don't bury execution uncertainty in one portfolio-wide average. Keep the dimensions that change the answer visible:
- Direction: buy orders cross the ask and sell orders cross the bid; spread cost applies on each entry and exit.
- Order size: report participation by trade and by liquidity regime, not only as a backtest average.
- Order type: a market order pays for immediacy; a resting limit order may miss the move or sit behind other queue interest.
- Timing: a bar-close signal cannot claim the bar's closing price as a fill after seeing that close.
- Market state: widen assumptions around fast moves, thin hours, and the exact conditions that trigger the strategy.
Run at least a base case and a harsher case. For example, double the assumed spread and impact, then inspect which trades and periods account for the change. If the strategy only works in the quietest fills, that's a research finding. It's better to learn it before paper trading.
Keep fees, spread, and impact as separate line items. Fees come from the account's schedule; spread and impact depend on execution. Combining them hides which assumption is doing the work.
When do I need order-book data?
Use trade and quote data when the strategy's edge is comparable to the spread, trades frequently, or depends on short-lived liquidity. Use depth snapshots or event-level book data when queue position, partial fills, or book depletion determine whether the signal is executable. Even then, historical replay won't perfectly reproduce your own market impact; observed liquidity was recorded without your hypothetical order in it.
For slower strategies, bar data can still screen ideas. Keep position sizes small relative to observed volume, disclose the impact curve you assumed, and test whether reasonable changes erase the result. That's a defensible use of a rough fill model. Calling it an exact average fill isn't.
The practical goal is not to guess the one true slippage number. It's to find the range where the strategy stops making sense, then see whether your data and order size put you comfortably away from that boundary. If they don't, the next useful research task is better execution data, not another decimal place in the backtest report.
← All posts


