Skip to content
Finance Lessons

High-Frequency Market Making

Adverse Selection & Glosten–Milgrom

Why a spread exists even with zero inventory and zero cost: the Glosten–Milgrom model, Bayesian price discovery, toxicity measures, and maker defenses.

19 min Updated Jun 18, 2026

Inventory risk is a worry. Order-processing cost is a nuisance. But the market maker’s deepest enemy is none of those — it’s the counterparty who simply knows more than you do. Every time someone hits your bid or lifts your offer, you have to ask the uncomfortable question: did they trade because they need liquidity, or because they know which way the price is about to move? In 1985, Glosten and Milgrom proved something startling: even if you had zero inventory risk and zero costs, you would still have to quote a spread — purely to survive the traders who know more. This lesson builds that model from scratch, with the Bayes arithmetic worked out to the penny.

Before you read — take a guess

Pretest. Imagine a frictionless world: no inventory limits, no exchange fees, no processing cost, infinite capital. Would a competitive market maker still quote a bid below the ask?

The two kinds of trader

Analogy. You’re selling a used car at a fixed price to whoever walks up. Some buyers are just regular people who happen to need a car today — they don’t know more than you about this specific vehicle. But occasionally a mechanic walks up who can hear from the engine that the transmission is fine and worth more than your sticker price. The mechanic only buys when your price is too low. If you can’t tell the mechanic from the regular buyer, you must raise your price a little for everyone to cover the times you get picked off by the expert. That premium is adverse selection.

Definition. In market microstructure we split order flow into two populations:

  • Informed traders know the asset’s true value VV before it’s public. They buy only when VV is above the quoted price and sell only when it’s below. They are always on the right side — the toxic flow.
  • Uninformed traders — also called noise traders or liquidity traders — trade for reasons unrelated to value: rebalancing, cash needs, hedging, index flows. They buy or sell roughly 50/50, independent of VV. This is the benign flow the maker wants.

The maker cannot see which type each order came from. It only sees the order. The entire game is inferring the type from the trade.

Match each trader type to its defining behavior.

Pick a term, then click its definition.

Why a market order is information

Analogy. A poker player who suddenly shoves all-in is telling you something, even without showing cards. The action itself is a signal. A market order is the same: the direction of the trade is news, because the people most eager to trade in a given direction are disproportionately the ones who know it’s the right direction.

The core insight. A buy order is more likely to have come from an informed trader (who buys only when VV is high) than a sell order is. So:

P(V=VHbuy)>P(V=VH)>P(V=VHsell)P(V = V_H \mid \text{buy}) > P(V = V_H) > P(V = V_H \mid \text{sell})

A buy raises your belief that the value is high; a sell lowers it. The rational maker therefore must sell higher than its prior mid (the ask reflects “given that you’re buying, value is probably high”) and buy lower than its prior mid (the bid reflects “given that you’re selling, value is probably low”). The gap between those two conditional expectations is the spread — and it exists with no inventory and no cost.

Think first

Before any model: why should the ask be ABOVE the unconditional mid E[V], rather than equal to it?

Hint: The ask is the price at which you sell. Who is on the other side of your sale? Condition on the fact that they chose to buy.

The Glosten–Milgrom model setup

Definition. The model is the cleanest possible world for isolating adverse selection:

  • True value is binary: V{VH,VL}V \in \{V_H, V_L\} with VH>VLV_H > V_L.
  • A prior P(V=VH)=θP(V = V_H) = \theta (often θ=12\theta = \tfrac{1}{2}).
  • A fraction α\alpha of arriving traders are informed (they know VV); the remaining 1α1 - \alpha are noise traders who buy or sell with probability 12\tfrac12 each.
  • Trades are unit size, one at a time. The maker is competitive and risk-neutral, so it earns zero expected profit on each trade (Bertrand competition drives any positive margin to zero).

The zero-profit condition pins the quotes exactly:

ask=E[Vbuy],bid=E[Vsell]\text{ask} = E[V \mid \text{buy}], \qquad \text{bid} = E[V \mid \text{sell}]

