Bid-ask bounce
∞structuralThe artificial up-down sawtooth in trade prices caused by trades alternating between hitting the bid and lifting the ask, with no change in fair value. Roll (1984) backs out the effective spread from exactly this serial covariance.
See it move
What to notice. Fair value is flat, yet trade prices sawtooth up and down purely because trades alternate between hitting the bid and lifting the ask. Roll (1984) turns that spurious negative autocorrelation into an estimate of the spread itself.
What is bid-ask bounce?
Bid-ask bounce is the tendency of consecutive trades to print at the bid, then the ask, then the bid (bouncing across the spread) because buyers lift the ask and sellers hit the bid. The mid (true value) may be perfectly still, yet the transaction price oscillates by up to the full spread, manufacturing apparent price changes that are pure microstructure noise. Imagine fair value pinned at 50.005 all minute. A buyer arrives and pays the ask, 50.01; a seller arrives and hits the bid, 50.00; another buyer, 50.01. The trade tape reads 50.01, 50.00, 50.01, a one-tick "oscillation" that reflects who initiated, not any change in value.
This is the canonical example of microstructure noise: the observed transaction price is the efficient (fair) price plus a noise term equal to the signed half-spread: plus when the buyer crossed, minus when the seller did. Every other tick-data trap is a cousin of this idea. Open the explorer above with "show efficient price" on and the zero-drift preset: the latent line is flat, the prints bounce around it, and all of the measured jiggle is bounce, none of it value.
Why does the bounce inflate measured volatility?
Realised volatility is computed by summing squared returns. The bounce adds a noise term to every price, so every return picks up twice the noise: one print's noise minus the previous print's. Differencing two noisy prices doubles the noise's footprint in the return; square and sum many such returns and the noise variance does not cancel, it accumulates, adding a positive bias that grows with the number of intervals, that is, with how finely you sample. Sample every trade and you measure mostly noise; sample daily and the noise is negligible relative to true variance.
Write the observed log-price as : efficient price plus i.i.d. noise with variance . The realised variance over intervals then has expectation roughly , so as the noise term dominates and realised variance diverges rather than converging to . That is the "volatility signature plot" exploding at high frequency. The practical rule: never compute short-horizon volatility from raw trade prints. Either sample coarsely enough that is small, use the mid instead of the trade price (which kills the bounce), or use a noise-robust estimator: two-scales realised volatility (Zhang–Mykland–Aït-Sahalia 2005) or realised kernels (Barndorff-Nielsen et al. 2008). Watch the "measured σ vs true σ" panel above climb as you drag the sampling-frequency slider faster.
What is the Roll (1984) model?
Roll (1984) turns the bounce from a nuisance into a measurement. A buy (print at the ask) tends to be followed by a return down, since the next print is equally likely at the bid, and vice versa, so successive returns are negatively correlated purely from the bounce, and the strength of that negative correlation encodes the width of the spread. Under Roll's assumptions (an efficient price that is a random walk, and i.i.d. buy/sell trade signs independent of it) the bounce induces a first-order autocovariance in transaction-price returns exactly equal to , where is the effective spread. Invert it and you recover the spread from trade prices alone, with no quote data needed, which is invaluable on historical or low-quality tapes where you only have prints.
It is the ancestor of an entire family of effective-spread estimators (Corwin–Schultz high-low, 2012; Abdi–Ranaldo, 2017) that relax Roll's strong assumptions. The autocovariance panel in the explorer above shows with the live estimate next to the true .
▸ Show the derivation optional
Write the price change as the efficient innovation plus the change in the signed half-spread, with mean zero, variance , serially uncorrelated; i.i.d. with so , ; and .
Form the first-order autocovariance. The terms drop out (efficient innovations are serially uncorrelated and independent of the signs) leaving only the sign term:
Expand the expectation using for and : only the term survives, giving .
Therefore , and inverting gives . The estimator is only real when ; positive sample autocovariances (from drift, autocorrelated order flow, or thin sampling) make Roll's estimate undefined, a known failure mode this page flags below.
Where does the Roll model break, and what replaces it?
Roll assumes i.i.d. trade signs and a pure random-walk efficient price; real markets honour neither. Trade signs are strongly positively autocorrelated (order splitting, herding), a stylised fact in its own right, and that positive autocorrelation works against the negative bounce-induced autocovariance, so the measured is biased toward zero or positive and Roll under-estimates the spread or returns no estimate at all. Adverse selection muddies it further: when informed flow moves the efficient price with the trade direction, part of what looks like "spread" is permanent impact, not bounce: the Glosten–Milgrom / Stoll decomposition splits the spread into order-processing, inventory and adverse-selection components, only some of which Roll captures.
The replacements keep Roll's core insight (the spread hides in the serial dependence of prices) while relaxing his assumptions: Hasbrouck's Bayesian Gibbs-sampler version, the Corwin–Schultz (2012) high-low estimator, and the Abdi–Ranaldo (2017) close-high-low estimator. Roll is the foundational idea, not the production estimator: know it because everything after it is "Roll, but robust to X". This is the spread the bounce encodes, a real trading implicit cost, and the quantity the spread vs adverse selection decomposition pulls apart. Crank the trade-sign autocorrelation control in the explorer above and watch Roll's estimate degrade.
Worked example
A synthetic Roll-model tape, as of 2026. Reproduce it in the explorer above. Set the efficient price flat at 50.005 (true σ over the window ≈ 0, for clarity), an effective spread (two ticks of 0.01), i.i.d. fair-coin trade signs, and generate 10,000 prints. With mid 50.005 and , the bid is 49.995 and the ask 50.015, so every print lands on one of those two: the price "moves" 0.02 on roughly half the steps. Compute per-trade returns and annualise and the measured σ is large and entirely spurious: the true efficient σ was zero, so all of it is bounce.
Now run Roll. The sample first-order return autocovariance comes out , and inverting recovers the true two-tick spread from prices alone.
Then break it: turn on a small efficient-price drift and positive sign autocorrelation. shrinks toward zero (and can go positive) so Roll's estimate drops below 0.02 or becomes undefined, demonstrating exactly the failure mode the replacements were built for. These figures are illustrative and synthetic; the explorer lets you set , true σ and the sign-autocorrelation and watch both the bias and the Roll estimate respond. Real effective spreads vary by instrument, venue and time of day (as of 2026). The bounce is the first of four statistical traps in tick data; the others (fat tails, irregular time and trade-sign inference) each break a naive assumption the same way. The over-stated volatility this trap produces is exactly what fakes mean-reversion signals in statistical arbitrage and corrupts the volatility input to market making.