Slippage Has Three Sources, and They Need Three Different Fixes
One slippage number tells you nothing. Split it into chasing, late entry, and spillover, and each piece points at a specific thing you did wrong.
- execution
- slippage
- fills
Most traders track slippage as one number. Average fill versus expected fill, aggregated over the month, reported as a penny count they feel vaguely bad about.
That number is close to useless. Not because it’s wrong, but because three completely different mistakes collapse into it, and they have opposite fixes. Chase less and you’ll cut one of them while doing nothing to the other two. Size down and you’ll cut a different one while possibly making the first worse.
So separate them. Here’s how each one happens, what it looks like in a fill log, and what it’s telling you.
Source one: chasing
You see the move. You’re late. You send a marketable order into something that’s already going.
Between your submission and the moment your order is actionable, the tape keeps printing. It doesn’t slow down for you. If price moved 20 basis points in the two seconds before your fill, whatever you get is a worse price than the one you saw when you decided, and the gap has nothing to do with your size or your broker. You paid for arriving after the information.
The tell in a fill log is a wide gap between the quote when you submitted and the quote when the engine evaluated your order, on a small order that never exceeded the inside size. Nobody walked the book. Nobody sat in a queue. The market simply moved during your latency window.
This is the one traders feel the most and diagnose the worst, because the pain arrives at the same moment as the entry and gets filed under “bad entry” rather than “bad execution.”
The fix is not to be faster. You’re not going to out-latency anyone that matters, and shaving your round trip from 180 milliseconds to 120 changes the arithmetic less than you’d hope on a name moving this fast. The fix is to stop taking entries whose edge is smaller than the move that’s already happened. If the setup only works when you catch it in the first half second, you don’t have a setup, you have a race you’re structurally going to lose.
Source two: late entry
This one belongs to resting orders.
You place a limit inside the spread or at a level. It doesn’t fill immediately, which is fine, that was the plan. It sits. And while it sits, the inside moves, other orders arrive, and the queue in front of you changes shape.
When you finally fill, the fill is stale relative to the market that exists now. The price was right when you sent it. It stopped being right while you waited, and you filled anyway, which usually means you got filled precisely because the market was leaving your level behind.
That last part is the uncomfortable one. Resting orders fill disproportionately when they’re wrong. If the move goes your way, price runs off without you and your order never fills. If it goes against you, the market comes to your price on its way past. Adverse selection is the technical name; every passive trader eats some of it.
The tell is time. A long gap between submission and fill, with a quote that drifted through the whole interval. Our engine models this explicitly on resting limits: your order takes a synthetic queue position behind the displayed book, and as time passes there’s a decaying probability that the market trades at your level without reaching you. The longer you sit, the more likely you fill for a bad reason rather than a good one.
The fix is to have a real opinion about how long your order should live. An order you’d cancel after eight seconds should be cancelled after eight seconds, not left resting because you got distracted by another name. Passive entries are a legitimate strategy. Passive entries left running indefinitely are a slow leak.
Source three: spillover
Your size exceeded what was there.
You wanted 3,000 shares. The inside offer showed 600. Your order takes those 600, and the remaining 2,400 walks up the book, taking whatever’s at the next level, then the next. Your average price is worse than the inside, and by exactly how much depends on how thin the book was in that instant.
This is the most mechanical of the three and by far the easiest to predict, because you can see it coming. The montage is showing you the sizes before you click.
The tell is unmistakable in a fill log: the fill price differs from the NBBO at evaluation time, and the order’s quantity was larger than the size displayed at the inside. Nothing about timing explains it. You simply asked for more than the market was offering at that price.
The fix is sizing to the book, not to your account. A 3,000-share idea in a name showing 600 at the inside is a 600-share entry with a plan for the rest, or it’s a different name. Position size is a liquidity decision before it’s a risk decision, and small caps punish people who get that order backwards.
Telling them apart
You can’t separate these from a fill price alone. A fill three cents off your intent could be any of the three, or two of them at once.
What separates them is state captured at the right moments. Our fill engine stores the NBBO at three points for every execution: submission, evaluation after the latency draw, and fill.
- Submission to evaluation moved a lot, order was small: chasing.
- Long interval, drifting quote, resting order: late entry.
- Fill price worse than the evaluation quote, size above the inside: spillover.
Those three snapshots turn one aggregated regret into three separate, attributable numbers reported in basis points per fill. And you need per-fill attribution, because the aggregate hides the shape. Forty trades with two cents of chasing is a habit. One trade with sixty cents of spillover is a single sizing error. A monthly average of three cents describes both identically while suggesting opposite corrections.
The part that isn’t your fault
Some of what looks like slippage isn’t slippage.
Quotes cross the tape that you could never have traded against. Manual quotes, stale quotes, crossed markets, quotes carrying condition codes that mark them as non-firm. If your reference price includes those, your measured slippage includes a phantom component you can’t fix, because the price you’re measuring against was never available.
Any engine claiming to evaluate fills against real NBBO has to filter these first. Ours drops manual, stale, crossed, and condition-flagged quotes before the fill logic ever sees them, so a fill never evaluates against a price that wasn’t real. That’s an unglamorous piece of plumbing that determines whether every number downstream means anything.
What to do with this
Pull your last fifty fills. Sort them by slippage, worst first. Then, for each of the top ten, ask which of the three it was.
You’ll almost certainly find they’re not evenly spread. Most traders have one dominant leak and two rounding errors. Someone chasing every entry has a discipline problem at the decision layer. Someone bleeding spillover has a sizing problem they could fix this afternoon by reading the montage before clicking. Someone eating late-entry costs is being adversely selected on passive orders and needs cancel discipline.
Three different problems. One number was hiding all of them.
Reading your own fill log
All of that assumes you have per-fill attribution to read. Most platforms don’t give you one, which is the actual reason traders track slippage as a single number they feel bad about once a month.
Ours does. Three NBBO snapshots per fill, and chasing, late entry and spillover reported separately in basis points. It’s a free beta, and it runs the real tape from whatever day you pick. If the fills look generous to you, take the same session and beat them.
Related: why paper-trading fills lie covers why most practice environments produce zero slippage of any kind, and why your limit order didn’t fill goes deeper on the queue mechanics behind late entry.