The maker sells at the value conditional on a buy arriving and buys at the value conditional on a sell arriving. No fudge factor, no cost markup — those conditional expectations are the whole price.

Order probabilities. An informed trader buys iff V=VHV = V_H and sells iff V=VLV = V_L. A noise trader is 50/50. So:

P(buyVH)=α1+(1α)12=12+α2P(\text{buy} \mid V_H) = \alpha\cdot 1 + (1-\alpha)\cdot\tfrac12 = \tfrac12 + \tfrac{\alpha}{2} P(buyVL)=α0+(1α)12=12α2P(\text{buy} \mid V_L) = \alpha\cdot 0 + (1-\alpha)\cdot\tfrac12 = \tfrac12 - \tfrac{\alpha}{2}

A buy is more likely when the value is high — by exactly α\alpha. That α\alpha gap is the entire engine of the spread.

In the Glosten–Milgrom setup, what does the competitive (zero-profit) condition force the ask to equal?

Worked example: computing the spread to the penny

Let’s nail down every number. Take:

VH=110,VL=90,θ=P(VH)=0.5,α=0.4V_H = 110, \quad V_L = 90, \quad \theta = P(V_H) = 0.5, \quad \alpha = 0.4

So the prior mid is E[V]=0.5(110)+0.5(90)=100E[V] = 0.5(110) + 0.5(90) = 100, and the value is uncertain by VHVL=20V_H - V_L = 20.

Step 1 — order probabilities.

P(buyVH)=12+0.42=0.7,P(buyVL)=120.42=0.3P(\text{buy} \mid V_H) = \tfrac12 + \tfrac{0.4}{2} = 0.7, \qquad P(\text{buy} \mid V_L) = \tfrac12 - \tfrac{0.4}{2} = 0.3

Step 2 — unconditional probability of a buy (law of total probability):

P(buy)=θP(buyVH)+(1θ)P(buyVL)=0.5(0.7)+0.5(0.3)=0.5P(\text{buy}) = \theta\,P(\text{buy}\mid V_H) + (1-\theta)\,P(\text{buy}\mid V_L) = 0.5(0.7) + 0.5(0.3) = 0.5

Step 3 — posterior after a buy (Bayes):

P(VHbuy)=P(buyVH)θP(buy)=0.7×0.50.5=0.350.5=0.7P(V_H \mid \text{buy}) = \frac{P(\text{buy}\mid V_H)\,\theta}{P(\text{buy})} = \frac{0.7 \times 0.5}{0.5} = \frac{0.35}{0.5} = 0.7

Step 4 — the ask =E[Vbuy)= E[V \mid \text{buy}):

ask=0.7(110)+0.3(90)=77+27=104\text{ask} = 0.7(110) + 0.3(90) = 77 + 27 = 104

Step 5 — the bid. By symmetry, P(sell)=0.5P(\text{sell}) = 0.5 and P(VHsell)=0.3×0.50.5=0.3P(V_H \mid \text{sell}) = \frac{0.3 \times 0.5}{0.5} = 0.3, so:

bid=E[Vsell]=0.3(110)+0.7(90)=33+63=96\text{bid} = E[V \mid \text{sell}] = 0.3(110) + 0.7(90) = 33 + 63 = 96

Step 6 — the spread:

spread=askbid=10496=8\text{spread} = \text{ask} - \text{bid} = 104 - 96 = 8

The mid stays at 104+962=100\tfrac{104+96}{2} = 100, equal to the prior — symmetric prior, symmetric quotes. The full picture in one table:

QuantityFormulaValue
Prior mid E[V]E[V]θVH+(1θ)VL\theta V_H + (1-\theta)V_L100
P(buyVH)P(\text{buy}\mid V_H)12+α2\tfrac12 + \tfrac{\alpha}{2}0.70
P(buyVL)P(\text{buy}\mid V_L)12α2\tfrac12 - \tfrac{\alpha}{2}0.30
P(buy)P(\text{buy})θP(bH)+(1θ)P(bL)\theta\,P(b\mid H) + (1-\theta)P(b\mid L)0.50
P(VHbuy)P(V_H \mid \text{buy})Bayes0.70
Ask =E[Vbuy]=E[V\mid\text{buy}]P(VHb)VH+P(VLb)VLP(V_H\mid b)V_H + P(V_L\mid b)V_L104
Bid =E[Vsell]=E[V\mid\text{sell}]symmetric96
Spreadask − bid8

