STRASMORE/EXPLORE 2,170 QUERIES 22Y EQUITIES · 12Y OPTIONS

2,170 answered market questions

every one with its exact SQL, its result and the date it was computed · free, no signup

Historical Volatility vs Implied Volatility
SPY: monthly implied volatility against the next month's realized volatilityseries · 2026-08-22 · 18×4Preview: a 16-point series, roughly flat. 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×4Preview: 6 ranked values, largest first. AAPL realized volatility: 20-session against 60-session lookbackseries · 2026-08-22 · 72×3Preview: a 16-point series, ending higher.
SPY: monthly implied volatility against the next month's realized volatility

SPY: monthly implied volatility against the next month's realized volatility

most recentas of series 18×4read in context →
SPY: monthly implied volatility against the next month's realized volatility — 18 rows by 4 columns, computed from US exchange, SIP and OPRA data.
monthimplied_vol_pctrealized_next_month_pctgap_pct
2025-0214.220.7-6.5
2025-031951.9-32.9
2025-0427.216.810.4
2025-0518.510.28.3
2025-0615.96.69.3
2025-0715123
2025-0813.77.16.6
2025-0913.313.8-0.5
2025-1015.715.40.3
2025-1116.78.48.3
2025-1213.510.33.2
2026-011413.40.6
2026-0216.418.2-1.8
2026-032111.69.4
2026-0417.29.77.5
2026-0515.417.7-2.3
2026-0615.712.13.6
2026-0714.811.63.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
$