Quant Memo
Foundational

Bid-Ask Bounce

Trades alternate between hitting the bid and the ask even when nothing has really changed, which makes tick-by-tick prices jump around far more than the underlying value does.

Prerequisites: Order Book Mechanics

Picture a stock quoted 100.00 bid / 100.02 ask, fair value truly sitting at 100.01 the whole time, unmoving. A buy order arrives and trades at 100.02 (the ask). A moment later a sell order arrives and trades at 100.00 (the bid). Then another buyer trades at 100.02 again. The printed price sequence reads 100.02, 100.00, 100.02 — a 2-cent zigzag on every single trade — even though fair value never budged from 100.01. That zigzag is bid-ask bounce: it's a mechanical artifact of trades alternating sides of the spread, not a signal about where the stock is heading.

The effect inflates measured short-horizon volatility and induces artificial negative autocorrelation in tick returns: a trade at the ask (price up) is mechanically likely to be followed by a trade at the bid (price down), because there's nowhere else for the very next print to alternate to. Roll's classic model formalizes this: if trades bounce independently between bid and ask with probability one-half each, the covariance between consecutive price changes is exactly

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

where ss is the bid-ask spread. In words: consecutive tick-to-tick price changes are negatively correlated purely from bounce, and the size of that negative correlation grows with the square of the spread — a wider spread produces more mechanical zigzag.

Worked example. A stock with a spread of $0.04 (so s=0.04s = 0.04). Roll's formula gives Cov(Δpt,Δpt+1)=0.042/4=0.0004\text{Cov}(\Delta p_t, \Delta p_{t+1}) = -0.04^2/4 = -0.0004. Roll's estimator inverts this to back out the implied effective spread from observed trade-price covariance alone, without ever seeing the actual quotes: s=2Cov(Δpt,Δpt+1)s = 2\sqrt{-\text{Cov}(\Delta p_t, \Delta p_{t+1})}. Plugging the same covariance back in: s=20.0004=2×0.02=0.04s = 2\sqrt{0.0004} = 2 \times 0.02 = 0.04 — recovering the $0.04 spread purely from the pattern of trade prices bouncing around.

ask bid fair value
Trade prices zigzag between the bid and ask even though fair value never moves — the zigzag is mechanical, not informational.

What this means in practice

Any strategy or metric built directly on tick-by-tick trade prices — realized volatility, tick-level autocorrelation, naive momentum signals — needs to account for bounce or it will mistake spread noise for real price movement. The standard fixes are to work from the midpoint of bid and ask rather than trade price, to sample at a lower frequency where bounce washes out, or to use the microprice, which weights by queue size instead of just alternating with whichever side traded last.

Consecutive tick prices bounce between bid and ask even with a perfectly flat fair value; this creates spurious negative autocorrelation in trade prices with covariance s2/4-s^2/4, a pure artifact of the spread, not a signal.

Don't mistake bid-ask bounce for genuine short-term mean reversion. A strategy that "buys the dip" on tick data may just be systematically buying at the bid right after a print at the ask — which reverts by construction, and evaporates the instant you account for actually paying the spread to trade.

See Trade Signing And The Lee-Ready Rule for how trades get labeled as buys or sells despite this noise, and The Microprice for the standard fix of working with a size-weighted fair value instead of raw trade prints.

Related concepts

Practice in interviews

Further reading

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