Realized Volatility API - Range-Based Estimators (Parkinson, Garman-Klass, Yang-Zhang) - FlashAlpha Lab API
Lab API Realized Volatility

Realized Volatility API

Range-based realized (historical) volatility estimators - Parkinson, Garman-Klass, Rogers-Satchell, Yang-Zhang, and close-to-close - over 10/20/30-day windows. Range estimators exploit the daily high/low/open/close and are 5-8x more statistically efficient than close-to-close.

Endpoint

GET /v1/volatility/realized/{symbol}
Auth required (X-Api-Key) Rate Limited: Yes Alpha plan+

Parameters

Name In Required Default Description
symbol path yes - Underlying symbol (coverage limited to ramped symbols in the historical archive)
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://lab.flashalpha.com/v1/volatility/realized/AAPL"
import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/volatility/realized/AAPL",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
data = resp.json()
print(f"Yang-Zhang 20d: {data['estimators']['yang_zhang']['rv20']}")
const resp = await fetch(
  "https://lab.flashalpha.com/v1/volatility/realized/AAPL",
  { headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Yang-Zhang 20d: " + data.estimators.yang_zhang.rv20);

Response

{
  "symbol": "AAPL",
  "as_of": "2026-06-08T15:30:00Z",
  "underlying_price": 201.50,
  "estimators": {
    "close_to_close":  { "rv10": 18.40, "rv20": 21.20, "rv30": 22.70 },
    "parkinson":       { "rv10": 17.10, "rv20": 19.80, "rv30": 20.40 },
    "garman_klass":    { "rv10": 16.90, "rv20": 19.50, "rv30": 20.10 },
    "rogers_satchell": { "rv10": 17.30, "rv20": 20.10, "rv30": 20.60 },
    "yang_zhang":      { "rv10": 17.00, "rv20": 19.70, "rv30": 20.30 }
  }
}

Key Response Fields

Field Description
underlying_priceMost-recent daily close from the archive.
estimators.*.rv10 / rv20 / rv30Annualized realized volatility (percent) over a 10/20/30-bar window, or null when the window has too few bars (see thresholds below).
estimators.close_to_closeSample variance of log-returns - the classic estimator, included as a baseline.
estimators.parkinsonHigh-low range estimator. Tighter than close-to-close but ignores opening jumps.
estimators.garman_klassOHLC estimator using both the range and the open-close move.
estimators.rogers_satchellDrift-independent OHLC estimator (handles trending series).
estimators.yang_zhangOvernight + open-close + Rogers-Satchell combination - the most statistically efficient of the set.

Methodology

Each estimator produces a daily variance over N bars in the window; every window value is then annualized as rv = 100 * sqrt(252 * variance). Price history comes from the historical replay archive (the same OHLC series exposed at GET /v1/stock/{symbol}/prices on historical.flashalpha.com), so coverage is limited to ramped symbols.

Estimator Daily variance (O,H,L,C per bar; ln = natural log)
close_to_closeSample variance of log-returns ln(Cᵢ/Cᵢ₋₁) (denominator N-1)
parkinson1 / (4·N·ln(2)) · Σ ln(Hᵢ/Lᵢ)²
garman_klass1/N · Σ [ 0.5·ln(Hᵢ/Lᵢ)² - (2·ln(2)-1)·ln(Cᵢ/Oᵢ)² ]
rogers_satchell1/N · Σ [ ln(Hᵢ/Cᵢ)·ln(Hᵢ/Oᵢ) + ln(Lᵢ/Cᵢ)·ln(Lᵢ/Oᵢ) ]
yang_zhangσ²ₒ + k·σ²_c + (1-k)·σ²_RS, with k = 0.34 / (1.34 + (N+1)/(N-1))

For Yang-Zhang, σ²ₒ is the overnight-return variance (ln(Oᵢ/Cᵢ₋₁), mean-removed), σ²_c the open-to-close variance, and σ²_RS the Rogers-Satchell variance above.

History thresholds (null vs 404)

  • Fewer than 11 daily bars available → 404 insufficient_history (11 = enough for the 10-bar window plus Yang-Zhang's prior-close seed).
  • 11+ bars but not enough for a longer window → the request succeeds (200) and the unavailable window(s) are null (e.g. 12 bars ⇒ rv10 populated, rv20/rv30 null).

Errors

Status Description
403tier_restricted - requires Alpha plan or higher.
404insufficient_history - genuine no-coverage (symbol not in the archive) or fewer than 11 daily bars.
429rate_limit_exceeded - the historical archive is rate limiting; retry shortly.
502upstream_error - the historical archive rejected the forwarded request.
503upstream_unavailable - the historical archive is down or unreachable.

About

Range estimators use the full daily bar (open, high, low, close) instead of just the close, which makes them 5-8x more statistically efficient than close-to-close at the same sample size - you get a stable vol read from fewer days. Yang-Zhang is generally the best single number: it is drift-independent and handles overnight gaps, which matters for single names that move on after-hours news.

Pair realized vol with implied vol from /v1/volatility or the VRP dashboard to read the volatility risk premium, and with /v1/volatility/forecast to compare a backward-looking estimate against a conditional forecast.

Common Use Cases

  • Get a fast, stable vol read - use estimators.yang_zhang.rv10 for a clean realized-vol number from a short window, where the range estimators are 5-8x more efficient than close-to-close
  • Compute the realized-vs-implied spread - difference yang_zhang.rv20 against ATM IV to read the VRP without waiting 30 sessions for close-to-close to settle
  • Isolate overnight-gap risk - compare yang_zhang versus parkinson; a wide gap flags vol that is driven by after-hours moves rather than intraday range
  • Detect a vol regime shift - watch rv10 cross above or below rv30 on the same estimator to time a contraction or expansion in realized risk
  • Calibrate position sizing and stops - feed annualized rv20 into a vol-target or stop-distance rule so exposure scales with current realized risk
  • Stress-test a drifting name - prefer rogers_satchell for trending series, where its drift-independence avoids the upward bias of close-to-close
  • Feed a multi-lookback model - supply robust rv10 / rv20 / rv30 inputs across estimators to a forecasting or risk model

Related reading

Complementary endpoints

  • VRP - the realized-vs-implied spread computed for you
  • Volatility - implied vol and ATM IV to difference against realized
  • Volatility Forecast - compare this backward-looking estimate against a conditional forecast

Ready to build?

Get your free API key and start pulling live options data in 30 seconds.