With a symmetric prior (θ=12\theta = \tfrac12) this collapses to a beautiful shortcut: spread=α(VHVL)=0.4×20=8\text{spread} = \alpha\,(V_H - V_L) = 0.4 \times 20 = 8. The spread is the informed fraction times the value uncertainty. Pure adverse selection, no cost anywhere.

This Bayes update is exactly the natural-frequency picture — drag the sliders to see the posterior P(VHbuy)P(V_H \mid \text{buy}) move (base rate = prior θ\theta, “sensitivity” = P(buyVH)=0.7P(\text{buy}\mid V_H)=0.7, “false-positive” = P(buyVL)=0.3P(\text{buy}\mid V_L)=0.3, and the headline posterior reads 70%):

A buy order updates the maker's beliefP(V_H | buy): 70.0%
High value & a buy arrivesLow value & a buy arrivesHigh value & a sell arrivesLow value & a sell arrives
High value & a buy arrives
350
Low value & a buy arrives
150
P(V_H | buy)
70.0%

possible worlds: 1,000; flagged: 500; truly real: 500.

Set the prior to 50%, P(buy | V_H) to 70% and P(buy | V_L) to 30% to match the worked example: of all worlds where a buy arrives, 70% have the high value — so the posterior P(V_H | buy) is 0.70, which prices the ask at 104. Crank the prior down and you'll see how a surprising buy moves belief even more.

Lock in the arithmetic of the worked example.

Pick the right option for each blank, then check.

With a symmetric prior, the Glosten–Milgrom spread equals the informed fraction times the value uncertainty: alpha × (V_H − V_L) = 0.4 × 20 = , so the ask sits at 104 and the bid at .

The spread as a pure adverse-selection premium

Analogy. Insurance has three pieces in a premium: the cost of running the office (processing), a buffer for unlucky claim clusters (inventory/risk), and the expected payout itself (adverse selection — the policyholders who buy because they expect to claim). Even a magically free, infinitely-capitalized insurer must still charge the third piece, or it loses money to the people who know they’ll claim. Glosten–Milgrom is that third piece in isolation.

The decomposition link. A real quoted spread bundles three classic components:

ComponentWhat it pays forPresent in Glosten–Milgrom?
Order-processingExchange fees, tech, clearing, the cost of doing businessNo — assumed zero
InventoryVariance/financing of carrying an unwanted positionNo — risk-neutral, no inventory limits
Adverse selectionExpected loss to better-informed counterpartiesYes — the entire spread

In the worked example, the maker has zero inventory cost and zero processing cost, yet quotes a spread of 8. That 8 is exactly the expected loss to the informed. Check the balance: against a noise trader the maker earns the half-spread (4) regardless of side; against an informed trader the maker loses the full move. The zero-profit condition guarantees those net to zero — the spread is calibrated precisely so the half-spread harvested from noise flow pays back the losses to informed flow.

Sort each statement by which spread component it describes.

Place each item in the right group.

Bayesian price discovery: how information enters prices

Analogy. A detective doesn’t learn the culprit from one clue; each clue nudges the suspect list until the picture sharpens. The maker is the detective and each trade is a clue. After every trade, the maker treats its posterior as the new prior and re-quotes. Buys ratchet the mid up; sells ratchet it down; over many trades the mid converges to the true VV. This is the mechanism by which private information becomes public price.

Definition. After observing a trade, the maker’s posterior becomes its new belief, and the next mid is the new E[V]E[V]. Continue from the example: a buy just arrived, so the posterior is now P(VH)=0.7P(V_H) = 0.7. The mid jumps from 100 to E[V]=0.7(110)+0.3(90)=104E[V] = 0.7(110)+0.3(90) = 104. The next quotes are recomputed around 104. If another buy arrives, the posterior climbs again toward 1 and the mid toward 110; a sell pulls it back. Walk the chain:

