Yang-Zhang vs Close-to-Close Volatility: Formulas, Worked Example and a 10-Year Study | FlashAlpha
realizedvolatility · 42 min read

Yang-Zhang vs Close-to-Close Volatility: Formulas, Worked Example and a 10-Year Study

Close-to-close volatility is the standard deviation of daily closing returns; Yang-Zhang adds the open, high and low to measure the overnight gap and the session separately. This reference compares five estimators (close-to-close, Parkinson, Garman-Klass, Rogers-Satchell, Yang-Zhang) with formulas, a worked NVDA example you can check by hand, a simulation with known volatility, and a 2017-2026 study of 20 US stocks and ETFs covering accuracy, forecasts and IV-RV signals. Free CSV, spreadsheet, notebook and research pack.

RealizedVolatility YangZhang Parkinson GarmanKlass RogersSatchell VolatilityEstimation Quant

This is a reference for the five daily-bar estimators: what each one measures, the formulas with their sources, a worked NVDA calculation you can check line by line, and two original studies. The first is a simulation where the true volatility is known. The second covers 20 US stocks and ETFs from 2017 to 2026 and asks how far the estimators disagree, which one tracks intraday data best, which forecasts best, and how often the choice flips an IV-RV signal. Every number on the page is in the free download pack.

7.2-8.2×Yang-Zhang efficiency at a 20-day window in theory (14× needs a 2-day window)
37%-43%Share of daily variance that happens overnight for SPY, QQQ, IWM, XLK, AAPL, NVDA, TSLA
3.4×Closer to a 5-minute benchmark than close-to-close (median, 11 symbols)
1 in 6Days where switching to Yang-Zhang flips the sign of IV minus RV
Free account

Compute it yourself

Reference Python code, a spreadsheet with live formulas, and the full research pack.

Free with a FlashAlpha account

Alpha plan

All five estimators, any symbol

One call returns close-to-close, Parkinson, Garman-Klass, Rogers-Satchell and Yang-Zhang over 10, 20 and 30 days, with the formulas on this page.

Alpha · /v1/volatility/realized

Alpha plan

Forecast it

EWMA, HAR, GARCH and HEAVY forecasts for the next day, week and month, next to 30-day implied vol.

Alpha · /v1/volatility/forecast

Key findings

  1. The "14 times more efficient" figure is a maximum for a 2-day window. Yang-Zhang's efficiency is 1/(f² + k(1 − f)²), where f is the overnight share of variance: at 20 days, 7.2 with no gaps and at most 8.2 (1 + 1/k). Our simulation follows the formula within 4% once the overnight share is 20% or more.
  2. Overnight moves are a large part of daily variance. 37% to 43% for large US stocks and equity ETFs, 55% for TLT, 61% for GLD and 69% for EEM. Estimators that ignore the gap miss about that share of the variance.
  3. Yang-Zhang tracks intraday data best. Against a 5-minute benchmark over the same 20 sessions, its mean error was 0.40 to 1.77 volatility points, against 1.35 to 5.81 for close-to-close. It was closer on all 11 symbols.
  4. Its advantage shrinks as the gap share grows. In simulation, Yang-Zhang is about 4.5 times as accurate as close-to-close when 40% of variance is overnight and 2.0 times at 70%.
  5. The estimators disagree most around gaps and earnings. The median Yang-Zhang vs close-to-close difference was 1.97 points over 20 days, 3.70 in windows with the largest gaps and 3.63 in windows with an earnings report.
  6. A better trailing estimate forecasts better, at short windows. Yang-Zhang's 10-day estimate beat close-to-close out of sample on all 20 symbols, and all 20 survive a Holm correction across symbols. At 20 days it was ahead on 19 of 20 but significant on only 5 after the correction; at 60 days, on none.
  7. The estimator choice changes IV-RV signals. Switching from close-to-close to Yang-Zhang flipped the sign of the 20-day IV-RV spread on 17.3% of days, and switching to Parkinson on 31.4%.

Data: 49,420 20-session windows on 20 symbols, Jan 2017 to Oct 2026. Method and limitations in the market study; code and results in the research pack.

Which realized volatility estimator should you use?

Use Yang-Zhang for US stocks and ETFs when you have clean daily open, high, low and close prices. Use close-to-close when you only have closes, when the highs and lows are unreliable, or when you need the number everyone else computes. The table matches the choice to the situation; the evidence for each row is further down the page.

Table 1. Choosing an estimator.

SituationUseWhy
US stocks and ETFs, clean daily barsYang-ZhangCounts the overnight gap, is unaffected by drift, and was closest to the 5-minute benchmark on every symbol we tested.
Only closing pricesClose-to-closeThe only option. Use 20 or more sessions; a 10-session reading moves a lot from noise alone.
Highs and lows you do not trustClose-to-closeOne 5% bad print a year cut Yang-Zhang's 20-day advantage from 7.9× to 2.3× in simulation. Closes are cleaner than extremes.
Markets with no overnight breakGarman-KlassWith no gap to miss, it was the most accurate of the five in our simulation. Rogers-Satchell is the drift-free alternative in theory, but lost more to one-minute sampling.
Comparing realized vol with implied volOne estimator, statedThe choice flipped the sign of IV minus RV on 17.3% of days (Yang-Zhang) to 31.4% (Parkinson).
Forecasting next month's volatilityA model, or Yang-Zhang as a baselineYang-Zhang over 10 to 20 sessions beat close-to-close as a forecast. In our earlier study, 30-day implied vol beat every historical model at a one-month horizon.
Figure 1. The five estimators at a glance
Prices each estimator reads (struck out = not used), what it handles, and how accurate it was relative to close-to-close in our simulation: 20-day windows, one-minute prices, without and with overnight gaps (Study 1). The grey tick marks 1×, the close-to-close level.
Yang-Zhang2000 [5]

Overnight variance + open-to-close variance + Rogers-Satchell.

CprevOHLC
  • Overnight gap: yes
  • Drift-free: yes
  • Uses the range: yes
Accuracy vs close-to-close
No overnight gaps5.5×
40% of variance overnight4.3×
Efficiency in theory: 1/k = 7.2 with no gaps, at most 8.2 at 20 days [5]
Close-to-close

Standard deviation of daily close-to-close log returns.

CprevOHLC
  • Overnight gap: yes
  • Drift-free: yes
  • Uses the range: no
Accuracy vs close-to-close
No overnight gaps1.0×
40% of variance overnight1.0×
Efficiency in theory: 1 (the baseline)
Parkinson1980 [1]

Squared high-low range of each session.

CprevOHLC
  • Overnight gap: no
  • Drift-free: no
  • Uses the range: yes
Accuracy vs close-to-close
No overnight gaps4.5×
40% of variance overnight0.5×
Efficiency in theory: 4.9 [4]
Garman-Klass1980 [2]

Range plus the open-to-close move, session only.

CprevOHLC
  • Overnight gap: no
  • Drift-free: no
  • Uses the range: yes
Accuracy vs close-to-close
No overnight gaps5.2×
40% of variance overnight0.5×
Efficiency in theory: 7.4 [4]
Rogers-Satchell1991 [3]

Range measured from the open and close, drift-free.

CprevOHLC
  • Overnight gap: no
  • Drift-free: yes
  • Uses the range: yes
Accuracy vs close-to-close
No overnight gaps4.4×
40% of variance overnight0.5×
Efficiency in theory: 6.0 with zero drift [4]

The widely shared table of "1, 5.2, 7.4, 8, 14" comes from a 2012 bank research note [7], not from the original papers. Parkinson's estimator is about 4.9 times as efficient as one squared return, Rogers-Satchell about 6.0 with zero drift, and Yang-Zhang's 14 is its maximum for a 2-day window [5][6].

What quantity are we estimating?

All five estimators target the same thing: the variance of the daily log return, measured from one close to the next. That day has two parts. The overnight part runs from yesterday's close to today's open; the session part runs from the open to the close.

One trading day, in log returns $$ r_i = \ln\frac{C_i}{C_{i-1}} = \underbrace{\ln\frac{O_i}{C_{i-1}}}_{o_i,\ \text{overnight}} + \underbrace{\ln\frac{C_i}{O_i}}_{c_i,\ \text{session}} $$

