STRASMORE/EXPLORE 2,882 QUERIES

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.

as of ranking 12×4read in context →
gap_leaderboard — 12 rows by 4 columns, computed from US exchange, SIP and OPRA data.
symbolimplied_vol_pctrealized_vol_pctgap_pct
VKTX79.258.320.9
TTD71.853.917.9
UPST83.868.615.2
VXX71.75813.7
CORZ87.674.213.4
UUUU101.488.113.3
LYFT63.350.213.1
WBD35.722.713
DPST78.565.513
DUOL79.267.112.1
GME48.536.412.1
KVUE32.920.812.1
Rows × columns
12 × 4
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for gap_leaderboard, derived from the stored result.
ColumnTypeRangeNotes
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
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisstocks-with-the-biggest-iv-rv-gap
worst_gaps ranking 10×4 → spy_monthly_trace series 24×4 → gap_frequency series 9×4 → Top 25 weekly-options underlyings by distinct contracts traded, with expiration weekdays ranking 25×4 → Annualized volatility vs total return, 25 large caps, calmest to wildest (~2 years) ranking 25×3 → SPY options median spread by expiration date, near-the-money strikes only ranking 25×4 → See all 2,882 queries →