1. What a markout measures
A markout looks at a trade and asks a simple question: some time after the fill, which way did the price go — and was that in the aggressor's favour? Formally, for a trade with sign d (+1 for a buyer-initiated trade, −1 for a seller-initiated one), the markout at horizon h is the signed change in the mid-price between execution and h later:
markout(h) = d × ( midt+h − midt )
If a buyer lifts the offer and the mid keeps climbing, the markout is positive — the buy "looked informed." If the mid falls back after the buy, the markout is negative — the trade faded, and whoever sold to that buyer came out ahead. Because the markout is signed by the trade direction, positive always means "the trade was right" regardless of side. Inferring that direction from raw prints, when the feed doesn't label it, is exactly what trade-sign classification (the tick rule and Lee-Ready) is for.
2. Two sides of the same number
The markout is the same measurement viewed from opposite ends of the trade:
- For the liquidity taker, a positive markout is realized edge: the aggressive order captured a move. Takers with consistently positive markouts are, by definition, informed.
- For the liquidity provider, that same positive markout is adverse selection — the maker was on the wrong side of an informed trade. Flip the sign and the provider's markout is the loss they took by quoting.
This is why market makers obsess over markouts. A maker earns the spread on every fill, but pays it back — and more — when the fills are toxic. Average markout across many trades tells a desk whether its quotes are being adversely selected, and by how much, in the same price units as the spread it collects.
3. The markout curve
A single horizon hides the dynamics. Computing the average markout at a range of horizons — say 1s, 10s, 60s, 5m — traces a markout curve, and its shape is diagnostic:
| Curve shape | Reading |
|---|---|
| Rises, then flattens high | Persistent information — the flow is toxic; permanent impact dominates. |
| Rises, then reverts toward 0 | Temporary impact — the taker paid to cross; the maker earns it back. |
| Flat near zero | Uninformed, benign flow — ideal counterparties for a maker. |
| Negative | The maker's quotes are, if anything, selecting against the taker. |
The gap between a short-horizon and a long-horizon markout is essentially the split between temporary and permanent price impact — the same decomposition that execution-cost models are built on, measured directly from realized fills rather than assumed.
4. Markouts, VPIN and order flow
Markouts are the realized, backward-looking measure of toxicity; VPIN is the forward-looking one, estimating the probability that the flow you're about to face is informed. They are complementary: VPIN warns you before you quote, markouts grade you after you did. When average markouts spike, VPIN was usually already elevated — and both tend to lead the wider market-microstructure signals of stress.
The link runs through order flow. Persistent one-sided order flow imbalance is exactly the environment in which markouts turn against the passive side. Watching signed flow, VPIN and markouts together gives a maker a live read on how safe it is to keep quoting.
5. Reference implementation
Markouts are a few lines of code. Our open-source orderflow-metrics library ships them for both TypeScript and Python — pass a fill's side, the mid at execution, and the mid at the horizon:
import { markout, averageMarkout } from "orderflow-metrics";
// A single fill: a buy at a mid of 100, price at 100.5 one minute later
markout("buy", 100, 100.5); // +0.5 — the buy was informed
// A book of fills at one horizon -> average adverse selection
const fills = [
{ side: "buy", midAtTrade: 100.0, midAfter: 100.4 },
{ side: "sell", midAtTrade: 100.0, midAfter: 99.7 },
{ side: "buy", midAtTrade: 100.2, midAfter: 100.1 }, // faded
];
averageMarkout(fills); // mean signed drift after the trade
Run averageMarkout over the same fills at several horizons and you have the markout curve; bucket by counterparty, symbol, or venue and you have a toxicity ranking. The same primitives exist in the Python distribution as markout and average_markout.
6. Practical notes
Mid, not trade price. Mark against the mid at execution, not the fill price — otherwise the spread you crossed leaks into the markout and masks the information signal. (Comparing against the fill price is a different, useful measure: effective vs realized spread.)
Choose horizons deliberately. Very short horizons capture microstructure noise and queue dynamics; very long ones drown the signal in unrelated drift. A spread of horizons — sub-second to minutes — is more informative than any single number.
Sample size matters. Individual markouts are dominated by noise; the signal lives in the average over many fills. Slice by cohort (venue, size bucket, time of day) only when each bucket has enough trades to be meaningful.
7. Conclusion
The markout turns a vague worry — "am I getting picked off?" — into a measured, comparable number, in the same units as the spread. Read as a curve and paired with VPIN and order-flow signals, it tells a desk which flow to welcome, which to widen against, and when to step away entirely. It is one of the cheapest, highest-value diagnostics a trading operation can run. Browse the rest of the toolkit in our quantitative research library or the open-source metrics that implement it.