The estimators differ in which pieces of the bar they read. Close-to-close sees only \(r_i\). Parkinson sees only the session's high and low. Garman-Klass and Rogers-Satchell see the whole session but not the gap. Yang-Zhang sees both parts. Each estimator returns a daily variance; this page annualizes it as \(100\sqrt{252 \times \text{variance}}\) to get volatility in percent.

Figure 2. What each estimator reads from two daily bars
Close-to-close sees only r. Parkinson sees the high-low range. Garman-Klass and Rogers-Satchell see the session (u, d, c). Yang-Zhang adds the overnight gap o.
Two daily barsYesterday closes at C prev. Today gaps up to the open O, trades between the high H and low L, and closes at C. The overnight gap o, the session move c, and the distances from the open to the high and low, u and d, are what the estimators combine.YesterdayCprevTodayHLOCo = ln(O / Cprev)overnight gapu = ln(H / O)open to highc = ln(C / O)session moved = ln(L / O)open to lowr = o + cclose to close
The overnight gap (blue) happens outside the session. Only close-to-close and Yang-Zhang include it; close-to-close sees it only netted with the session move (orange).

Variance or volatility? The sample variance is unbiased, but its square root is not: a 20-session close-to-close volatility reads about 1.2% below the true value on average, and about 2.6% at 10 sessions (Study 1). Average variances, not volatilities, when you combine windows.

The shared assumptions. The theory behind every range estimator assumes the log price is a random walk with constant volatility inside the window, observed continuously, without bid-ask noise. Real prices are observed at discrete times, so the recorded high is below the true high and the recorded low above the true low, which pulls range estimators down [2][3][4]. Yang-Zhang also assumes the overnight and session returns are independent of each other.

The five estimators: formulas, assumptions and limits

Notation for a window of \(n\) bars: \(o_i\), \(c_i\) and \(r_i\) as above, \(u_i = \ln(H_i/O_i)\), \(d_i = \ln(L_i/O_i)\). A bar over a symbol is its mean over the window. These are the definitions the FlashAlpha API uses.

Close-to-close

Close-to-close variance $$ \sigma^2_{\text{CC}} = \frac{1}{n-1}\sum_{i=1}^{n}\left(r_i - \bar r\right)^2 $$

The sample variance of daily log returns. Removing the mean makes it unaffected by drift, and because \(r_i = o_i + c_i\) it includes the overnight move. Its weakness is noise: one number per day. A common variant skips the mean and divides by \(n\) (zero-mean, as in many risk systems). The two differ most when the window trends, because the zero-mean version counts the trend as variance.

Parkinson (1980)

Parkinson variance [1] $$ \sigma^2_{\text{P}} = \frac{1}{4n\ln 2}\sum_{i=1}^{n}\left(\ln\frac{H_i}{L_i}\right)^2 $$

The constant \(1/(4\ln 2)\) converts the expected squared range of a driftless random walk into its variance. Parkinson ignores the open and close, so it misses the overnight gap and is biased by drift: a steady trend widens the range without adding variance. Efficiency is about 4.9 [4].

Garman-Klass (1980)

Garman-Klass variance, session-only form [2] $$ \sigma^2_{\text{GK}} = \frac{1}{n}\sum_{i=1}^{n}\left[\tfrac12\left(\ln\frac{H_i}{L_i}\right)^2 - (2\ln 2 - 1)\,c_i^2\right] $$

This is the form most software implements. It contains no previous close, so it does not see the overnight gap. Garman and Klass also gave a version that adds the gap with weight \(a = 0.12\), where \(f\) is the fraction of the day the market is closed: \(\sigma^2 = a\,(\ln O_i - \ln C_{i-1})^2/f + (1-a)\,\sigma^2_{\text{GK}}/(1-f)\), efficiency about 8.4 [2]. The session-only form is about 7.4 times as efficient as the squared open-to-close return [4], and is biased by drift.

Rogers-Satchell (1991)

Rogers-Satchell variance [3] $$ \sigma^2_{\text{RS}} = \frac{1}{n}\sum_{i=1}^{n}\left[u_i(u_i - c_i) + d_i(d_i - c_i)\right] = \frac{1}{n}\sum_{i=1}^{n}\left[\ln\frac{H_i}{C_i}\ln\frac{H_i}{O_i} + \ln\frac{L_i}{C_i}\ln\frac{L_i}{O_i}\right] $$

Unbiased for any drift, which is what it was designed for. It still misses the overnight gap. Efficiency is about 6.0 with zero drift and above 2 for any drift [4]; the "8" in many tables is not supported by the theory. Rogers and Satchell also show that discrete observation biases the estimate down and give a correction [3].

Yang-Zhang (2000)

Yang-Zhang variance [5] $$ \sigma^2_{\text{YZ}} = \sigma^2_o + k\,\sigma^2_c + (1-k)\,\sigma^2_{\text{RS}}, \qquad k = \frac{0.34}{1.34 + \frac{n+1}{n-1}} $$

\(\sigma^2_o\) and \(\sigma^2_c\) are the sample variances of \(o_i\) and \(c_i\) (mean removed, divided by \(n-1\)); \(\sigma^2_{\text{RS}}\) is Rogers-Satchell. Yang and Zhang show the estimator is unbiased in the continuous limit, independent of drift and consistent with opening jumps, and that it has "the smallest variance among all estimators with similar properties" [5]. That is the class its optimality applies to. The 0.34 comes from \(\alpha - 1\) with \(\alpha = 1.34\), the value the authors suggest for small drift [5][8].

Under the paper's assumptions its efficiency relative to close-to-close depends on \(f\), the share of daily variance that happens overnight [5]:

Yang-Zhang efficiency [5] $$ \text{Eff}(f) = \frac{1}{f^2 + k\,(1-f)^2} $$

With no overnight variance it is \(1/k\): 12.8 at \(n = 2\) and 7.2 at \(n = 20\). Its maximum, \(1 + 1/k\), is reached when a share \(k/(1+k)\) of the variance is overnight (about 12% at \(n = 20\)): 13.8 at \(n = 2\) and 8.2 at \(n = 20\). The "14 times" figure is that maximum for a 2-day window [6]. As the overnight share grows, the overnight term carries more of the variance and is estimated from \(n\) gaps, like close-to-close, so the advantage falls toward 1: at 40% overnight and 20 days the formula gives 4.8. Study 1 checks it.

Worked example: NVDA, 10 sessions with an earnings gap

NVDA reported earnings after the close on November 19, 2025. The next morning it opened 4.9% higher, then fell 8.1% during the session. In six of the 10 sessions from November 13 to November 26, the stock moved against its overnight gap during the session, including after the two largest gaps. Every input is in Table 2 and in the CSV; the close on November 12 seeds the first overnight return.

Figure 3. NVDA daily bars, Nov 13 to Nov 26, 2025
Dashed blue: overnight gap from the previous close (grey tick) to the open. Hover a candle for its values.
NVDA daily candles, Nov 13 to Nov 26, 2025, with overnight gaps$170$180$190$2002025-11-13: O 191.05 H 191.44 L 183.85 C 186.86; gap -1.43%, session -2.22%132025-11-14: O 182.86 H 191.01 L 180.58 C 190.17; gap -2.16%, session +3.92%142025-11-17: O 185.97 H 189.00 L 184.32 C 186.60; gap -2.23%, session +0.34%172025-11-18: O 183.38 H 184.80 L 179.65 C 181.36; gap -1.74%, session -1.11%182025-11-19: O 184.79 H 187.86 L 182.83 C 186.52; gap +1.87%, session +0.93%192025-11-20: O 195.95 H 196.00 L 179.85 C 180.64; gap +4.93%, session -8.14%202025-11-21: O 181.24 H 184.56 L 172.93 C 178.88; gap +0.33%, session -1.31%212025-11-24: O 179.49 H 183.50 L 176.48 C 182.55; gap +0.34%, session +1.69%242025-11-25: O 174.91 H 178.16 L 169.55 C 177.82; gap -4.28%, session +1.65%252025-11-26: O 181.63 H 182.91 L 178.24 C 180.26; gap +2.12%, session -0.76%26earnings gap +4.9%, session -8.1%
Source: daily regular-session bars from Yahoo Finance, rounded to cents. The two largest gaps (+4.9% on Nov 20 and −4.3% on Nov 25) both reversed during the session.

