Quant Memo
Advanced

The Roll Spread Model

A clever trick that recovers the bid-ask spread from nothing but the sequence of traded prices — no quotes needed. Because trades bounce between bid and ask, consecutive price changes are negatively correlated, and the size of that correlation reveals the spread.

Prerequisites: Autocorrelation and Serial Correlation, Covariance Matrix Estimation

Suppose all you have is a list of prices a stock traded at — no bid, no ask, just the tape of executions. Can you figure out how wide the bid-ask spread was? Richard Roll showed in 1984 that you can, using one elegant observation: because trades randomly hit the bid or lift the offer, the traded price keeps bouncing between the two, and that bounce leaves a fingerprint in the numbers.

Picture a stock whose true value sits still at $50.00 with a spread of 4 cents, so the bid is $49.98 and the ask is $50.02. A buyer's trade prints at $50.02; the next trade, if a seller, prints at $49.98; then maybe a buyer again at $50.02. The value never moved, but the printed price zig-zags up and down. This is the bid-ask bounce, and it makes each price change tend to reverse the last one.

ask 50.02 bid 49.98 value 50.00 successive trades →
The bid-ask bounce: with the true value flat, trades print at the ask (green, a buy) or the bid (clay, a sell). Each move up tends to be followed by a move down and vice versa — a negative serial correlation whose magnitude encodes the spread.

From bounce to spread

Roll modeled trades as equally likely to be buys or sells, independent of each other, around a fixed value. Under those assumptions the change in price from one trade to the next has a negative first-order autocovariance:

Cov(Δpt,Δpt1)=s24,\operatorname{Cov}(\Delta p_t,\, \Delta p_{t-1}) = -\frac{s^2}{4},

where Δpt\Delta p_t is the change in traded price from trade t1t-1 to trade tt, and ss is the effective bid-ask spread (in the same units as price). The minus sign is the whole story: it says an up-tick is typically followed by a down-tick. Turning the equation around to solve for the spread gives Roll's estimator:

s=2Cov(Δpt,Δpt1).s = 2\sqrt{-\operatorname{Cov}(\Delta p_t,\, \Delta p_{t-1})} .

In words: take consecutive price changes, compute how much a move tends to reverse (the negative covariance), flip its sign, square-root it, and double it. Out pops the spread — from prices alone.

Roll's spread is s=2Cov(Δpt,Δpt1)s = 2\sqrt{-\operatorname{Cov}(\Delta p_t, \Delta p_{t-1})}. The bid-ask bounce makes consecutive price changes negatively correlated, and the size of that negative correlation is exactly a quarter of the spread squared.

Worked example

You collect nine consecutive trade prices (in dollars): 50.02, 49.98, 50.02, 49.98, 49.98, 50.02, 49.98, 50.02, 49.98. The eight price changes Δp\Delta p are:

0.04,  +0.04,  0.04,  0,  +0.04,  0.04,  +0.04,  0.04.-0.04,\; +0.04,\; -0.04,\; 0,\; +0.04,\; -0.04,\; +0.04,\; -0.04 .

To get the first-order autocovariance, pair each change with the previous one and average the products. The seven pairs (Δpt1,Δpt)(\Delta p_{t-1}, \Delta p_t) give products:

(0.04)(+0.04),(+0.04)(0.04),(0.04)(0),(0)(+0.04),(+0.04)(0.04),(0.04)(+0.04),(+0.04)(0.04)(-0.04)(+0.04),\, (+0.04)(-0.04),\, (-0.04)(0),\, (0)(+0.04),\, (+0.04)(-0.04),\, (-0.04)(+0.04),\, (+0.04)(-0.04)

which are 0.0016,0.0016,0,0,0.0016,0.0016,0.0016-0.0016,\, -0.0016,\, 0,\, 0,\, -0.0016,\, -0.0016,\, -0.0016. Their average is

Cov0.00807=0.00114.\operatorname{Cov} \approx \frac{-0.0080}{7} = -0.00114 .

Plug into Roll's formula:

s=20.00114=2×0.0338=0.068.s = 2\sqrt{0.00114} = 2 \times 0.0338 = 0.068 .

So the implied spread is about 6.8 cents — in the right neighborhood of the true 4-cent spread, and it would converge closer with a longer sample. The point is not the exact number from nine trades but that a pure price series handed us a spread estimate at all.

Roll's model assumes the true value doesn't move and order flow is a coin flip. In reality, informed trading and genuine news make the covariance turn positive on trending names — and then the formula asks for the square root of a negative number and simply fails. When that happens, don't force it; a positive covariance is telling you information (not just the bounce) is driving prices, which is precisely what The Glosten-Milgrom Model and Adverse Selection models handle.

Think of Roll as the spread cousin of Amihud Illiquidity: both extract a liquidity cost from cheap, low-frequency data. Roll gives you the bid-ask cost (the round-trip spread) while Amihud gives you the impact cost (how far the price moves per dollar). Together they sketch a stock's total trading cost without a single quote.

Where it sits

Roll launched the whole literature on inferring microstructure costs from transaction data, later refined by models that split the spread into its parts (order-processing, inventory, and adverse-selection components — see Bid-Ask Spread Decomposition). It remains a first-pass estimator when quote data is missing or unreliable, and its core insight — that the mechanical bounce between bid and ask hides inside the autocorrelation of prices — is one of the most quoted results in all of market microstructure.

Related concepts

Practice in interviews

Further reading

  • Roll (1984), A Simple Implicit Measure of the Effective Bid-Ask Spread
  • Hasbrouck, Empirical Market Microstructure
ShareTwitterLinkedIn