Commissions, spread and slippage models
Lesson 11 · about 11 min
Most backtests that look good and trade badly have one thing in common: the costs were set to zero, or to a round number someone guessed. Costs are not a footnote. For short-holding-period strategies they are the largest single input, and getting them roughly right is the difference between a system with an edge and a system that pays the broker to entertain you.
Three costs, three shapes
| Cost | What it is | Shape |
|---|---|---|
| Commission | Fee charged by the broker or exchange per trade or per unit | Fixed per trade, per share, or per contract; known in advance |
| Spread | Gap between bid and ask; a market buy pays the ask, a market sell hits the bid | Half the spread per side; varies with time of day and volatility |
| Slippage | Difference between the price you expected and the price you got, beyond the spread | Random, skewed against you, larger in fast markets and for larger orders |
Commissions are easy: look up your broker's schedule and charge it on every fill. Spread and slippage need a model, because they vary, and the model you choose can move a marginal strategy from positive to negative.
Typical magnitudes
These are rough orders of magnitude for a retail account in liquid instruments during normal hours. Your own numbers will differ; measure them.
| Market | Commission (round trip) | Typical spread | Reasonable slippage assumption |
|---|---|---|---|
| US large-cap stock | $0 to $2 | $0.01 | 1 to 2 cents per side, more at open/close |
| Index futures (e.g. ES) | $3 to $5 per contract | 1 tick ($12.50) | 1 tick per side on stops, 0 on limits |
| Micro index futures | $1 to $2 per contract | 1 tick ($1.25) | 1 tick per side |
| EUR/USD (retail) | $0 (in spread) or ~$5 per lot | 0.5 to 1.5 pips | 0.5 pip per side, several pips at news |
| BTC perpetual | 0.02% to 0.06% per side (taker) | 0.01% or less | 0.02% to 0.05% per side |
The point of the table is the last column: slippage on a stop order in futures is close to one tick almost every time, and several ticks in a fast market. Setting it to zero because "ES is liquid" is wrong.
Converting costs into R
The right unit for costs is R, because that is the unit your expectancy is in. Take the round-trip cost in dollars and divide by the dollar risk per trade.
Example: a stock strategy risking $200 per trade, average stop distance $1.00, so 200 shares. Round trip: commission $1, spread 2 × $0.01 × 200 = $4, slippage 2 × $0.015 × 200 = $6. Total $11, or 0.055R per trade.
Now the same strategy with a tight $0.20 stop: 1,000 shares. Spread 2 × $0.01 × 1,000 = $20, slippage 2 × $0.015 × 1,000 = $30, commission $1. Total $51, or 0.255R per trade. The same dollar risk, five times the cost in R, because the stop is tight and the cost is per share.
| Stop distance | Shares | Round-trip cost | Cost in R |
|---|---|---|---|
| $1.00 | 200 | $11 | 0.055R |
| $0.50 | 400 | $21 | 0.105R |
| $0.20 | 1,000 | $51 | 0.255R |
| $0.10 | 2,000 | $101 | 0.505R |
At a $0.10 stop, half an R is gone before the trade starts. A strategy needs an enormous gross edge to survive that.
Key idea: Costs scale with position size, and position size scales inversely with stop distance. Tight stops turn small per-share costs into a large fraction of R. Always express costs in R and subtract them from every trade in the backtest.
Slippage models
There are four common ways to model slippage. Use the one that matches your data and be consistent.
- Fixed ticks per side. Simple, transparent, fine for liquid futures and forex. One tick per side on market and stop orders, zero on limits (with the limit-fill assumption from the next lesson).
- Fixed percentage. Suitable for stocks and crypto across a wide price range. 0.02% to 0.05% per side is a starting point for liquid names.
- Volatility-scaled. Slippage = k × ATR, with k around 0.05 to 0.1. Captures the fact that fast markets slip more. Better for strategies that trade around news or opens.
- Volume-scaled. Slippage rises with order size relative to bar volume. Necessary for anything that is not tiny relative to the market; Lesson 3 covers it under capacity.
Whatever model you choose, run the backtest at 1×, 2× and 3× the assumed slippage. A strategy that is positive at 1× and negative at 2× is a strategy whose edge is smaller than your uncertainty about costs.
| Slippage multiple | Avg R | Profit factor |
|---|---|---|
| 0× (no costs) | +0.31 | 1.72 |
| 1× | +0.22 | 1.45 |
| 2× | +0.13 | 1.24 |
| 3× | +0.04 | 1.07 |
This is what a real strategy sensitivity table looks like. The strategy is tradeable at 1× and marginal at 2×. If your measured live slippage comes in at 2× the assumption, you will know very quickly why the live results disappoint.
Measuring your own
After a month of live or paper trading, compare each fill price with the price your rules said you would get. The average difference, in ticks or percent, is your actual slippage. Put that number in the backtest and rerun. This is the single most useful calibration you can do.
Try it: Take your last 20 live fills. For each, record the intended price and the actual price. Average the difference per side. Compare it with the slippage assumption in your backtest. If you have never measured this, you are probably under-estimating by at least half.
Recap
- Three costs: commission (known), spread (half per side), slippage (random, skewed against you).
- Convert all costs to R; tight stops make per-share costs a large fraction of R.
- Model slippage as fixed ticks, fixed percent, ATR-scaled or volume-scaled, and be consistent.
- Run the test at 1×, 2× and 3× assumed slippage; an edge that vanishes at 2× is too thin.
- Measure real slippage from live fills and put it back into the backtest.
See it drawn
Original diagrams for the ideas on this page. Illustrative, not real market data.