Table 2. NVDA daily bars and the per-bar terms. o = ln(O/Cprev), c = ln(C/O), r = o + c, u = ln(H/O), d = ln(L/O), RS term = u(u − c) + d(d − c). Log returns in percent; the CSV download has full precision.

DateOpenHighLowClosePrev. closeo (%)c (%)r (%)u (%)d (%)RS term ×104ln(H/L)² ×104
2025-11-13191.05191.44183.85186.86193.80-1.429-2.218-3.647+0.204-3.8416.73216.365
2025-11-14182.86191.01180.58190.17186.86-2.164+3.920+1.756+4.360-1.2558.41431.530
2025-11-17185.97189.00184.32186.60190.17-2.233+0.338-1.895+1.616-0.8913.1616.287
2025-11-18183.38184.80179.65181.36186.60-1.741-1.108-2.848+0.771-2.0553.3967.988
2025-11-19184.79187.86182.83186.52181.36+1.874+0.932+2.805+1.648-1.0663.3107.366
2025-11-20195.95196.00179.85180.64186.52+4.932-8.135-3.203+0.026-8.5743.96673.945
2025-11-21181.24184.56172.93178.88180.64+0.332-1.311-0.979+1.815-4.69421.55242.364
2025-11-24179.49183.50176.48182.55178.88+0.340+1.690+2.031+2.210-1.6916.86615.216
2025-11-25174.91178.16169.55177.82182.55-4.275+1.650-2.625+1.841-3.11215.17424.536
2025-11-26181.63182.91178.24180.26177.82+2.120-0.757+1.363+0.702-1.8843.1486.689
Mean-0.224-0.500-0.7247.57223.229
  1. Means. \(\bar o\) = -0.2245%, \(\bar c\) = -0.4998%, \(\bar r\) = -0.7243%.
  2. Sample variances (divide by \(n - 1 = 9\)): \(s_o^2\) = 0.00072303, \(s_c^2\) = 0.00104499, \(s_r^2\) = 0.00060893. The last one is the close-to-close daily variance.
  3. Range terms. Mean RS term = 0.00075720; \(\sum \ln(H/L)^2\) = 0.02322874; mean Garman-Klass term = 0.00078848.
  4. Yang-Zhang weight for \(n = 10\): \(k = 0.34 / (1.34 + 11/9)\) = 0.132697. Then combine the three terms and annualize:
so²0.000723overnight variance
k · sc²0.000139k = 0.1327
(1 − k) · RS0.000657range term
daily variance0.001518Yang-Zhang
100 √(252 × var)61.86%annualized
Figure 4. Five estimators, same 10 NVDA sessions
Annualized volatility in percent. Dashed line: FlashAlpha's 5-minute benchmark for the same sessions.
5-minute benchmark 59.3%
Yang-Zhang61.86%
Close-to-close39.17%
Parkinson45.95%
Garman-Klass44.58%
Rogers-Satchell43.68%
0%10%20%30%40%50%60%70%80%90%
Yang-Zhang lands near the intraday benchmark; close-to-close nets each gap against its reversal and reads 22.7 points lower.
Table 3: the daily variances behind Figure 4

Table 3. NVDA, 10 sessions to Nov 26, 2025: daily variance and annualized volatility, 100 × √(252 × variance). Same bars for every estimator.

EstimatorDaily variance fromDaily varianceAnnualized volvs close-to-close
Close-to-closeSample variance of r0.0006089339.17%
ParkinsonΣ ln(H/L)² / (4 · 10 · ln 2)0.0008378045.95%+6.78 pts
Garman-Klassmean of 0.5 ln(H/L)² − (2 ln 2 − 1) c²0.0007884844.58%+5.40 pts
Rogers-Satchellmean RS term0.0007572043.68%+4.51 pts
Yang-Zhangso² + k sc² + (1 − k) RS, k = 0.13270.0015184261.86%+22.69 pts
5-minute benchmarkMean of squared 5-minute midpoint returns plus squared overnight return (FlashAlpha archive)0.0013972759.34%+20.17 pts

Yang-Zhang reads 22.7 points above close-to-close, and the 5-minute benchmark for the same sessions (59.3%) sits close to Yang-Zhang. Close-to-close sees only the net move on each reversal day: on November 20 it records −3.2% where the stock travelled 4.9% up and 8.1% down. The three session-only estimators see the session ranges but not the gaps. If your code reproduces Table 3 to two decimals from Table 2's bars, it matches this page and the FlashAlpha API's definitions.

Try it with your own bars

Four cases that show where each estimator breaks

Each card is one constructed week: five sessions after a prior close of 100, drawn as candles (dashed blue = overnight gap), with the annualized volatility each estimator reports. The spreadsheet recomputes them with live formulas.

Figure 5. Four ways to break an estimator
Wide ranges, flat closes

Every session opens at 100, trades from 97 to 103 and closes at 100.

Yang-Zhang63.2%
Close-to-close0.0%
Parkinson57.2%
Garman-Klass67.4%
Rogers-Satchell67.4%

Closing prices never move, so close-to-close reads zero. The range estimators see a volatile week.

Big gaps, quiet sessions

Alternating 2% overnight gaps; each session trades in a 0.4% range and closes where it opened.

Yang-Zhang35.0%
Close-to-close34.8%
Parkinson3.8%
Garman-Klass4.5%
Rogers-Satchell4.5%

The session-only estimators (Parkinson, Garman-Klass, Rogers-Satchell) see only the quiet sessions and miss almost all of the movement.

Gap, then intraday reversal

A 2% gap every morning, fully reversed by the close, alternating direction.

Yang-Zhang38.1%
Close-to-close0.0%
Parkinson21.0%
Garman-Klass14.8%
Rogers-Satchell10.5%

Closes never change, so close-to-close reads zero. Yang-Zhang counts both legs: the negative covariance between gap and session is what separates them.

The same week, clean

The bad-print week next to it, with the correct high. Same bar scale.

Yang-Zhang13.1%
Close-to-close13.4%
Parkinson11.7%
Garman-Klass12.2%
Rogers-Satchell11.8%
One bad high

A normal week, except one session's high is recorded 8% above its open (a bad print).

Yang-Zhang51.1%
Close-to-close13.4%
Parkinson35.7%
Garman-Klass41.5%
Rogers-Satchell54.0%

Close-to-close does not move. Every range estimator jumps, because one high enters a squared log range.

Why can Yang-Zhang be lower than close-to-close?

Both estimators include the overnight move, so readers often expect Yang-Zhang to agree with close-to-close on average and to differ only by noise. On the same bars, the close-to-close variance splits exactly into an overnight part, a session part and their covariance:

Exact identity, same bars, same denominators $$ s^2_{\text{CC}} = s^2_o + s^2_c + 2\,\text{Cov}(o,c) \quad\Longrightarrow\quad s^2_{\text{YZ}} - s^2_{\text{CC}} = (1-k)\left(s^2_{\text{RS}} - s^2_c\right) - 2\,\text{Cov}(o,c) $$

So the gap between them has two sources:

  • The range part, \((1-k)(s^2_{\text{RS}} - s^2_c)\). When sessions trade wide ranges but close near the open, Rogers-Satchell exceeds the open-to-close variance and Yang-Zhang moves up. Narrow ranges with directional closes move it down.
  • The covariance part, \(-2\,\text{Cov}(o,c)\). Gaps that reverse during the session (negative covariance) push Yang-Zhang above close-to-close, because close-to-close nets the two legs. Gaps that continue push it below.
Figure 6. From close-to-close to Yang-Zhang, NVDA window
Annualized variance, in volatility points squared. The two middle bars are the exact parts of the identity above.
Waterfall: close-to-close variance plus the range part plus the covariance part equals Yang-Zhang variance01,0002,0003,0004,000Close-to-close: 1,534.51,534.5Close-to-close= 39.17%²Range part: -629.0−629.0Range part(1 − k)(RS − sc²)Covariance part: +2,920.9+2,920.9Covariance part−2 Cov(o, c)Yang-Zhang: 3,826.43,826.4Yang-Zhang= 61.86%²

