The Roll Spread Estimator

Market Microstructure · Medium · Free problem

You observe only transaction prices $\{P_t\}$ at equally spaced times. Under the Roll model:

  • The efficient ("true") price $M_t$ follows a random walk: $M_t = M_{t-1} + u_t$, where $u_t$ are i.i.d. mean-zero innovations.
  • Each trade occurs at either the bid or the ask with equal probability, so the observed transaction price is $P_t = M_t + c \cdot Q_t$, where $Q_t \in \{-1, +1\}$ is an i.i.d. sign (each with probability $1/2$) and $c > 0$ is the half-spread.
  • The trade direction $Q_t$ is independent of the efficient price innovations $u_t$.

Let $\Delta P_t = P_t - P_{t-1}$ denote the price change.

  1. Show that $\text{Cov}(\Delta P_t, \Delta P_{t-1}) = -c^2$.
  2. Derive the Roll estimator $\hat{c} = \sqrt{-\widehat{\text{Cov}}(\Delta P_t, \Delta P_{t-1})}$, where the sample autocovariance replaces the population quantity.
  3. Explain why this estimator can fail in practice and what modifications are used.

Hints

  1. Write the observed price as true price plus a bid-ask bounce term: $P_t = M_t + cQ_t$. How does the bounce enter consecutive price changes?
  2. When you expand $\text{Cov}(\Delta P_t, \Delta P_{t-1})$, most cross-terms vanish by independence. The only shared random variable between $\Delta P_t$ and $\Delta P_{t-1}$ is $Q_{t-1}$.
  3. Compute $\text{Var}(Q_{t-1})$ for $Q_{t-1} \in \{-1, +1\}$ equiprobable, and note the sign: $Q_{t-1}$ enters with opposite signs in the two consecutive changes.

Worked Solution

How to Think About It: The Roll model captures a simple but powerful idea: even if the true price is a pure random walk (no predictability), observed transaction prices will exhibit negative serial correlation because of bid-ask bounce. Every time you trade, you are randomly hitting the bid or the ask, adding noise of $\pm c$ to the true price. Consecutive price changes tend to reverse because a buy at the ask is likely followed by a move back toward the bid (or vice versa). The magnitude of this reversal tells you the spread.

Quick Estimate: Suppose the half-spread is 5 cents and the efficient price has zero drift. The bid-ask bounce adds variance $c^2 = 0.0025$ to each price. The first-order autocovariance of returns should be about $-0.0025$. So if you compute $\widehat{\text{Cov}}(\Delta P_t, \Delta P_{t-1})$ from data and get $-0.0025$, you estimate $\hat{c} = \sqrt{0.0025} = 0.05$, giving a full spread of 10 cents.

Approach: Decompose the price change into efficient-price and bounce components, then compute the autocovariance.

Formal Solution:

Since $P_t = M_t + cQ_t$, the price change is:

$$\Delta P_t = P_t - P_{t-1} = (M_t - M_{t-1}) + c(Q_t - Q_{t-1}) = u_t + c(Q_t - Q_{t-1})$$

Step 1: Compute $\text{Cov}(\Delta P_t, \Delta P_{t-1})$.

Expand:

$$\text{Cov}(\Delta P_t, \Delta P_{t-1}) = \text{Cov}(u_t + c(Q_t - Q_{t-1}),\; u_{t-1} + c(Q_{t-1} - Q_{t-2}))$$

Since $u_t$ and $Q_t$ are all mutually independent across time (and independent of each other), the only cross-term that survives involves $Q_{t-1}$, which appears in both $\Delta P_t$ and $\Delta P_{t-1}$:

$$= \text{Cov}(-cQ_{t-1},\; cQ_{t-1}) = -c^2 \text{Var}(Q_{t-1})$$

Since $Q_{t-1} \in \{-1, +1\}$ with equal probability, $\text{Var}(Q_{t-1}) = E[Q_{t-1}^2] - (E[Q_{t-1}])^2 = 1 - 0 = 1$. Therefore:

$$\text{Cov}(\Delta P_t, \Delta P_{t-1}) = -c^2$$

Step 2: The Roll estimator.

Solving for $c$:

$$c = \sqrt{-\text{Cov}(\Delta P_t, \Delta P_{t-1})}$$

Replace the population autocovariance with its sample analog:

$$\hat{c} = \sqrt{-\widehat{\text{Cov}}(\Delta P_t, \Delta P_{t-1})}$$

The estimated full spread is $2\hat{c}$.

Step 3: Practical issues.

  • Positive autocovariance: In practice, the sample autocovariance of price changes is sometimes positive (e.g., due to momentum, stale quotes, or autocorrelated order flow). Then $\hat{c} = \sqrt{-\text{negative number}}$ is undefined. The common fix is to set $\hat{c} = 0$ when the autocovariance is positive, or to use modifications like the Corwin-Schultz (2012) high-low estimator.
  • Autocorrelated trade direction: The Roll model assumes $Q_t$ is i.i.d., but real order flow is persistent (buy orders cluster). This violates the model and biases the estimator.
  • Time-varying spreads: The model assumes constant $c$, but spreads widen during volatility and narrow during calm periods.

Answer: Under the Roll model, bid-ask bounce creates negative first-order autocovariance $\text{Cov}(\Delta P_t, \Delta P_{t-1}) = -c^2$, giving the estimator $\hat{c} = \sqrt{-\widehat{\text{Cov}}}$. The full spread estimate is $2\hat{c}$.

Intuition

The Roll estimator exploits a beautiful identification trick: even though you cannot observe the true price or the spread directly, the bid-ask bounce leaves a statistical fingerprint in the serial correlation of price changes. A trade at the ask followed by a trade at the bid creates a negative return, and vice versa -- this systematic reversal pattern is what makes the first-order autocovariance negative, with magnitude exactly equal to the squared half-spread.

In practice, this is one of the simplest tools in the market microstructure toolkit. It requires only transaction prices (no quotes needed), which makes it valuable for historical data where quote data is unavailable. The main pitfall is that real markets violate the i.i.d. trade-direction assumption -- informed traders create persistent order flow, which introduces positive serial correlation that partially offsets the bid-ask bounce effect, causing the Roll estimator to understate the true spread.

Open the full interactive solver →