gap_leaderboard
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-01, from stocks-with-the-biggest-iv-rv-gap.
| symbol | implied_vol_pct | realized_vol_pct | gap_pct |
|---|---|---|---|
| VKTX | 79.2 | 58.3 | 20.9 |
| TTD | 71.8 | 53.9 | 17.9 |
| UPST | 83.8 | 68.6 | 15.2 |
| VXX | 71.7 | 58 | 13.7 |
| CORZ | 87.6 | 74.2 | 13.4 |
| UUUU | 101.4 | 88.1 | 13.3 |
| LYFT | 63.3 | 50.2 | 13.1 |
| WBD | 35.7 | 22.7 | 13 |
| DPST | 78.5 | 65.5 | 13 |
| DUOL | 79.2 | 67.1 | 12.1 |
| GME | 48.5 | 36.4 | 12.1 |
| KVUE | 32.9 | 20.8 | 12.1 |
- Rows × columns
- 12 × 4
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
symbol |
text | 12 distinct values (CORZ, DPST, DUOL…) | |
implied_vol_pct |
number | 32.9 to 101.4 | percent |
realized_vol_pct |
number | 20.8 to 88.1 | percent |
gap_pct |
number | 12.1 to 20.9 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH
split_tickers AS
(
SELECT DISTINCT ticker
FROM global_markets.stocks_splits
WHERE execution_date >= '2025-10-01'
AND execution_date < '2026-08-01'
),
px AS
(
SELECT
ticker AS symbol,
date AS session,
max(toFloat64(close)) AS px
FROM global_markets.stocks_daily_aggs
WHERE date >= '2025-10-01'
AND date < '2026-08-01'
AND ticker NOT IN (SELECT ticker FROM split_tickers)
AND ticker NOT IN ('SPCX')
GROUP BY symbol, session
),
iv_rows AS
(
SELECT
g.symbol AS symbol,
g.session AS session,
g.iv AS iv
FROM
(
SELECT
underlying_symbol AS symbol,
toDate(date) AS session,
toFloat64(strike_price) AS strike,
implied_volatility AS iv
FROM global_markets.options_greeks
WHERE date >= '2025-10-01'
AND date < '2026-07-01'
AND lower(toString(option_type)) IN ('c', 'call')
AND days_to_expiry BETWEEN 20 AND 45
AND implied_volatility > 0
) AS g
INNER JOIN px AS p ON p.symbol = g.symbol AND p.session = g.session
WHERE p.px > 10
AND abs(g.strike / p.px - 1) < 0.05
),
implied AS
(
SELECT
symbol,
round(100 * avg(iv), 1) AS implied_vol_pct
FROM iv_rows
GROUP BY symbol
HAVING countDistinct(session) >= 120
AND count() >= 1000
),
daily_returns AS
(
SELECT
symbol,
arrayJoin(arrayMap((a, b) -> log(tupleElement(a, 2) / tupleElement(b, 2)),
arraySlice(series, 2),
arraySlice(series, 1, length(series) - 1))) AS ret
FROM
(
SELECT
symbol,
arraySort(groupArray((session, px))) AS series
FROM px
WHERE session >= '2025-11-01'
AND symbol IN (SELECT symbol FROM implied)
GROUP BY symbol
)
),
realized AS
(
SELECT
symbol,
round(100 * sqrt(252) * stddevSamp(ret), 1) AS realized_vol_pct
FROM daily_returns
GROUP BY symbol
HAVING count() >= 120
)
SELECT
implied.symbol AS symbol,
implied.implied_vol_pct AS implied_vol_pct,
realized.realized_vol_pct AS realized_vol_pct,
round(implied.implied_vol_pct - realized.realized_vol_pct, 1) AS gap_pct
FROM implied
INNER JOIN realized ON realized.symbol = implied.symbol
WHERE implied.implied_vol_pct > realized.realized_vol_pct
ORDER BY gap_pct DESC
LIMIT 12
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.