In the NVDA window, in annualized variance (volatility points squared): close-to-close 1,534.5, range part −629.0, covariance part +2,920.9, which sum to Yang-Zhang's 3,826.4 (= 61.86²). The whole gap comes from reversals; the range part pulls the other way. The practical point: Yang-Zhang minus close-to-close is not a measure of overnight risk. It measures how gaps and sessions co-move and how wide the sessions trade.

Across 20 symbols from 2017 to 2026, Yang-Zhang was below close-to-close in 33% to 53% of 20-session windows (average 45%). The median overnight-session correlation is close to zero for every symbol, so both parts are small on a typical day and large in specific windows.

Table 4: the split for all 20 symbols

Table 4. Yang-Zhang minus close-to-close, split into its two exact parts, 20-session windows from 2017 to 2026. Medians as a percent of the close-to-close variance. Positive = pushes Yang-Zhang above close-to-close.

SymbolRange part (1 − k)(RS − sc²)Covariance part −2 Cov(o, c)Windows with YZ below CCMedian corr(o, c)Overnight share of r²
SPY+4.4%+0.9%42%-0.0142%
QQQ-0.1%+3.6%50%-0.0438%
IWM+3.8%+3.5%39%-0.0439%
DIA+4.1%+1.4%44%-0.0243%
GLD+2.9%-4.4%49%+0.0557%
TLT-1.7%-3.3%53%+0.0455%
XLF+4.8%+3.1%39%-0.0348%
XLK-2.9%+2.8%52%-0.0341%
XLE+5.5%+1.8%39%-0.0242%
EEM+0.7%-0.3%50%+0.0069%
AAPL+5.2%+0.4%42%-0.0041%
MSFT+2.6%+2.5%43%-0.0339%
NVDA-0.2%+1.1%50%-0.0138%
AMZN+1.5%+2.6%43%-0.0346%
GOOGL+4.1%+2.4%41%-0.0345%
META+5.1%+0.8%41%-0.0152%
TSLA-4.4%+0.8%53%-0.0137%
JPM+7.6%+5.0%33%-0.0644%
XOM+4.8%+0.1%44%-0.0041%
NFLX+2.2%+0.6%44%-0.0140%

Study 1: simulation with known volatility

The papers' efficiency figures assume ideal conditions. To see what each estimator delivers when those conditions fail, we simulated prices with a known volatility and measured each estimator's error.

Simulation method
True volatility
20% a year (daily variance 0.04/252), constant.
A day
An overnight jump (normal, a set share of the daily variance), then a session of 390 one-minute steps (4,680 five-second steps in the ideal case). High and low are the extremes of the recorded path.
Scenarios
Ideal; one-minute prices; overnight gaps carrying 40% of variance; a strong trend (drift of half a daily standard deviation per day); one 5% bad print a year on a random session price. A second run varies the overnight share from 0% to 70%.
Size
240,000 simulated days per scenario (120,000 in the ideal case and the sweep), split into non-overlapping windows of 2, 5, 10, 20 and 60 bars. Fixed seeds.
Measures
Efficiency (ratio of estimate variances) and accuracy (ratio of mean squared errors, which also counts bias), both relative to close-to-close.

Table 5. Efficiency relative to close-to-close by window length, ideal conditions (no gaps, no drift, 4,680 price steps a day). Efficiency = variance of the close-to-close variance estimate divided by the variance of the other estimate. Yang-Zhang theory with no overnight variance is 1/k; 1 + 1/k is its maximum, reached when a share k/(1 + k) of the variance is overnight.

Window (bars)kYang-Zhang theory, no gaps (1/k)Yang-Zhang, simulatedTheory maximum (1 + 1/k)Garman-KlassRogers-SatchellParkinson
20.078312.813.413.815.312.410.0
50.11978.48.89.49.77.76.3
100.13277.57.98.58.56.85.6
200.13907.27.88.28.26.55.4
600.14327.07.38.07.76.15.1

With no gaps, the simulated Yang-Zhang efficiency lands 4% to 8% above \(1/k\): prices recorded at discrete times give slightly smaller ranges, which lowers the variance of the range terms along with their level (the accuracy measure in Figure 7 also counts that bias). With overnight gaps the formula tracks the simulation within 4% for overnight shares from 20% to 70% at 20 days; at 40% the 240,000-day scenario measured 4.75 against 4.76 predicted. Efficiency falls as the window grows because close-to-close spends one of its \(n\) observations on estimating the mean, which costs less as \(n\) grows.

Figure 7. Accuracy relative to close-to-close, 20-session windows
Mean squared error of close-to-close divided by each estimator's. Blue cells beat close-to-close, red cells do worse; darker = further from 1.
ScenarioYang-ZhangParkinsonGarman-KlassRogers-Satchell
Ideal prices (no gaps, no drift)7.5×5.3×7.8×6.3×
One-minute prices5.5×4.5×5.2×4.4×
Overnight gaps, 40% of variance4.3×0.5×0.5×0.5×
Strong trend5.2×4.0×6.2×4.2×
One 5% bad print a year2.2×3.4×3.1×1.7×
Worse than close-to-closeBetter
Without overnight gaps, Garman-Klass is the most accurate of the five, even in a strong trend, where its drift bias partly offsets the downward bias from one-minute sampling. One-minute prices bias the range estimators down by 6.5% (Parkinson) to 9.1% (Rogers-Satchell) in variance, and Yang-Zhang by 7.8%. With 40% of variance overnight, the session-only estimators read 44% low and fall below close-to-close (0.52×); Yang-Zhang keeps a 4.3× advantage. A strong trend shifts the variance bias by +9.0 percentage points for Parkinson and +3.0 for Garman-Klass, against -0.5 for Rogers-Satchell and -0.5 for Yang-Zhang (compared with one-minute prices and no trend).
Figure 8. How the overnight share changes each estimator's accuracy
20-session windows, one-minute prices. Vertical lines: measured overnight share of daily variance for five ETFs.
Accuracy relative to close-to-close against the overnight share of daily variance, 20-session window0×1×2×3×4×5×6×7×0%10%20%30%40%50%60%70%Overnight share of daily varianceSPYQQQTLTGLDEEMYang-Zhang, overnight share 0%: 5.59x close-to-closeYang-Zhang, overnight share 10%: 6.42x close-to-closeYang-Zhang, overnight share 20%: 6.17x close-to-closeYang-Zhang, overnight share 30%: 5.48x close-to-closeYang-Zhang, overnight share 40%: 4.49x close-to-closeYang-Zhang, overnight share 50%: 3.44x close-to-closeYang-Zhang, overnight share 60%: 2.55x close-to-closeYang-Zhang, overnight share 70%: 1.98x close-to-closeYang-ZhangParkinson, overnight share 0%: 4.59x close-to-closeParkinson, overnight share 10%: 2.64x close-to-closeParkinson, overnight share 20%: 1.39x close-to-closeParkinson, overnight share 30%: 0.80x close-to-closeParkinson, overnight share 40%: 0.54x close-to-closeParkinson, overnight share 50%: 0.36x close-to-closeParkinson, overnight share 60%: 0.27x close-to-closeParkinson, overnight share 70%: 0.20x close-to-closeParkinsonGarman-Klass, overnight share 0%: 5.28x close-to-closeGarman-Klass, overnight share 10%: 2.52x close-to-closeGarman-Klass, overnight share 20%: 1.29x close-to-closeGarman-Klass, overnight share 30%: 0.75x close-to-closeGarman-Klass, overnight share 40%: 0.51x close-to-closeGarman-Klass, overnight share 50%: 0.35x close-to-closeGarman-Klass, overnight share 60%: 0.26x close-to-closeGarman-Klass, overnight share 70%: 0.20x close-to-closeGarman-KlassRogers-Satchell, overnight share 0%: 4.49x close-to-closeRogers-Satchell, overnight share 10%: 2.35x close-to-closeRogers-Satchell, overnight share 20%: 1.25x close-to-closeRogers-Satchell, overnight share 30%: 0.74x close-to-closeRogers-Satchell, overnight share 40%: 0.51x close-to-closeRogers-Satchell, overnight share 50%: 0.35x close-to-closeRogers-Satchell, overnight share 60%: 0.26x close-to-closeRogers-Satchell, overnight share 70%: 0.20x close-to-closeRogers-Satchell
Yang-Zhang's advantage peaks with a small overnight share and falls to 2.0× at 70%. Parkinson, Garman-Klass and Rogers-Satchell drop below close-to-close once the overnight share passes about 25% (1.39× at 20%, 0.80× at 30%). For most US equities the measured share is about 40%.