Trade #EventPosterior P(VH)P(V_H)New mid E[V]E[V]
start0.50100.0
1buy0.70104.0
2buy0.7×0.70.7×0.7+0.3×0.3=0.845\frac{0.7\times0.7}{0.7\times0.7+0.3\times0.3}=0.845106.9
3sell0.845×0.30.845×0.3+0.155×0.70.700\frac{0.845\times0.3}{0.845\times0.3+0.155\times0.7}\approx0.700104.0

(Each update reuses P(buyVH)=0.7P(\text{buy}\mid V_H)=0.7, P(buyVL)=0.3P(\text{buy}\mid V_L)=0.3, and the flipped values for a sell.) If VV is truly VHV_H, buys outnumber sells in the long run and the mid drifts to 110; the informed traders’ edge is competed away as the price catches up to what they knew. That convergence is the social function of markets — and the source of the maker’s pain.

The same tension drives the maker’s economics: it earns the half-spread from noise flow but bleeds to informed flow. Drag the sliders to feel the trade-off (informed share = α\alpha; widen the spread and the maker survives more toxicity):

In Glosten–Milgrom, what happens to the maker's quoted mid after it observes a buy order?

Comparative statics: what widens the spread

Definition. With a symmetric prior the spread is α(VHVL)\alpha(V_H - V_L), so two levers move it:

  • More informed flow (α\uparrow \alpha): a higher fraction of toxic counterparties means each fill is more dangerous, so the spread widens linearly in α\alpha.
  • More value uncertainty ((VHVL)\uparrow (V_H - V_L)): when the two possible values are further apart, being picked off costs more, so the spread widens proportionally.
Scenarioα\alphaVHVLV_H - V_LSpread =α(VHVL)=\alpha(V_H-V_L)
Base case0.40208.0
Twice as much informed flow0.802016.0
Twice the uncertainty (e.g. pre-earnings)0.404016.0
Calm, mostly retail flow0.10202.0
Pure noise (no informed traders)0.00200.0

The last row is the punchline: with α=0\alpha = 0, the spread is zero. No informed traders means no adverse selection means no reason for a frictionless maker to charge anything. Conversely, the spread blows out exactly when you’d expect markets to get thin — around news, earnings, and volatility spikes, where both α\alpha and (VHVL)(V_H - V_L) jump at once.

Select EVERY change that widens the Glosten–Milgrom spread (symmetric prior). Choose all that apply.

Measuring toxicity in practice

Analogy. A casino watches for card counters with cameras and pit bosses; a maker watches for informed flow with statistics. You can’t see intent, so you estimate it.

The practical measures (brief, expert-level):

  • PIN (Probability of Informed Trading). From Easley–O’Hara, PIN estimates the share of trades that are information-based by fitting a model to the daily imbalance of buys vs. sells. Roughly PIN=αμαμ+2ε\text{PIN} = \frac{\alpha\mu}{\alpha\mu + 2\varepsilon}, where α\alpha is the probability of an information event, μ\mu the informed arrival rate, and ε\varepsilon the uninformed rate. It’s a slow, daily-frequency gauge.
  • VPIN (Volume-Synchronized PIN). A high-frequency cousin that buckets trades by volume rather than clock time and measures order-flow imbalance within each bucket. VPIN spiked notably before the 2010 Flash Crash and is used as a real-time order-flow toxicity alarm.
  • Markouts. The most practical, model-free measure: mark each fill against the mid a few seconds/minutes later. If the price systematically moves against the maker post-fill, that drift is the realized adverse selection — the empirical face of the AA term from the P&L lesson. Markouts turn the abstract α\alpha into a dollar number per fill.

What does a consistently negative short-horizon markout (e.g. price 5 seconds after each fill moving against the maker) directly measure?

The maker’s defenses

