Historical Volatility vs Implied Volatility
SPY: monthly implied volatility against the next month's realized volatilityseries ·
2026-08-22 · 18×4
Average implied volatility against next-month realized volatility, by nametable ·
2026-08-22 · 6×5
Annualized historical volatility over three lookback windowsranking ·
2026-08-22 · 6×4
AAPL realized volatility: 20-session against 60-session lookbackseries ·
2026-08-22 · 72×3
SPY: monthly implied volatility against the next month's realized volatility
SPY: monthly implied volatility against the next month's realized volatility
| month | implied_vol_pct | realized_next_month_pct | gap_pct |
|---|---|---|---|
| 2025-02 | 14.2 | 20.7 | -6.5 |
| 2025-03 | 19 | 51.9 | -32.9 |
| 2025-04 | 27.2 | 16.8 | 10.4 |
| 2025-05 | 18.5 | 10.2 | 8.3 |
| 2025-06 | 15.9 | 6.6 | 9.3 |
| 2025-07 | 15 | 12 | 3 |
| 2025-08 | 13.7 | 7.1 | 6.6 |
| 2025-09 | 13.3 | 13.8 | -0.5 |
| 2025-10 | 15.7 | 15.4 | 0.3 |
| 2025-11 | 16.7 | 8.4 | 8.3 |
| 2025-12 | 13.5 | 10.3 | 3.2 |
| 2026-01 | 14 | 13.4 | 0.6 |
| 2026-02 | 16.4 | 18.2 | -1.8 |
| 2026-03 | 21 | 11.6 | 9.4 |
| 2026-04 | 17.2 | 9.7 | 7.5 |
| 2026-05 | 15.4 | 17.7 | -2.3 |
| 2026-06 | 15.7 | 12.1 | 3.6 |
| 2026-07 | 14.8 | 11.6 | 3.2 |
the exact SQL behind every number
WITH
daily AS
(
SELECT
date AS session_date,
toFloat64(close) AS close_px,
lagInFrame(toFloat64(close)) OVER
(ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= today() - 560
AND date < today()
),
realized AS
(
SELECT
toStartOfMonth(session_date) AS month_start,
round(100 * sqrt(252) * stddevSamp(log(close_px / prev_close)), 1) AS realized_vol_pct
FROM daily
WHERE prev_close > 0
GROUP BY month_start
HAVING count() >= 15
),
implied AS
(
SELECT
toStartOfMonth(date) AS month_start,
round(100 * avg(implied_volatility), 1) AS implied_vol_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date >= today() - 560
AND date < today()
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY month_start
HAVING count() >= 100
)
SELECT
formatDateTime(imp.month_start, '%Y-%m') AS month,
imp.implied_vol_pct AS implied_vol_pct,
rea.realized_vol_pct AS realized_next_month_pct,
round(imp.implied_vol_pct - rea.realized_vol_pct, 1) AS gap_pct
FROM implied AS imp
INNER JOIN realized AS rea ON rea.month_start = addMonths(imp.month_start, 1)
ORDER BY month
More from this analysisHistorical Volatility vs Implied Volatility
AAPL realized volatility: 20-session against 60-session lookback
series 72×3
→
Average implied volatility against next-month realized volatility, by name
table 6×5
→
Annualized historical volatility over three lookback windows
ranking 6×4
→
META at-the-money implied volatility by session: trailing 90 days
series 62×2
→
See all 2,170 queries →