Study 2: 20 US stocks and ETFs, 2017 to 2026

Market data method
Symbols
SPY, QQQ, IWM, DIA, GLD, TLT, XLF, XLK, XLE, EEM, AAPL, MSFT, NVDA, AMZN, GOOGL, META, TSLA, JPM, XOM, NFLX.
Bars
Daily regular-session open, high, low and close from Yahoo Finance (yfinance 1.2.0, auto_adjust=False): split-adjusted, not dividend-adjusted. Oct 3, 2016 to Oct 30, 2026; no invalid candles or zero-range days found.
Windows
Rolling 10, 20, 30 and 60 sessions ending on every trading day from Jan 3, 2017 to Oct 30, 2026. All five estimators use the same bars.
Benchmark
For SPY, QQQ, IWM, GLD, TLT, XLF, XLK, EEM, AAPL, NVDA and TSLA, from FlashAlpha's 1-minute quote archive: each day's squared 5-minute midpoint returns from 09:30 to 16:00 ET (13:00 on early closes; 78 returns on a full day, 42 on an early close), plus the squared overnight return from the previous close to the 09:30 midpoint, averaged over the window. Sessions with fewer than 30 five-minute returns are skipped; isolated bad quotes (a 10% jump that reverts) are dropped; returns across splits use the split-adjusted previous close. Days without a 09:30 quote, and split days, are excluded. The inputs are in the research pack.
Implied vol
Constant-maturity 30-calendar-day ATM implied vol from FlashAlpha's daily SVI fits (total variance interpolated between the expiries around 30 days). It is compared with the next 21 sessions, which approximates 30 calendar days; the match is not exact.
Conditions
Largest gaps: the window's biggest overnight move is in the symbol's top 10%. Earnings: the window contains the first session after a report. Trending: the 20-session move exceeds 2 standard deviations, measured on the previous 60 sessions. Stress: SPY's 20-session close-to-close vol above 25% (250 days).

How far apart are the estimates?

Table 6. Distance from close-to-close by lookback, 20 symbols, every trading day from Jan 3, 2017 to Oct 30, 2026. Median and 90th percentile of the absolute difference in volatility points, and the median ratio to close-to-close.

WindowWindowsYang-Zhang median |diff|Yang-Zhang 90th pctYang-Zhang ratioParkinson median |diff|Parkinson 90th pctParkinson ratioRogers-Satchell ratio
10 sessions49,4202.819.21.0293.9513.30.8220.817
20 sessions49,4201.976.61.0193.9812.80.8110.806
30 sessions49,4201.625.51.0164.1312.40.8060.800
60 sessions49,4201.244.21.0154.5012.30.7960.796

Yang-Zhang and close-to-close differ by a median 1.97 points over 20 sessions, and by 6.6 points or more in one window in ten. The gap shrinks with the window (2.81 at 10 sessions, 1.24 at 60) because both converge to the same quantity. The session-only estimators do not converge: Parkinson stays about 4.50 points below at 60 sessions, because missing the overnight move is a bias, not noise.

Figure 9. When do the estimates disagree most?
Median absolute difference from close-to-close, 20-session windows, in volatility points. Each line runs from the calm case (hollow) to the extreme case (filled).
Yang-ZhangParkinsonCalm windowsExtreme windows
Median distance from close-to-close, calm versus extreme windows0 pts2 pts4 pts6 pts8 pts10 pts12 pts14 ptsOvernight gapssmall → largest 10%Yang-Zhang, small: 1.58 ptsYang-Zhang, largest 10%: 3.70 pts3.7Parkinson, small: 2.48 ptsParkinson, largest 10%: 13.22 pts13.2Earnings (stocks)none → in windowYang-Zhang, none: 2.65 ptsYang-Zhang, in window: 3.63 pts3.6Parkinson, none: 3.73 ptsParkinson, in window: 7.05 pts7.0Trendflat → trendingYang-Zhang, flat: 1.90 ptsYang-Zhang, trending: 2.69 pts2.7Parkinson, flat: 3.85 ptsParkinson, trending: 7.22 pts7.2Marketnormal → stressYang-Zhang, normal: 1.88 ptsYang-Zhang, stress: 3.11 pts3.1Parkinson, normal: 3.61 ptsParkinson, stress: 9.74 pts9.7
Windows with the largest overnight gaps roughly double the Yang-Zhang difference (1.58 to 3.70 points) and multiply the Parkinson difference by five (2.5 to 13.2). Earnings windows and market stress widen both differences too. In stress, Yang-Zhang ran slightly below close-to-close (median ratio 0.964).

Which estimate tracks intraday data best?

Figure 10. Distance from the 5-minute benchmark, by symbol
Mean absolute error over the same 20 sessions, in volatility points. Further left is closer.
Yang-ZhangClose-to-closeParkinson
Mean absolute error against the 5-minute benchmark by symbol and estimator01234567891011SPYSPY Parkinson: 2.96 ptsSPY Close-to-close: 1.51 ptsSPY Yang-Zhang: 0.57 ptsQQQQQQ Parkinson: 4.07 ptsQQQ Close-to-close: 2.03 ptsQQQ Yang-Zhang: 0.58 ptsIWMIWM Parkinson: 4.30 ptsIWM Close-to-close: 2.33 ptsIWM Yang-Zhang: 0.79 ptsGLDGLD Parkinson: 5.51 ptsGLD Close-to-close: 1.64 ptsGLD Yang-Zhang: 0.49 ptsTLTTLT Parkinson: 4.58 ptsTLT Close-to-close: 1.35 ptsTLT Yang-Zhang: 0.40 ptsXLFXLF Parkinson: 4.67 ptsXLF Close-to-close: 1.93 ptsXLF Yang-Zhang: 0.67 ptsXLKXLK Parkinson: 5.29 ptsXLK Close-to-close: 2.36 ptsXLK Yang-Zhang: 0.64 ptsEEMEEM Parkinson: 8.47 ptsEEM Close-to-close: 1.82 ptsEEM Yang-Zhang: 0.49 ptsAAPLAAPL Parkinson: 5.91 ptsAAPL Close-to-close: 3.51 ptsAAPL Yang-Zhang: 0.93 ptsNVDANVDA Parkinson: 9.11 ptsNVDA Close-to-close: 4.95 ptsNVDA Yang-Zhang: 1.41 ptsTSLATSLA Parkinson: 10.49 ptsTSLA Close-to-close: 5.81 ptsTSLA Yang-Zhang: 1.77 pts
Table 7: error and bias by symbol

Table 7. Distance from the 5-minute benchmark over the same 20 sessions, 11 symbols. CC = close-to-close, YZ = Yang-Zhang. MAE = mean absolute error in volatility points; bias = median log ratio to the benchmark. The benchmark is itself an estimate (squared 5-minute midpoint returns, 09:30 to 16:00 ET, plus the squared overnight return).

SymbolWindowsCC MAEYZ MAEParkinson MAECC biasYZ biasParkinson bias
SPY2,3111.510.572.96-1.2%+1.3%-21.2%
QQQ2,3202.030.584.07+0.6%+0.8%-21.0%
IWM2,3202.330.794.30-3.0%+0.1%-19.1%
GLD2,1811.640.495.51+1.8%+0.6%-43.2%
TLT2,4521.350.404.58+0.2%-0.8%-42.1%
XLF2,0531.930.674.67-3.5%-0.2%-20.7%
XLK2,0812.360.645.29+0.8%-0.6%-23.2%
EEM2,1751.820.498.47-1.3%+0.4%-55.3%
AAPL1,5573.510.935.91-3.7%+0.4%-18.6%
NVDA2,0214.951.419.11+0.2%+0.7%-18.3%
TSLA2,1895.811.7710.49+2.0%+0.9%-17.0%

Yang-Zhang was closer to the benchmark than close-to-close on all 11 symbols, with a median bias of 1.3% or less. The session-only estimators read 17% to 55% low, worst for TLT, GLD and EEM, whose underlying markets trade while US equity exchanges are closed. Treat this as agreement with a second estimate, not distance from the truth: the benchmark shares the overnight returns with close-to-close and Yang-Zhang, and 5-minute sampling has its own noise.