Definition. Once you can estimate toxicity, you act on it. The defensive toolkit:

  1. Widen the spread with toxicity. Higher estimated α\alpha → quote a bigger spread, exactly as α(VHVL)\alpha(V_H - V_L) prescribes. The first and bluntest lever.
  2. Cut quoted size. If the flow is toxic, post less depth so each adverse fill costs fewer shares.
  3. Skew quotes away from toxic flow. If buys are arriving informed, lift the ask and pull the bid back so you’re less likely to be the one selling into a rising market.
  4. Pull quotes entirely. Around scheduled news or when VPIN spikes, the right spread can be effectively infinite — so step out of the market until the dust settles.
  5. Seek uninformed flow. The structural defense: route to or pay for retail order flow, which is overwhelmingly noise. This is the economic engine behind the maker-taker rebate model and payment for order flow (PFOF) — covered in the next lesson.

Match each defense to the problem it solves.

Pick a term, then click its definition.

Misconception: “the spread is just a transaction fee”

Warning:

The spread is not a fee — it's mostly an insurance premium

The intuitive story is that the spread is the maker’s commission for matching buyers and sellers — a service charge. Glosten–Milgrom shows that’s largely wrong. In the model there is no fee, no cost, no service charge — and the spread is still 8. The spread is overwhelmingly compensation for adverse selection: the maker’s expected loss to traders who know more. Treat it as a fee and you’ll mis-predict everything — you’d expect spreads to track processing costs (they don’t) instead of tracking information asymmetry and volatility (they do, tightly). Spreads gap out before earnings not because matching got expensive, but because the flow got dangerous.

Why is 'the spread is just a transaction fee for the matching service' a poor model of the bid-ask spread?

Recap

Big picture

Adverse selection & Glosten–Milgrom

  • Adverse Selection
    • Two traders
      • Informed: know V, always right side
      • Noise: trade ~50/50, value-blind
    • Core insight
      • A trade is information
      • Buy → value likely high; sell → low
    • Glosten–Milgrom
      • ask = E[V | buy], bid = E[V | sell]
      • Symmetric prior: spread = α(V_H − V_L)
      • Zero cost, zero inventory — spread still > 0
    • Price discovery
      • Posterior becomes new prior
      • Buys ratchet mid up, sells down → mid → V
    • Comparative statics
      • ↑α → wider spread
      • ↑(V_H − V_L) → wider spread
    • Toxicity & defense
      • Measure: PIN, VPIN, markouts
      • Defend: widen, cut size, skew, pull, seek retail
The spread can exist on adverse selection alone — and that's how prices discover value.
Question 1 of 80 correct

What is the single force that produces the spread in the Glosten–Milgrom model?

Check your answer to continue.

Key Takeaways

Success:

What to remember

  • The spread can exist on adverse selection alone. Glosten–Milgrom (1985): with zero inventory risk and zero costs, a competitive maker still quotes a positive spread — purely to survive informed traders.
  • A trade is information. A buy raises the posterior that value is high; a sell lowers it. So the competitive maker sets ask=E[Vbuy]\text{ask} = E[V\mid\text{buy}] and bid=E[Vsell]\text{bid} = E[V\mid\text{sell}].
  • Worked result. With VH=110V_H=110, VL=90V_L=90, θ=0.5\theta=0.5, α=0.4\alpha=0.4: ask = 104, bid = 96, spread = 8. The symmetric-prior shortcut: spread=α(VHVL)\text{spread} = \alpha(V_H - V_L).
  • Bayesian price discovery. Each trade updates the posterior, which becomes the next mid; buys ratchet it up, sells down, and over many trades the price converges to true VV. That’s how information enters prices.
  • Comparative statics. Spread widens with the informed fraction α\alpha and with value uncertainty VHVLV_H - V_L — which is why spreads gap out around news and volatility.
  • Measure & defend. Toxicity is gauged by PIN, VPIN, and (most practically) markouts; defenses are widening, cutting size, skewing, pulling quotes, and sourcing uninformed retail flow.
  • Myth busted. The spread is not a transaction fee — it’s mostly an adverse-selection (insurance) premium against better-informed counterparties.

Mark lesson as complete