Adverse Selection Explained: Why Your Best Fills Are Your Worst Trades
Adverse selection is the reason passive trading is harder than it looks. When you post a resting limit order, you do not choose who trades against you — they choose you. And the counterparties most eager to take your quote are precisely the ones who know something you don't. The result is brutal and counterintuitive: the trades you get filled on are biased toward the ones you wish you hadn't taken. Understanding, measuring, and defending against adverse selection is the difference between a profitable market maker and a slow donation machine. This guide explains it from the ground up.
The core idea: the winner's curse of liquidity
Adverse selection comes from asymmetric information. In any trade there are two broad types of counterparty:
- Uninformed (liquidity) traders — they trade for reasons unrelated to short-term
price (rebalancing, hedging, cashing out). Trading with them is profitable for a liquidity provider.
- Informed traders — they trade because they expect the price to move soon.
Trading with them means you buy right before a drop, or sell right before a rally.
When you quote a two-sided market, you fill both types — but not symmetrically. Informed traders selectively hit the side that is about to be wrong. So your fills are skewed toward toxic flow. This is the trading version of the lemons problem (Akerlof): when the other side knows more, the average thing they sell you is worse than the average thing on offer.
A concrete way to feel it: if your passive buy orders fill instantly and then the price keeps falling, you weren't lucky to get filled — you were picked off. Good fills feel slow; bad fills feel fast.
Why it shows up everywhere
Adverse selection isn't only a market-maker problem. It taxes anyone who supplies liquidity or trades against a more-informed crowd:
- Limit orders. Every resting order is a free option you've written to the rest
of the market. Informed traders exercise it against you.
- Market making and grid bots. Both earn the spread by quoting passively — and
both bleed when flow turns toxic. See market making and grid trading.
- Execution algos. A naive TWAP/VWAP
that always posts passively gets selected against in trending markets.
- AMMs / DeFi liquidity provision. Liquidity providers are the ultimate passive
quoters; "impermanent loss" is largely adverse selection by arbitrageurs.
The bid-ask spread, decomposed
The classic insight (Glosten-Milgrom, 1985) is that the bid-ask spread exists partly to compensate for adverse selection. A market maker can't tell informed from uninformed flow in advance, so they widen the spread enough that profits from uninformed traders cover losses to informed ones.
Microstructure models decompose the quoted half-spread into three parts:
| Component | What it pays for |
|---|---|
| Order-processing cost | Fees, infrastructure, the operational cost of quoting |
| Inventory cost | Compensation for holding unwanted, risky inventory |
| Adverse-selection cost | Expected loss to better-informed counterparties |
The adverse-selection component is the one that moves: it widens when informed trading is likely (around news, data releases, high volatility) and narrows in quiet, liquidity-driven tape. This is why spreads blow out exactly when you most want to trade.
Order-flow toxicity and VPIN
Modern microstructure reframes adverse selection as order-flow toxicity — how informed (and therefore dangerous) the current flow is to liquidity providers. The PIN (Probability of Informed Trading) and its high-frequency cousin VPIN (Volume-Synchronized PIN) try to estimate it from order-flow imbalance: when buys and sells become persistently lopsided, flow is likely informed and toxic.
This connects directly to order flow imbalance signals: the same imbalance that predicts short-term direction is what makes your passive quotes dangerous. A maker watching toxicity will widen or pull quotes as imbalance spikes — the toxic-flow spike in VPIN preceded the 2010 Flash Crash, a textbook case of makers fleeing as adverse selection exploded.
Measuring it: the markout
You don't need a PhD model to quantify how badly you're being selected against. The practical tool is the markout (a.k.a. post-trade price drift): track where the mid price goes in the seconds/minutes after each of your fills.
- Buy at the bid, mid drifts up afterward → good fill (uninformed flow).
- Buy at the bid, mid drifts down afterward → adverse selection (you got picked).
Averaged over many fills, the markout curve tells you the realized cost of toxicity, separate from the spread you captured.
import numpy as np
import pandas as pd
def markout(fills, mid, horizons=(1, 5, 30, 60)):
"""fills: DataFrame [ts, side ('buy'/'sell'), price]
mid: Series of mid price indexed by ts (seconds)
Returns mean signed markout (in price units) per horizon.
Positive = favorable; negative = adverse selection."""
out = {}
for h in horizons:
pnl = []
for _, f in fills.iterrows():
future = mid.asof(f.ts + pd.Timedelta(seconds=h))
sign = 1 if f.side == "buy" else -1
# value of the position move after the fill
pnl.append(sign * (future - f.price))
out[h] = float(np.mean(pnl))
return out
# A markout that starts ~0 and goes increasingly negative with horizon
# is the signature of being adversely selected.
If your captured spread is +2 bps but your 60-second markout is −3 bps, you are losing 1 bp per round trip despite "earning the spread." That gap is adverse selection, and it's invisible if you only look at fill prices. It's a close relative of the realized-cost analysis in transaction costs & slippage and TCA.
How to defend against it
You can't eliminate adverse selection, but you can manage it:
- Widen spreads when flow is toxic. Use realized volatility and order-flow
imbalance as a toxicity gauge; quote wider (or step back) when it spikes.
- Skew, don't just widen. If imbalance is strongly one-sided, shade your quotes
away from the dangerous side rather than quoting symmetrically.
- Shorten quote lifetime / cancel fast. A stale quote is a free option; the
faster you can reprice, the smaller the option you've written. This is part of why HFT makers invest so heavily in latency.
- Use queue position and small size to avoid being the obvious target, and avoid
posting size right before scheduled news.
- Add a "fade" filter. If recent fills show negative markouts, automatically
widen or pause — let the data tell you flow has turned toxic.
- Trade where you're the informed one. Adverse selection is symmetric: if you
have an edge (a faster signal, an arb), you are the informed trader and adverse selection works for you.
Adverse selection in your backtest
This is one of the most common reasons a passive-fill backtest lies. Naive simulators assume your limit order fills whenever price touches it — and then ignore that, in reality, you'd have been filled preferentially on the bad side. To stay honest:
- Don't assume every touched limit order fills; model partial / queue-dependent fills.
- Add a markout-based penalty to passive fills, or assume you only get filled when
price trades through your level (a conservative proxy).
- Cross-check against the backtesting biases and
overfitting checklists — optimistic fill assumptions are a top source of phantom edge.
Common mistakes
- Counting captured spread as profit while ignoring post-fill drift. Always look
at markouts, not just fill prices.
- Quoting symmetric, constant-width spreads regardless of toxicity or imbalance.
- Assuming "I got filled" is good news. Fast fills in a trending market are the
warning sign, not the reward.
- Backtesting passive strategies with naive fills and being shocked when live
results are far worse.
- Ignoring news/event windows, where the informed-trader fraction — and thus
adverse selection — spikes.
Key takeaways
- Adverse selection = you trade against better-informed counterparties because
they choose to hit your passive orders.
- It is the deepest cost in market making and any liquidity-providing strategy, and a
major reason the bid-ask spread exists at all.
- Measure it with markouts (post-fill price drift); it's invisible if you only
look at execution price.
- Order-flow toxicity (PIN/VPIN, imbalance) is the real-time signal of when
adverse selection is high — widen, skew, or pull quotes.
- Build it into your backtests, or your passive-strategy results will be fiction.
- The flip side: when you are the informed trader, adverse selection is your edge —