Figure 11. 20-session realized volatility by estimator, 2024-10-01 to 2026-10-30
Annualized percent. Hover or use the arrow keys to read each date. The three session-only estimators move together and sit below close-to-close and Yang-Zhang most of the time.

Measuring the past vs forecasting the future

The sections above measure how well each estimator describes the window it covers. A different question is how well today's estimate predicts the next month. The two can disagree: an estimator can be precise about the past and still be a poor forecast if volatility changes.

We used each estimate as-is, with no fitted parameters, as the forecast of the mean daily variance over the next 21 sessions. That makes the test out of sample by construction. The target was measured two ways: the next 21 squared close-to-close returns (20 symbols) and the 5-minute benchmark (11 symbols). Losses use QLIKE, which ranks forecasts correctly even when the target is a noisy proxy [9]. Because the session-only estimators are biased low, we also report a calibrated version that rescales each estimate using only earlier, fully observed periods.

Table 8. Forecasting the next 21 sessions from today's estimate, out of sample. QLIKE loss relative to close-to-close (median across symbols; below 1 = better), and the number of symbols where the difference is significant at 5% (Diebold-Mariano, Newey-West, 25 lags), before and after a Holm correction across symbols. "Calibrated" rescales each estimate by the ratio of realized to estimated variance over all earlier, fully observed periods (at least 252). All versions are scored on the same dates per symbol (1,255 to 2,178 forecasts).

Target, windowVersionYang-ZhangParkinsonGarman-KlassRogers-Satchell
Next 21 sessions' squared returns, 20 symbols, 10-session windowAs estimated0.68 20↑ 0↓ · Holm 20↑ 0↓1.21 1↑ 4↓ · Holm 0↑ 3↓1.20 1↑ 4↓ · Holm 1↑ 3↓1.22 1↑ 4↓ · Holm 0↑ 3↓
Calibrated0.68 20↑ 0↓ · Holm 20↑ 0↓0.64 15↑ 0↓ · Holm 15↑ 0↓0.62 15↑ 0↓ · Holm 14↑ 0↓0.63 15↑ 0↓ · Holm 14↑ 0↓
Same, 20-session windowAs estimated0.84 13↑ 0↓ · Holm 5↑ 0↓1.52 0↑ 8↓ · Holm 0↑ 4↓1.52 0↑ 8↓ · Holm 0↑ 4↓1.53 0↑ 7↓ · Holm 0↑ 4↓
Calibrated0.85 12↑ 0↓ · Holm 6↑ 0↓0.88 9↑ 0↓ · Holm 8↑ 0↓0.87 9↑ 0↓ · Holm 7↑ 0↓0.86 10↑ 0↓ · Holm 5↑ 0↓
Same, 60-session windowAs estimated0.95 4↑ 0↓ · Holm 0↑ 0↓1.71 0↑ 11↓ · Holm 0↑ 5↓1.77 0↑ 9↓ · Holm 0↑ 5↓1.79 0↑ 10↓ · Holm 0↑ 4↓
Calibrated0.95 3↑ 0↓ · Holm 0↑ 0↓1.01 2↑ 1↓ · Holm 0↑ 0↓1.00 1↑ 1↓ · Holm 0↑ 0↓1.00 1↑ 1↓ · Holm 0↑ 0↓
5-minute benchmark, 11 symbols, 10-session windowAs estimated0.64 11↑ 0↓ · Holm 11↑ 0↓1.36 0↑ 4↓ · Holm 0↑ 3↓1.35 0↑ 3↓ · Holm 0↑ 3↓1.34 0↑ 3↓ · Holm 0↑ 3↓
Calibrated0.67 11↑ 0↓ · Holm 11↑ 0↓0.64 7↑ 0↓ · Holm 7↑ 0↓0.64 8↑ 0↓ · Holm 7↑ 0↓0.70 8↑ 0↓ · Holm 6↑ 0↓
Same, 20-session windowAs estimated0.85 6↑ 0↓ · Holm 3↑ 0↓1.73 0↑ 7↓ · Holm 0↑ 4↓1.83 0↑ 5↓ · Holm 0↑ 4↓1.89 0↑ 5↓ · Holm 0↑ 4↓
Calibrated0.80 6↑ 0↓ · Holm 3↑ 0↓0.92 3↑ 0↓ · Holm 0↑ 0↓0.89 3↑ 0↓ · Holm 2↑ 0↓0.88 3↑ 0↓ · Holm 2↑ 0↓
Same, 60-session windowAs estimated0.95 1↑ 0↓ · Holm 0↑ 0↓1.92 0↑ 5↓ · Holm 0↑ 4↓1.97 0↑ 5↓ · Holm 0↑ 4↓1.98 0↑ 6↓ · Holm 0↑ 4↓
Calibrated0.88 0↑ 0↓ · Holm 0↑ 0↓1.04 0↑ 0↓ · Holm 0↑ 0↓1.02 1↑ 0↓ · Holm 0↑ 0↓1.04 2↑ 0↓ · Holm 0↑ 0↓

↑ = significantly better than close-to-close, ↓ = significantly worse, count of symbols. Holm: the same count after controlling the family-wise error rate at 5% across the symbols in that cell.

  • Short windows: Yang-Zhang's 10-session estimate cut QLIKE loss to 0.68 of close-to-close's and was significantly better on all 20 symbols, all 20 after a Holm correction (and 11 of 11 against the 5-minute benchmark). The calibrated range estimators did about as well (0.64 for Parkinson).
  • 20 sessions: Yang-Zhang 0.84, ahead on 19 of 20 symbols, significant on 13 before and 5 after the correction (6 and 3 of 11 against the benchmark). Treat this as a tendency, not a firm result. Uncalibrated Parkinson was worse than close-to-close (1.52) because of its level bias, and competitive once calibrated (0.88).
  • 60 sessions: the estimator barely matters (0.95 for Yang-Zhang). With long windows, noise averages out and the level of volatility changes faster than any trailing estimate can follow.

A trailing estimate is a baseline, not a model. Our earlier study of volatility forecasts for option sellers tested EWMA, HAR, GARCH and HEAVY on the same symbols; at a one-month horizon none of them beat 30-day implied vol.

What this means for IV-RV comparisons and earnings

Two different quantities both get called the volatility risk premium:

  • Trailing IV minus RV: implied vol today minus realized vol over the past window. Known today, and what most dashboards show, including FlashAlpha's vrp_20d.
  • The forward premium: implied vol (or variance) today minus the volatility realized over the option's life. Known only afterwards. Academic measures define it in variance terms and match the horizons, for example the variance swap rate against the realized variance over the contract [10]; others pair implied variance with the past month's realized variance [11].

Table 9. 30-day ATM implied vol minus trailing 20-session realized vol, by estimator. 11 symbols, 2017 to 2026. Spread statistics use all 25,874 symbol-days with today's inputs; the forward premium (implied vol minus the 5-minute benchmark over the next 21 sessions, about 30 calendar days) and the correlation use the 23,326 days whose next 21 sessions are known.

Realized vol fromMedian spreadPositiveSign differs vs CC4-point rule differs vs CCCorr. with forward premium
Close-to-close+1.3 pts62%n/an/a+0.04
Yang-Zhang+1.1 pts63%17.3%13.8%+0.02
Parkinson+5.5 pts93%31.4%43.2%+0.08
Garman-Klass+5.6 pts93%31.9%43.9%+0.07
Rogers-Satchell+5.6 pts92%32.2%44.4%+0.06

With close-to-close, the 20-session spread was positive on 62% of days (median 1.3 points); with Yang-Zhang on 63% (median 1.1); with Parkinson on 93% (median 5.5), because Parkinson misses the overnight move. A rule such as "sell when IV exceeds RV by 4 points" gives a different answer than with close-to-close on 13.8% of days with Yang-Zhang and 43.2% with Parkinson. None of the trailing spreads tracked the forward premium closely (correlations 0.02 to 0.08); the forward premium itself had a median of 1.4 points and was positive on 65% of days. Read a trailing spread as a description of the recent past, and state which estimator it uses.

