Skip to content

Abdi–Ranaldo spread estimator

Estimate a proportional effective spread from daily log highs, lows and closes, with explicit adjacent-session indexing, negative-estimate correction and data-availability timing.

The Abdi–Ranaldo spread estimator infers a proportional effective bid–ask spread from daily high, low and closing transaction prices. It is useful when a historical research dataset contains prices but no quotes: the close's position relative to two neighbouring daily midranges supplies a spread signal. It estimates a trading-cost proxy, rather than observing the bid–ask spread available for an order at a particular time.
Abdi and Ranaldo call the method CHL, for close, high and low. Their original paper, §1, gives the model and two ways to handle negative finite-sample estimates. Choosing between those versions is part of defining the statistic.

Two daily midranges around one close

For consecutive trading sessions tt, let HtH_t, LtL_t and CtC_t be the positive high, low and close on a common price-adjustment basis. Use natural logarithms:

ht=ln⁡Ht,lt=ln⁡Lt,ct=ln⁡Ct,ηt=ht+lt2.h_t=\ln H_t,\qquad l_t=\ln L_t,\qquad c_t=\ln C_t, \qquad \eta_t=\frac{h_t+l_t}{2}.
The midrange ηt\eta_t is the average of log prices: equivalently, ηt=ln⁡HtLt\eta_t=\ln\sqrt{H_tL_t}. It is neither ln⁡((Ht+Lt)/2)\ln((H_t+L_t)/2) nor a midquote assembled from bid and ask quotes.

Construct an adjacent-session product

xt=(ct−ηt)(ct−ηt+1).x_t=(c_t-\eta_t)(c_t-\eta_{t+1}).
Both factors use the same close ctc_t. The second factor does not use ct+1c_{t+1}. With complete data for sessions 1,…,N+11,\ldots,N+1, there are NN such products, indexed t=1,…,Nt=1,\ldots,N. The final session supplies a midrange; its close is unused. For a calendar-month estimate, explicitly assign products by their close date tt and retain the following session's high and low, even when it falls in the next month.
The monthly-corrected construction pools those products, then truncates the estimated squared spread before taking the square root:
s^month=max⁡{4N∑t=1Nxt, 0}.\widehat{s}_{\mathrm{month}} =\sqrt{\max\left\{\frac{4}{N}\sum_{t=1}^{N}x_t,\,0\right\}}.

The divisor is the number of valid products NN. This is an uncentred sample moment, not a demeaned sample covariance with an N−1N-1 divisor. If observations are missing, define the valid adjacent pairs and count those pairs; silently connecting across omitted sessions changes the construction.

The output is a full spread in decimal log-price units, approximately a proportional spread for small values. Multiplying by 10410^4 gives an approximate basis-point quotation. It is not a dollar spread, a half-spread, or an annualised volatility; there is no square-root-of-time annualisation.

Three fictional sessions give two products

Suppose each session has Ht=100e0.005H_t=100e^{0.005} and Lt=100e−0.005L_t=100e^{-0.005}. The closes are 100e0.001100e^{0.001}, 100e−0.001100e^{-0.001} and 100e0.001100e^{0.001}.

SessionHighLowClosect−ηtc_t-\eta_t
1100.50125299.501248100.1000500.001
2100.50125299.50124899.900050−0.001
3100.50125299.501248100.1000500.001

All three midranges equal ln⁡100\ln100. Therefore x1=(0.001)2=10−6x_1=(0.001)^2=10^{-6} and x2=(−0.001)2=10−6x_2=(-0.001)^2=10^{-6}. Using the unrounded inputs,

s^month=410−6+10−62=0.002≈20 bps.\widehat{s}_{\mathrm{month}} =\sqrt{4\frac{10^{-6}+10^{-6}}{2}} =0.002\approx20\text{ bps}.

This tiny example illustrates the arithmetic of the monthly-corrected formula over a two-product window. It is not an adequate monthly research sample, and the constructed prices do not identify an actual quoted spread of 20 bps.

