STRASMORE/EXPLORE 2,707 QUERIES

Where the realized move landed relative to implied

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-09-27, from Do Stocks Move as Much as Options Predict?.

as of ranking 6×4read in context →
Where the realized move landed relative to implied — 6 rows by 4 columns, computed from US exchange, SIP and OPRA data.
ratio_bucketevent_countshare_pctcumulative_pct
under 0.50x333232
0.50 to 0.75x1312.644.7
0.75 to 1.00x98.753.4
1.00 to 1.50x2423.376.7
1.50 to 2.00x1312.689.3
over 2.00x1110.7100
Rows × columns
6 × 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 Where the realized move landed relative to implied, derived from the stored result.
ColumnTypeRangeNotes
ratio_bucket text 6 distinct values
event_count number 9 to 33 count
share_pct number 8.7 to 32 percent
cumulative_pct number 32 to 100 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
reports AS (
    SELECT
        toString(ticker)    AS sym,
        toDate(filing_date) AS report_date
    FROM global_markets.stocks_8k_text
    WHERE ticker IN ('AAPL', 'AMD', 'AMZN', 'AVGO', 'DIS', 'GOOGL', 'JPM', 'KO', 'META', 'MSFT', 'NFLX', 'NVDA', 'ORCL', 'QCOM', 'TSLA', 'WMT')
      AND filing_date >= '2021-09-01'
      AND filing_date <  '2026-09-20'
      AND (items_text ILIKE '%results of operations and financial condition%'
        OR items_text ILIKE '%item 2.02%')
    GROUP BY sym, report_date
),
sessions AS (
    SELECT
        toString(ticker) AS sym,
        toDate(date)     AS session_date,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'AMD', 'AMZN', 'AVGO', 'DIS', 'GOOGL', 'JPM', 'KO', 'META', 'MSFT', 'NFLX', 'NVDA', 'ORCL', 'QCOM', 'TSLA', 'WMT')
      AND date >= '2021-08-01'
      AND date <  '2026-09-27'
      AND close > 0
),
spans AS (
    SELECT
        r.sym         AS sym,
        r.report_date AS report_date,
        maxIf(s.session_date, s.session_date < r.report_date) AS pre_date,
        minIf(s.session_date, s.session_date > r.report_date) AS post_date
    FROM reports AS r
    INNER JOIN sessions AS s ON s.sym = r.sym
    WHERE s.session_date >= r.report_date - 8
      AND s.session_date <= r.report_date + 8
    GROUP BY r.sym, r.report_date
    HAVING countIf(s.session_date < r.report_date) > 0
       AND countIf(s.session_date > r.report_date) > 0
),
moves AS (
    SELECT
        sp.sym         AS sym,
        sp.report_date AS report_date,
        sp.pre_date    AS pre_date,
        round(100 * abs(b.px / a.px - 1), 2) AS realized_pct
    FROM spans AS sp
    INNER JOIN sessions AS a ON a.sym = sp.sym AND a.session_date = sp.pre_date
    INNER JOIN sessions AS b ON b.sym = sp.sym AND b.session_date = sp.post_date
),
greeks AS (
    SELECT
        toString(underlying_symbol)   AS sym,
        toDate(date)                  AS pre_date,
        toDate(expiration_date)       AS expiry,
        lower(option_type)            AS side,
        toFloat64(strike_price)       AS strike,
        toFloat64(option_close)       AS opt_px,
        toFloat64(underlying_close)   AS spot,
        toFloat64(implied_volatility) AS iv,
        toUInt16(days_to_expiry)      AS dte
    FROM global_markets.options_greeks
    WHERE underlying_symbol IN ('AAPL', 'AMD', 'AMZN', 'AVGO', 'DIS', 'GOOGL', 'JPM', 'KO', 'META', 'MSFT', 'NFLX', 'NVDA', 'ORCL', 'QCOM', 'TSLA', 'WMT')
      AND date >= '2021-09-01'
      AND date <  '2026-09-20'
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 1 AND 45
      AND underlying_close > 0
      AND option_close > 0
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
),
chain AS (
    SELECT
        g.sym      AS sym,
        g.pre_date AS pre_date,
        g.expiry   AS expiry,
        g.side     AS side,
        g.strike   AS strike,
        g.opt_px   AS opt_px,
        g.spot     AS spot,
        g.iv       AS iv,
        g.dte      AS dte
    FROM greeks AS g
    INNER JOIN moves AS m ON m.sym = g.sym AND m.pre_date = g.pre_date
    WHERE g.expiry > m.report_date
),
front AS (
    SELECT sym, pre_date, min(expiry) AS expiry
    FROM chain
    GROUP BY sym, pre_date
),
straddles AS (
    SELECT
        c.sym       AS sym,
        c.pre_date  AS pre_date,
        c.strike    AS strike,
        any(c.spot) AS spot,
        max(c.dte)  AS dte,
        avgIf(c.opt_px, c.side IN ('call', 'c')) AS call_px,
        avgIf(c.opt_px, c.side IN ('put', 'p'))  AS put_px,
        avg(c.iv)   AS atm_iv
    FROM chain AS c
    INNER JOIN front AS f
        ON f.sym = c.sym AND f.pre_date = c.pre_date AND f.expiry = c.expiry
    GROUP BY c.sym, c.pre_date, c.strike
    HAVING countIf(c.side IN ('call', 'c')) > 0
       AND countIf(c.side IN ('put', 'p')) > 0
),
implied AS (
    SELECT
        sym,
        pre_date,
        argMin(round(100 * (call_px + put_px) / spot, 2), abs(strike / spot - 1)) AS straddle_pct,
        argMin(round(100 * atm_iv * sqrt(dte / 365), 2), abs(strike / spot - 1))  AS iv_root_t_pct
    FROM straddles
    GROUP BY sym, pre_date
)
SELECT
    bucket                                                           AS ratio_bucket,
    toUInt32(n)                                                      AS event_count,
    round(100 * n / sum(n) OVER (), 1)                               AS share_pct,
    round(100 * sum(n) OVER (ORDER BY sort_key) / sum(n) OVER (), 1) AS cumulative_pct
FROM
(
    SELECT
        multiIf(r <= 0.50, 1, r <= 0.75, 2, r <= 1.00, 3, r <= 1.50, 4, r <= 2.00, 5, 6) AS sort_key,
        multiIf(r <= 0.50, 'under 0.50x',
                r <= 0.75, '0.50 to 0.75x',
                r <= 1.00, '0.75 to 1.00x',
                r <= 1.50, '1.00 to 1.50x',
                r <= 2.00, '1.50 to 2.00x',
                'over 2.00x') AS bucket,
        count()               AS n
    FROM
    (
        SELECT m.realized_pct / i.straddle_pct AS r
        FROM moves AS m
        INNER JOIN implied AS i ON i.sym = m.sym AND i.pre_date = m.pre_date
        WHERE i.straddle_pct > 0
    )
    GROUP BY sort_key, bucket
)
ORDER BY sort_key
⌘/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 analysisDo Stocks Move as Much as Options Predict?
The ten widest overshoots: realized versus implied ranking 10×4 → Under-implied share and median ratio, year by year ranking 2×4 → Implied versus realized earnings moves, large caps scored print by print table 13×8 → NVDA: implied move both ways versus the realized move, report by report series 7×5 → NVDA after its late-May 2023 report: implied volatility and where the stock went series 12×6 → Apple: implied volatility and the expected move at six horizons, one session table 6×7 → See all 2,707 queries →