Earnings. Trailing windows and implied vol treat a scheduled event differently. Before a report, 30-day implied vol prices the coming move and trailing realized vol does not, so the spread looks wide. After the report, the trailing window contains the move and implied vol no longer prices it. NVDA on November 26, 2025: 30-day implied vol was 39.9% (down from 52.6% before the report). Against the 10-session window above, IV minus RV was +0.7 points with close-to-close, -6.1 with Parkinson and -22.0 with Yang-Zhang; over 20 sessions, -2.2 and -14.7. Three estimators, three conclusions, and all of them mostly measure an event that has passed. To judge the event itself, compare the move implied for the next report with the stock's past earnings moves, which is what FlashAlpha's /v1/earnings/vrp/{symbol} returns (Alpha).

Data conventions and failure cases

Two correct implementations can disagree by several points because of data conventions, not formulas. State these when you publish a number, and check them when you reconcile with another source.

Table 10. Calculation specification used on this page and in the downloads.

ItemThis pageWhy it matters
Session and time zoneUS regular session, 09:30 to 16:00 ETExtended-hours prints widen the high-low range and move the open, which shifts variance between the overnight and session terms.
Price typeExchange trades (official open and close)Trade highs and lows include bid-ask bounce (higher range); quote midpoints remove it. One-minute midpoints miss extremes (lower range).
AdjustmentsSplit-adjusted, not dividend-adjustedAn unadjusted split is a huge false overnight return. A cash dividend appears as a small negative gap on the ex-date; dividend-adjusting removes it.
Missing and short sessionsHolidays skipped; half-days kept as sessionsA half-day has a narrower range; a missing session doubles the next overnight return.
Invalid candlesReject if H < max(O, C), L > min(O, C) or any price ≤ 0One bad high lifts every range estimator; Figure 5 shows how much.
ReturnsNatural log; o, c, r as defined aboveSimple returns give slightly different numbers.
Denominatorsn − 1 for close-to-close, so², sc²; n for Parkinson, Garman-Klass, Rogers-SatchellMatters at short windows: 9 vs 10 is 11%.
ObservationsAn n-bar window needs n + 1 closesA 20-session close-to-close or Yang-Zhang window needs the close before the first bar.
Annualization100 × √(252 × daily variance)365 for markets that trade every day; mixing conventions changes vol by about 20%.
Units and roundingPercent, rounded to 2 decimals for display onlyRound prices only at the input stage, never intermediate terms.

Failure cases to test for: a high or low far outside its neighbours (bad print); an open equal to the previous close every day (a feed that fills missing opens, which zeroes the overnight term); a day with the open, high, low and close all equal (no trades); a split day without adjustment; and windows that mix trade-based and quote-based bars. Each one changes the range estimators far more than close-to-close.

Python reference implementation and downloads

The reference implementation computes all five estimators from arrays and keeps data retrieval separate. It reproduces Table 3 exactly and, run on FlashAlpha's own bars, matched every value of the live /v1/volatility/realized response for SPY and NVDA on November 10, 2026 (all 15 values, to 0.01).

import numpy as np

def components(o, h, l, c, prev_c):
    o, h, l, c, prev_c = (np.log(np.asarray(x, float)) for x in (o, h, l, c, prev_c))
    oc, u, d = c - o, h - o, l - o
    return {"o": o - prev_c, "c": oc, "r": (o - prev_c) + oc,
            "hl2": (h - l) ** 2, "gk": 0.5 * (h - l) ** 2 - (2 * np.log(2) - 1) * oc ** 2,
            "rs": u * (u - oc) + d * (d - oc)}

def window_variances(comp):
    n = len(comp["o"])
    k = 0.34 / (1.34 + (n + 1) / (n - 1))
    rs = comp["rs"].mean()
    return {"close_to_close": comp["r"].var(ddof=1),
            "parkinson": comp["hl2"].sum() / (4 * n * np.log(2)),
            "garman_klass": comp["gk"].mean(),
            "rogers_satchell": rs,
            "yang_zhang": comp["o"].var(ddof=1) + k * comp["c"].var(ddof=1) + (1 - k) * rs}

annualize = lambda var: 100 * np.sqrt(252 * var)

# NVDA, Table 2 (prev_c is the previous row's close; the first is Nov 12's 193.80)
# expected: close_to_close 39.17, parkinson 45.95, garman_klass 44.58,
#           rogers_satchell 43.68, yang_zhang 61.86

To run it on any symbol with public data, pin the download settings: in yfinance 1.x, yf.download returns multi-level columns and adjusts prices by default. yf.Ticker("SPY").history(period="1y", auto_adjust=False) returns flat Open, High, Low, Close columns, split-adjusted but not dividend-adjusted, which is the convention used here. Tested with yfinance 1.2.0, pandas 2.3.3 and NumPy 2.3.5.

The files are free with a FlashAlpha account. Sign in or create one, and the download starts. Everything on this page stays open to read.

The research pack (v1.1) holds everything needed to rerun both studies: the code, the FlashAlpha benchmark and implied vol inputs for the 11 benchmark symbols, the published results, and manifest.json with the SHA-256 hash, row count and date range of every input file. The Yahoo bars are downloaded by fetch.py; compare them with the manifest, because Yahoo can revise history. study.py --public-only reruns the agreement, condition, decomposition and squared-return forecast results from the Yahoo bars alone.

Get all five estimators from the FlashAlpha API

/v1/volatility/realized/{symbol} returns close-to-close, Parkinson, Garman-Klass, Rogers-Satchell and Yang-Zhang over 10, 20 and 30 sessions in one call, using the definitions on this page. It needs the Alpha plan. The API computes from split-adjusted daily bars built from FlashAlpha's quote archive, so its values can differ from a calculation on exchange trade bars such as the Yahoo bars in this study.

import httpx

r = httpx.get("https://lab.flashalpha.com/v1/volatility/realized/NVDA",
              headers={"X-Api-Key": "YOUR_API_KEY"}, timeout=30)
r.raise_for_status()
est = r.json()["estimators"]
for name in ("close_to_close", "parkinson", "garman_klass", "rogers_satchell", "yang_zhang"):
    print(f"{name:16s} rv10 {est[name]['rv10']:6.2f}  rv20 {est[name]['rv20']:6.2f}  rv30 {est[name]['rv30']:6.2f}")
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/volatility/realized/NVDA"

Two related endpoints: /v1/volatility/forecast/{symbol} (Alpha) returns EWMA, HAR, GARCH and realized-measure model forecasts for 1, 5 and 21 sessions next to 30-day implied vol, and /v1/volatility/{symbol} (Growth) returns close-to-close realized vol over 5 to 60 days with ATM implied vol and IV-RV spreads. To compare estimators on one symbol, use the CC and YZ values from the same /realized response so the bars are identical.

Alpha plan
Skip the plumbing: five estimators and the forecast models, one API key
Realized volatility by estimator, EWMA, HAR, GARCH and HEAVY forecasts next to 30-day implied vol, earnings VRP and historical replay.
Get Alpha →

Limitations

  • The market study covers 20 large, liquid US symbols; smaller stocks have wider spreads and more bad prints, which favours close-to-close.
  • The bars (exchange trades) and the benchmark (quote midpoints) come from different sources, so part of the measured distance is source difference.
  • Rolling windows overlap; the forecast tests correct for this with Newey-West variances, the descriptive percentiles do not.
  • QLIKE ranks forecasts correctly when the target is conditionally unbiased for the variance [9]. Squared returns meet that; the 5-minute benchmark does only approximately, so we report both targets.
  • The testing family for the Holm correction (symbols within each target, window and estimator) was chosen after the first release, as a robustness check.
  • Earnings dates come from Yahoo Finance and were not checked against company filings.
  • The simulation uses constant volatility and normal returns; real returns have fat tails and volatility clustering.

Related reading

Frequently asked questions