Fictional daily log-price offsets from log 100 have highs plus 50 bps, lows minus 50 bps and closes plus 10, minus 10 and plus 10 bps. All midranges are zero; two products of 0.000001 imply a full log-spread estimate of 0.002, approximately 20 bps.
Fictional daily log-price offsets from log 100 have highs plus 50 bps, lows minus 50 bps and closes plus 10, minus 10 and plus 10 bps. All midranges are zero; two products of 0.000001 imply a full log-spread estimate of 0.002, approximately 20 bps.
Original fictional example. The bars show each session's high–low range, dots show closes and squares show log midranges; no intraday ordering of the high and low is assumed.

Negative estimates: the order of operations matters

A product can be negative when the close lies between the two midranges. That can make a finite-sample squared-spread estimate negative, despite the model's nonnegative population target. Truncating it to zero avoids a non-real square root; it does not establish costless trading.

The paper's two-day-corrected version instead truncates and roots each product, then averages:
s^two day=1N∑t=1Nmax⁡{4xt,0}.\widehat{s}_{\mathrm{two\ day}} =\frac{1}{N}\sum_{t=1}^{N}\sqrt{\max\{4x_t,0\}}.
The two versions agree in the main example because the products are identical and positive. They generally differ. For separate hypothetical product inputs x1=4×10−6x_1=4\times10^{-6} and x2=−10−6x_2=-10^{-6}, monthly correction gives 6×10−6≈0.00244949\sqrt{6\times10^{-6}}\approx0.00244949, or 24.4949 bps, while two-day correction gives (0.004+0)/2=0.002(0.004+0)/2=0.002, or 20 bps. Dropping negative observations altogether is a third procedure with a different denominator. Abdi–Ranaldo, §1.2, equations (10)–(11), distinguish these choices; they use the two-day-corrected version in their later empirical analysis.

Why the product can contain spread information

In the paper's baseline model, the closing log transaction price is efficient log price plus a signed half-spread. Efficient price follows geometric Brownian motion, with trade direction independent of efficient price. Initially, the high is treated as buyer initiated and the low as seller initiated, so their spread contributions cancel in the midrange. The derivation removes efficient-price variation from the close's distance to the average neighbouring midranges, yielding

s2=4E[(ct−ηt)(ct−ηt+1)].s^2=4\mathbb{E}[(c_t-\eta_t)(c_t-\eta_{t+1})].

This is the paper's model-based moment relation, not an algebraic identity for arbitrary transaction-price dynamics. Its baseline constant-spread and volatility assumptions, discrete observation of extrema and departures from the efficient-price model matter. The authors analyse several relaxations and test performance against an effective-spread benchmark; that does not guarantee exact recovery in another market.

This also distinguishes CHL from nearby estimators. The Roll measure uses serial covariance of transaction-price changes. The Corwin–Schultz estimator uses one- and two-day high–low ratios; its construction is described in the original Corwin–Schultz abstract. A daily high–low dataset can therefore feed different estimators with different assumptions.

Timing and data discipline

The paper's Appendix B shows cancellation of nontrading-period variance under its model, avoiding an ad hoc overnight adjustment. That result does not make arbitrary overnight jumps, stale prints or bad price adjustments harmless. Keep session definitions consistent and investigate missing trades, zero ranges and corporate actions before interpreting an estimate.

The next session is required. A product attributed to close tt cannot be known at that close, because ηt+1\eta_{t+1} needs the next session's completed high and low. A backtest that trades at close tt using that product has look-ahead bias. Date an estimate by its actual availability, and do not treat overlapping adjacent-session products as automatically independent observations.
For the distinction between a measured execution concession and an inferred historical cost proxy, the Spread Measurement lesson develops quoted, effective and realised spreads and derives the Roll benchmark. It has a public preview; the full lesson requires membership.

Sources

Last updated
  • market microstructure
  • spread estimation
  • transaction costs
  • daily prices
  • liquidity
← Back to the glossaryBack to top ↑