Why is my live spread wider than my backtest?
Asked as: why is my live spread wider than my backtest
Usually because the backtest used a spread that never existed. Here is how to find which of the four causes is yours, and what each one costs you.
The short answer
In most cases the live spread is not wider than it should be. The backtest spread was narrower than anything that ever existed, and the gap you are looking at is the size of that fiction.
There are four causes, they are separable, and they have different remedies. Knowing which one is yours matters more than knowing the total, because three of the four are fixable in your own process and one is not fixable at all.
WHAT THIS IS — AND WHAT IS NOT PUBLISHED. This article is method, not result. No spread distribution has been measured and published by me, for any venue, instrument or period. There is no dataset behind this page and no hash; nothing here reports what any broker’s spreads actually are. The decomposition below is a procedure you run on your own record. Status: NOT YET PUBLISHED.
Prerequisite Knowledge
You need two records over the same period, at the same resolution: the quotes your terminal actually received, and the fills you actually got. Almost everyone has the second and almost nobody keeps the first, which is why this question usually gets answered with a guess. Without the quote stream you can measure the total shortfall but you cannot attribute it, and an unattributed shortfall tells you only that something is wrong.
The four causes, in the order they are usually guilty
1. The backtest used a constant where a distribution belongs
The constant-spread error is the common case and the largest. A single spread value — whether the broker’s advertised typical, the average of the file, or a number chosen because it felt conservative — removes the property that matters most: spread and volatility are correlated, and so are volatility and your entries.
If your strategy trades breakouts, news reactions, or anything triggered by movement, its entries are concentrated in precisely the conditions where the spread is widest. Costing those entries at the all-hours average is not an approximation. It is a systematic underestimate whose size scales with how much your strategy depends on movement.
The test is direct: recompute the backtest using the spread that was actually quoted at each entry timestamp, and compare. The difference is what the constant was hiding.
2. The historical file’s spread column is reconstructed, not recorded
Many historical datasets carry a spread that was never quoted to anyone. Mid-price series get a synthetic spread applied afterwards; gaps get filled by interpolation that smooths away the widest moments; files exported from one account tier get traded by someone on another.
This is a tick data provenance problem, and it is checkable. Record your own quote stream for a period, then compare its spread distribution against the same period in your historical file — not the means, the upper tail. Reconstruction shows up in the tail, because that is where interpolation does its damage and where the average hides it.
3. Your fills are not at the quote you were shown
Distinct from spread, and often mistaken for it. The quote was real; you did not get it. This is slippage, and mixing it into the spread question means you will try to fix a routing problem with a cost assumption.
Separate them arithmetically: expected cost at the quoted spread on one side, realised implementation shortfall on the other. What remains after subtracting the first from the second is the part the spread never explained.
4. Your own size is moving the price
The smallest cause for retail, and the one nobody can remove. If your order consumes more than the top of book, the average price you pay is worse than the quote by construction, and no backtest that fills at a single price models it.
Check by binning realised cost against order size. A flat relationship means size is not your problem. A relationship that steepens past a threshold is your book depth, and it is the one cause on this list with no fix other than trading smaller or slower.
The Observable Mechanism
Everything above derives from two series you can capture yourself — received quotes with arrival timestamps, and your own fills — plus the historical file you backtested on. The decomposition needs no venue-side data and no privileged access, which is the point: a cost model you cannot check is not a cost model, it is a hope with a number attached.
A measured floor, and the part of it that is not the spread
The artifact published with this article measures the quoted-spread distribution for twenty-eight pairs and, for the seven where the commission converts, adds commission to give a cost floor — the minimum move that has to happen before the trade breaks even.
| pair | median spread | commission, round trip | cost floor |
|---|---|---|---|
| EURUSD | 0.1 | 0.6 | 0.7 |
| AUDUSD | 0.1 | 0.6 | 0.7 |
| NZDUSD | 0.1 | 0.6 | 0.7 |
| USDCHF | 0.3 | 0.481 | 0.78 |
| GBPUSD | 0.2 | 0.6 | 0.8 |
| USDCAD | 0.2 | 0.826 | 1.03 |
| USDJPY | 0.1 | 0.954 | 1.05 |
Pips. Commission from a named raw/ECN schedule, supplied by me.
On every one of the seven, the commission is larger than the median spread — on EURUSD by six times. If you are arguing with your backtest about a tenth of a pip of spread while the commission line is six tenths, the spread was never the main term. That is worth knowing before you spend an afternoon tuning the assumption that matters least.
Read the account type before transferring this to your own: on a commission-free account the same cost reappears inside a wider spread, so the floor is comparable while its composition is not. The pairs, not the totals, are what transfer.
Three limits, all of them in the file rather than in this paragraph. Twenty-one of the
twenty-eight pairs have no cost floor at all — they are crosses whose commission is quoted
per USD notional, and converting it needs a third USD leg this lane does not hold, so each
reads NOT YET COMPUTED rather than carrying a guess. Zero-spread and crossed ticks are
counted and excluded, never averaged in, which makes every floor above conservative in a
stated direction: folding them back would lower it, never raise it. And the floor is a
threshold, not a prediction — it states what a move must beat, and nothing on that face
implies a move that beats it exists.
What the decomposition is worth
A strategy that survives realistic costs and one that survives an average is not the same strategy, and the difference is not marginal. The category of system most damaged by this is the one that trades often for small edges, because cost error compounds with trade count while edge does not.
The uncomfortable version: a great many strategies are profitable under a constant spread and unprofitable under the distribution that actually occurred. Discovering which one yours is costs a few hours of recomputation. Discovering it live costs whatever you funded the account with.
What This Does Not Establish (The Limits)
This decomposition establishes what your costs were over your sample, at your sizes, on your venue, in the conditions that happened to occur. It does not establish what they will be — a period without a liquidity event is not evidence that liquidity events will not happen, and the widest spreads in any record are usually a small number of moments that dominate the tail. It also says nothing about whether your edge is real: a strategy correctly costed is still a strategy that may have been fitted to noise, and that is a separate question with its own tests.
Where this leads
Costing entries at the spread that was actually quoted, and attributing the remainder honestly, is what the Feed & Execution instruments do as a matter of routine rather than as an investigation you mount after a bad month. The spread regime and execution cost definitions are in the glossary if you want the terms used precisely, and why backtests fail in live trading covers the failures that survive after the cost model is fixed.
The artifact
SHA256: d8ca13284c6bff925a2d7de72f39b22614eba9c56be6edce04fb1d5681fc8678
Download datasetClaims examined
Claim 01§ claim-4de36840
I used a realistic fixed spread in the backtest, so my costs are covered.
A fixed spread is not conservative — it is wrong in a direction that flatters you. Real spreads are wide exactly when the market moves, which is exactly when most strategies trade. Averaging that away does not add a safety margin; it removes the correlation between cost and activity, which is where the cost actually lives. A fixed spread set at the average understates true cost for any strategy whose entries cluster in fast conditions, and almost all of them do.
Claim 02§ claim-e0ac3a45
My backtest data came from my broker, so its spreads are my spreads.
Historical files sold or exported by a broker are frequently reconstructed rather than recorded — resampled from mid, gap-filled, or carrying the spread of a different account tier from the one you trade. Unless the file states its provenance and you have verified it against quotes your own terminal received, the spread column is an assumption wearing the costume of a measurement.
Claim 03§ claim-7dcb0cac
The difference is slippage, not spread.
Spread and slippage are separable and worth separating, because they have different causes and different fixes. Spread is the cost of crossing at the instant you cross; slippage is the difference between the price you expected and the price you got. Attributing the whole shortfall to one of them without decomposing it means whichever fix you attempt will be aimed at the wrong half.
Each claim above has a permanent address — the § link — whose canonical home is the refutation index, where it carries its variant phrasings and the true proposition stated on its own feet; this article is the evidence behind it. If a claim's text ever changes, it becomes a new claim at a new address, and the old one stops resolving rather than silently meaning something else.
Explore further
Concepts
Research
- Why did my broker charge me so much in swaps?Asked as:
why did my broker charge me so much in swaps
- Why does my EA work on demo but not live?Asked as:
why does my ea work on demo but not on a live account
- How do I test a backtest for overfitting?Asked as:
how to test a backtest for overfitting