Skip to content
GetProfitable
Search

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.

  1. 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).
  2. 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.
  3. 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.
  4. 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
+0.22 1.45
+0.13 1.24
+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.

Slippage on a market orderA buy order clears four price levels, so the average price paid is worse than the price first quoted.Buy 1,000 shares at marketpricesell orders resting (bar length = size)20.04300 shares20.03200 shares20.01200 shares20.00300 sharesnothing resting at 20.02order sweeps up the bookaverage fill 20.02SLIPPAGE0.02 a share$20.00 in totalintended 20.00Each level fills at its own price; the average is what you really paid.
Slippage on a market order. You click at 20.00, but only 300 shares are resting there, so the rest of the order fills at 20.01, 20.03 and 20.04. The average price paid is 20.02, and that two-cent gap is slippage.
Bid-ask spread in an order bookSell orders stacked above buy orders with a gap between the best of each.SELLERS (asks)50.0690050.051,40050.0460050.011,10050.002,30049.99800spread = 0.03BUYERS (bids)
The bid-ask spread. Buy orders sit below, sell orders above, and the gap between the best bid (50.01) and best ask (50.04) is the spread you pay to cross. Bar length shows the size resting at each price.
The spread of outcomes behind an expectancyA histogram of forty trades: a tall block of small losses on the left, a low spread of larger wins on the right, and a line marking the average outcome.NUMBER OF TRADES051024 LOSSES, AVG −$20016 WINS, AVG +$600EXPECTANCY +$120−$400−$200$0+$200+$400+$600+$800PROFIT OR LOSS PER TRADEexpectancy = (40% × $600) − (60% × $200) = +$120 per trade
Expectancy: the average trade. Forty trades sorted by outcome: 24 small losses and 16 larger wins. Weighting each side by how often it happens gives the average result per trade, marked here by the dashed line at +$120.