What Roll's estimator recovers
In September 1984, Richard Roll published A Simple Implicit Measure of the Effective Bid-Ask Spread in an Efficient Market in the Journal of Finance. His practical problem was familiar: researchers had long daily price histories but little trade-and-quote data.
Roll showed that bid-ask bounce can leave a negative first-order covariance in observed price changes. Under his assumptions, the full effective spread is
Using price changes gives a spread in currency per share. Using arithmetic returns gives an approximate proportional spread. Those are different outputs, and calling both simply "the spread" invites a factor-of-price error.
The estimator is a low-frequency proxy, not a replacement for observed quotes. It measures the round-trip price concession implied by serial covariance under a stylised model. For other daily-data choices, compare the Amihud illiquidity measure; for the information mechanism behind spreads, see the Glosten-Milgrom model.
The covariance derivation
Let the unobserved efficient value follow a random walk:
where innovations are serially uncorrelated. The observed transaction price is
where marks a bid-side or ask-side trade and is the half-spread. Assume is independent through time, equally likely to take either sign and independent of value innovations.
The observed price change is
Its lag-one covariance is
because the value-innovation terms have zero relevant covariance. Expanding the remaining expression gives
All cross-covariances vanish under independent trade signs and , so
Inverting produces Roll's formula.
The intuition is sometimes stated incorrectly. Independent signs do not make the next trade more likely to occur on the opposite side. The negative covariance comes from the shared term: it enters with a minus sign and with a plus sign. Even with independent signs, that algebra creates bounce.
Fundamental news can dominate the variance of returns without changing this covariance if value innovations are serially uncorrelated and independent of trade signs. That is why Roll works with covariance, not autocorrelation: autocorrelation divides by a variance full of news.
If the spread varies through the sample, the interpretation changes subtly. Under Roll's Appendix A conditions,
The inversion then recovers , a root-mean-square spread, rather than the arithmetic mean . Volatile spread regimes receive extra weight. Comparing this estimate with an average quoted spread is therefore not perfectly like-for-like even when every other assumption holds.
The word "effective" also has a specific meaning. A full observed effective spread is commonly measured as twice the absolute distance between transaction price and the prevailing midpoint. Roll infers an analogous round-trip cost from closing-price dynamics. It does not observe whether the close executed at the displayed bid, ask or inside the quotes.
Units, example and code
Suppose the estimated lag-one covariance of daily price changes is dollars squared. The implied dollar spread is
If the stock trades near 50 dollars, that is roughly , or 20 basis points. Directly applying the formula to returns would estimate the proportional spread instead. For example,
implies
The return version is approximate because the price denominator itself contains bid-ask effects. Roll showed that the omitted higher-order term is tiny for ordinary percentage spreads, but it is still better to state the approximation.
A safe implementation returns missing when sample covariance is non-negative. Taking an absolute value manufactures a positive spread from evidence that contradicts the model.
import numpy as np import pandas as pd def roll_spread(changes: pd.Series) -> float: """Full spread in the same units as the supplied changes.""" x = changes.dropna().to_numpy(dtype=float) if x.size < 3: return np.nan gamma_1 = np.cov(x[1:], x[:-1], ddof=1)[0, 1] return np.nan if gamma_1 >= 0 else 2.0 * np.sqrt(-gamma_1) def rolling_roll_spread(changes: pd.Series, window: int = 60) -> pd.Series: return changes.rolling(window).apply( lambda x: roll_spread(pd.Series(x)), raw=True )
Pass price differences to obtain currency units or decimal returns to obtain a proportional estimate. Do not pass price levels. Also report the covariance, valid-observation count and fraction of windows with non-negative covariance; a spread series that silently drops half its windows is not healthy.
Window design is part of the estimator. Short windows adapt quickly but make a noisy covariance pass through a square root, introducing finite-sample bias through Jensen's inequality. Long windows reduce sampling noise but average across tick-size, volatility and liquidity regimes. Sixty trading days is a common diagnostic horizon, not a result from Roll's theorem.
Closing prices create a further sampling choice. Use the last eligible trade, an official close or a vendor's adjusted close consistently. Adjusted closes are useful for return continuity around splits and distributions, but the adjustment method must not smooth away actual transaction-price bounce. For a panel, require the same calendar and missing-day policy across securities before comparing estimates.
A basic reporting template should include the input frequency, calendar span, observations, lag-one covariance, spread unit and non-negative-covariance rule. If the output is in returns, report both decimal and basis-point versions. If the output is in price changes, divide by a documented reference price before comparing securities. Ten cents is a small spread on a 500-dollar stock and a large one on a two-dollar stock.
Annual estimation, as in Roll's empirical work, is useful for asset-pricing panels because it avoids overlapping windows. Rolling estimates are better for monitoring but produce highly dependent observations. A chart with a daily point from a 60-day window contains far less independent information than its point count suggests.
Where Roll breaks
Positive sample covariance is the obvious failure. The square root is then not real, which means the observed moments do not support the model on that window. Common code truncates the estimate to zero, but zero means frictionless trading while positive covariance may reflect momentum, stale prices, infrequent trading or sampling error. Missing plus a diagnostic is usually more honest.
There is also selection from conditioning on negative estimates. If researchers discard positive-covariance stocks and average only the real-valued Roll spreads, the reported cross-section is selected towards large negative sample covariances. Recording coverage and running sensitivity checks with a latent-variable method such as Hasbrouck's Gibbs estimator is better than presenting the surviving mean as representative.
Serially correlated trade signs are another problem. Parent-order splitting creates runs of buys or sells. Once , the neat identity no longer holds. Correlation between order flow and value innovations also mixes adverse-selection quote revision into the bounce component.
Daily closes are particularly awkward because the final trade is not a random draw from all trades. Closing auctions, benchmark orders and end-of-day inventory management can change both trade-sign persistence and the relation between the close and efficient value. Weekly sampling does not automatically cure this; Roll's own daily-weekly discrepancy is evidence that aggregation introduces different misspecification.
Time aggregation should not matter in Roll's ideal efficient-market setup, yet the paper found that it did. Using NYSE and AMEX stocks from 1963 to 1982, the average spread estimated from daily returns was 0.298%, while the weekly-return estimate averaged 1.74%. Roll treated that sixfold gap as evidence against perfect informational efficiency or short-run stationarity, not as a calibration success.
Later estimators attack different weaknesses. Shane Corwin and Paul Schultz's 2012 high-low estimator uses two-day high-low ranges to separate volatility and spread effects. Joel Hasbrouck's 2009 Gibbs estimator treats trade direction as latent and, in its validation sample, achieved a 0.965 correlation with transaction-level effective-cost estimates. Neither makes daily data as informative as quotes; each imposes a different model.
Corwin-Schultz is not unconditionally "better". Daily highs and lows can be contaminated by overnight jumps, price discreteness and infrequent trading, while Roll can be calculated from a longer range of historical close series. The right comparison is out-of-sample agreement with transaction-level costs for the market and era being studied, plus stability under reasonable window choices.
Where quote data do exist, validation should precede use. Compare the annual or monthly Roll estimate with average realised effective spread over the same dates, not with a single closing quote. Stratify by price, size and trading frequency; an acceptable portfolio-level rank correlation can hide severe bias in the illiquid tail where the estimate is most likely to be used.
For modern liquid markets, use quoted and realised effective spreads when reliable trade-and-quote data exist. Roll remains useful for long historical panels, data-poor markets and sensitivity checks. It should sit beside turnover, ILLIQ and direct market microstructure measures, not outrank them by default.
Roll's estimator is valuable partly because it fails visibly. A non-negative covariance is a message about the assumptions, not an invitation to hide the sign.
Frequently Asked Questions
What is Roll's spread estimator?
It infers the full effective bid-ask spread from negative lag-one covariance in transaction-price changes. The estimate is when .
Should I use prices or returns?
Use price changes for a spread in currency per share. Use decimal returns for an approximate proportional spread, then multiply by 10,000 to report basis points.
Why is the factor two present?
The transaction price sits one half-spread, , away from efficient value. Covariance identifies , so recovering the full spread requires .
What should I do with positive covariance?
Report the estimate as unavailable and investigate the window. Setting it to zero or using the absolute covariance changes the estimator and can conceal model failure.
Is Roll's estimate a quoted spread?
No. It is an implied effective spread under the model. A quoted spread is the displayed ask minus bid; an observed effective spread compares the trade price with the prevailing midpoint.
Which paper should I cite?
Cite Richard Roll (1984), A Simple Implicit Measure of the Effective Bid-Ask Spread in an Efficient Market, Journal of Finance 39(4), 1127 to 1139.
Skip the £25k programme - try the alternative
Master's programmes are slow and expensive. Quantt is a self-paced alternative. Start free with a real lesson and interview practice, then unlock 50+ courses and your personalised plan.
Free to start · No credit card required