Close-to-close volatility is the standard deviation of daily close-to-close log returns. Yang-Zhang combines three pieces from the open, high, low and previous close: the variance of overnight returns, the variance of open-to-close returns and the Rogers-Satchell range term, weighted by k = 0.34 / (1.34 + (n+1)/(n-1)). Both estimate the same daily variance; Yang-Zhang needs fewer days for the same precision: in theory 7.2 to 8.2 times fewer at a 20-day window, depending on how much of the variance happens overnight.
No. 14 is its maximum for a 2-day window. Under the paper's assumptions its efficiency is 1/(f^2 + k(1 - f)^2), where f is the share of daily variance that happens overnight: 12.8 at 2 days and 7.2 at 20 days with no overnight variance, and at most 1 + 1/k (13.8 and 8.2). With 40% of variance overnight, as for many large US stocks, it is about 4.8 at 20 days, and our simulation measured 4.75. One bad 5% print a year cuts it to about 2.3 times.
On the same bars, Yang-Zhang minus close-to-close equals (1 - k)(RS - s_c^2) - 2 Cov(o, c). Yang-Zhang comes out lower when overnight gaps continue in the same direction during the session (positive covariance) or when sessions trade narrow ranges with directional closes. The difference is not a measure of overnight risk. In our 2017-2026 sample, Yang-Zhang was below close-to-close in 33% to 53% of 20-session windows, depending on the symbol.
They use only the trading session, so they miss the move from the previous close to the open. For large US stocks and equity ETFs that overnight move carries 37% to 43% of daily variance. On 20 symbols from 2017 to 2026 the session-only estimators read a median 19% below close-to-close over 20 days. Sampling prices at discrete times lowers them further, because recorded highs and lows fall inside the true ones.
Use one estimator consistently and say which. For US stocks and ETFs with clean bars, Yang-Zhang is the better default. The choice matters: switching from close-to-close to Yang-Zhang flipped the sign of the 20-day IV-RV spread on 17.3% of days, and to Parkinson on 31.4%, because Parkinson makes the spread look positive almost every day. A trailing spread describes the past; the premium you earn depends on volatility over the option's life.
It depends on the precision you need. For a stock whose true volatility is 20%, a 20-session close-to-close estimate has a typical error of about 3.2 volatility points under ideal conditions, against 1.2 for Yang-Zhang. Short windows are where Yang-Zhang helps most: as a forecast of the next month it beat close-to-close on all 20 symbols at 10 sessions, while at 60 sessions the estimator barely mattered.
Yes. With no overnight break the open is close to the previous close, so the gap that hurts Parkinson, Garman-Klass and Rogers-Satchell on stocks mostly disappears, and those estimators become precise choices. Yang-Zhang still works and then relies mostly on its session and range terms. Annualize with 365 days instead of 252, and check where the data provider starts and ends its daily bar.
Yes. /v1/volatility/realized/{symbol} returns close-to-close, Parkinson, Garman-Klass, Rogers-Satchell and Yang-Zhang over 10, 20 and 30 sessions on the Alpha plan, with the formulas on this page. /v1/volatility/{symbol} on the Growth plan returns close-to-close realized volatility over 5 to 60 days alongside ATM implied volatility and IV-RV spreads, and /v1/volatility/forecast/{symbol} on Alpha returns model forecasts.

References

  1. Parkinson, M. (1980). The extreme value method for estimating the variance of the rate of return. The Journal of Business, 53(1), 61-65. https://doi.org/10.1086/296071
  2. Garman, M. B., & Klass, M. J. (1980). On the estimation of security price volatilities from historical data. The Journal of Business, 53(1), 67-78. https://doi.org/10.1086/296072
  3. Rogers, L. C. G., & Satchell, S. E. (1991). Estimating variance from high, low and closing prices. The Annals of Applied Probability, 1(4), 504-512. https://doi.org/10.1214/aoap/1177005835
  4. Molnár, P. (2012). Properties of range-based volatility estimators. International Review of Financial Analysis, 23, 20-29. https://doi.org/10.1016/j.irfa.2011.06.012
  5. Yang, D., & Zhang, Q. (2000). Drift-independent volatility estimation based on high, low, open, and close prices. The Journal of Business, 73(3), 477-492. https://doi.org/10.1086/209650
  6. Brandt, M. W., & Kinlay, J. (2005). Estimating historical volatility [Working paper]. https://doi.org/10.2139/ssrn.4384038
  7. Bennett, C., & Gil, M. A. (2012). Volatility trading: Trading volatility, correlation, term structure and skew. Santander Investment Bolsa.
  8. Vințe, C., & Ausloos, M. (2022). The cross-sectional intrinsic entropy: A comprehensive stock market volatility estimator. Entropy, 24(5), 623. https://doi.org/10.3390/e24050623
  9. Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. https://doi.org/10.1016/j.jeconom.2010.03.034
  10. Carr, P., & Wu, L. (2009). Variance risk premiums. The Review of Financial Studies, 22(3), 1311-1341. https://doi.org/10.1093/rfs/hhn038
  11. Bollerslev, T., Tauchen, G., & Zhou, H. (2009). Expected stock returns and variance risk premia. The Review of Financial Studies, 22(11), 4463-4492. https://doi.org/10.1093/rfs/hhp008
  12. Shu, J., & Zhang, J. E. (2006). Testing range estimators of historical volatility. Journal of Futures Markets, 26(3), 297-313. https://doi.org/10.1002/fut.20197
  13. Alizadeh, S., Brandt, M. W., & Diebold, F. X. (2002). Range-based estimation of stochastic volatility models. The Journal of Finance, 57(3), 1047-1091. https://doi.org/10.1111/1540-6261.00454

Further reading on range estimators in real markets: Shu and Zhang find the estimators close to integrated variance on S&P 500 data but sensitive to opening jumps and large drift [12]; Alizadeh, Brandt and Diebold show range-based proxies are efficient and robust to microstructure noise [13].

How to cite this page

Article: Dobrowolski, T. (2026). Yang-Zhang vs close-to-close volatility: Formulas, worked example and a 10-year study (Version 1.1). FlashAlpha. https://flashalpha.com/articles/yang-zhang-vs-close-to-close-realized-volatility

Research pack: FlashAlpha (2026). Realized volatility estimator study (Version 1.1) [Data set and code]. https://flashalpha.com/downloads/realized-volatility-estimators/realized-volatility-study-v1.1.zip

Author: Tomasz Dobrowolski, Quant Engineer. Results last re-run: 2026-11-10.

@misc{flashalpha_yz_cc_2026,
  author       = {Dobrowolski, Tomasz},
  title        = {Yang-Zhang vs Close-to-Close Volatility: Formulas, Worked Example and a 10-Year Study},
  year         = {2026},
  version      = {1.1},
  publisher    = {FlashAlpha},
  url          = {https://flashalpha.com/articles/yang-zhang-vs-close-to-close-realized-volatility},
  note         = {Accessed: YYYY-MM-DD}
}
@misc{flashalpha_rv_study_2026,
  author       = {FlashAlpha},
  title        = {Realized Volatility Estimator Study},
  year         = {2026},
  version      = {1.1},
  howpublished = {Data set and code},
  url          = {https://flashalpha.com/downloads/realized-volatility-estimators/realized-volatility-study-v1.1.zip}
}

Changelog. Version 1.1 (2026-11-10): Yang-Zhang theory comparator corrected (\(1/k\) with no gaps; \(1 + 1/k\) is the maximum), Holm-adjusted forecast counts, raw and calibrated forecasts scored on identical dates, IV-RV signal statistics on all days with today's inputs, the benchmark specified in full, and its inputs added to the research pack with a manifest and a public-only mode. Version 1.0 (2026-11-10): rewritten as a reference with corrected efficiency figures (Yang-Zhang 1 + 1/k; Parkinson 4.9; Rogers-Satchell 6.0), the session-only Garman-Klass form identified as such, close-to-close correctly described as unaffected by drift, a hand-checkable NVDA example replacing an illustrative one, and two original studies. First published March 17, 2026.

Conclusion

Close-to-close and Yang-Zhang measure the same close-to-close variance; Yang-Zhang gets there with fewer days by reading the open, high and low, and it counts the overnight move that Parkinson, Garman-Klass and Rogers-Satchell miss. The efficiency gain at 20 days is 7.2 times with no overnight gaps and at most 8.2, not 14, and it shrinks when gaps dominate or the highs and lows are dirty. On real data the choice moves a 20-day reading by 1.97 points at the median and much more around gaps and earnings, enough to flip an IV-RV signal on 17.3% of days. Pick one estimator, state it, and check your numbers against the worked example. Or pull all five from the realized volatility endpoint on the Alpha plan.

Live Market Pulse

Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Export-Ready

Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!