A way to estimate a stock's bid-ask spread using only its daily high and low prices, when you don't have quote data.
Published by Quintessentia Network Inc. · Updated 17 July 2026 · Sources & disclosures
Formula
alpha = (sqrt(2*beta) - sqrt(beta)) / (3 - 2*sqrt(2)) - sqrt(gamma / (3 - 2*sqrt(2))); Spread = 2*(e^alpha - 1) / (1 + e^alpha), where beta = sum of the two consecutive single-day [ln(High/Low)]^2 terms and gamma = [ln(2-day High / 2-day Low)]^2; negative estimates are set to zero.
Corwin-Schultz backs the bid-ask spread out of daily high and low prices alone.
▶ Watch: Corwin-Schultz Spread Estimator explained in 24 seconds
What it is
The Corwin-Schultz spread estimator, from Shane Corwin and Paul Schultz (2012, Journal of Finance), estimates the bid-ask spread from daily high and low prices alone. The idea rests on a simple observation about who trades where: the day's high tends to be a buyer-initiated trade executed at the ask, and the day's low tends to be a seller-initiated trade executed at the bid. So the observed high-low range mixes two things together — the stock's true price volatility plus the spread. The key insight is that the volatility component grows with the length of the time interval while the spread component does not, so comparing a one-day high-low ratio against a two-day high-low ratio lets you isolate the spread. The published method also includes an overnight-gap adjustment, and negative estimates are conventionally set to zero.
Why it matters
The bid-ask spread is a real cost of trading that never shows up on a price chart — a wide spread means you pay more to get in and receive less to get out. Quote-level data is expensive and often unavailable for smaller or foreign-listed names, so an estimator built from freely available daily highs and lows makes spread comparable across a wide universe of stocks. That makes it useful for understanding which names are thin and hard to trade, and why a small-cap's realised results can diverge from its paper returns. A pitfall is that this is a model estimate, not an observed quote: it can be noisy for any single stock or short window, it can produce negative daily values that the published convention floors at zero (a step that biases the resulting average upward), and it assumes highs and lows are trade-driven — so on days dominated by news gaps, halts, or very few trades the estimate degrades. Treat it as a research signal about likely liquidity, not a measured transaction cost.
How it's calculated
The only inputs are daily high and low prices — no quotes, no volume. For each pair of consecutive trading days you form beta from the sum of the two single-day squared log high-low ratios, and gamma from the squared log high-low ratio measured across the combined two-day window (the highest high and the lowest low of the pair). Because the volatility component of the range grows with the length of the interval while the spread component does not, comparing the one-day and two-day quantities isolates the spread. An adjustment is applied for overnight gaps, where the previous close sits outside the following day's range. In the published method, individual negative estimates are conventionally set to zero. Quintarthai averages the daily estimates over a 60-day window and reports the result as a percentage of price.
How Quintarthai uses it
The Quintarthai stock screener carries the Corwin-Schultz estimated bid-ask spread % (60-day window) under its Liquidity filter category, so you can compare estimated trading friction across names alongside the other filters. It is shown as a research signal with its methodology and caveats, never as a recommendation — see /app/.
Cross-border note. The estimator uses only daily high and low prices, so it is exchange-agnostic and works the same on TSX and TSX-V names as on US listings — no US-specific calibration is involved. That is exactly why it is useful in Canada, where quote-level data is costly and thinly traded venture names often have no reliable published spread; the estimate is only as good as the underlying daily high/low feed, and very thin names with few trading days will produce noisier readings.
FAQ
Why not just use the actual quoted spread instead of estimating it?
Quote-level (intraday bid and ask) data is expensive and is not available for every listing, especially smaller Canadian venture names. Daily high and low prices are near-universally available, so the Corwin-Schultz approach lets you produce a comparable spread number across a whole screening universe at no extra data cost. If you do have reliable quotes for a specific stock, those are the direct measurement and this estimator is unnecessary.
Why does the estimator sometimes return a negative number?
It is a statistical estimator, not a direct measurement, so sampling noise can push an individual daily estimate below zero even though a real spread can never be negative. The published convention is to set those negative values to zero. Be aware this flooring introduces a small upward bias into the averaged estimate, which is one reason the number is best read as an approximate ranking of liquidity rather than a precise cost figure.
Check your understanding
What insight allows the Corwin-Schultz estimator to separate the bid-ask spread from volatility using only daily high and low prices?
The high-low range mixes volatility and the spread together. Because volatility accumulates over longer windows but the spread does not, comparing a one-day high-low ratio to a two-day one lets you isolate the spread — that asymmetry is the core of the method. The overnight-gap adjustment is a refinement, not the underlying insight.