Do Stocks Move as Much as Options Predict?
Implied versus realized earnings moves, large caps scored print by printtable ·
2026-09-27 · 13×8
Where the realized move landed relative to impliedranking ·
2026-09-27 · 6×4
The ten widest overshoots: realized versus impliedranking ·
2026-09-27 · 10×4
NVDA: implied move both ways versus the realized move, report by reportseries ·
2026-09-27 · 7×5
Under-implied share and median ratio, year by yearranking ·
2026-09-27 · 2×4
How Earnings Move Option Greeks
The Tesla $400 May call through its Q1 earnings (Apr 8 - May 6 2026)series ·
2026-08-24 · 21×5
Tesla's 8-K filings across Q1 2026 (EDGAR index)table ·
2026-08-24 · 4×3
Near-the-money Tesla May-expiry implied volatility around the printseries ·
2026-08-24 · 21×3
Implied versus realized earnings moves, large caps scored print by print
Implied versus realized earnings moves, large caps scored print by print
| symbol | event_count | under_implied_count | median_implied_pct | median_realized_pct | median_ratio | sample_from | sample_through |
|---|---|---|---|---|---|---|---|
| NVDA | 7 | 6 | 6.48 | 2.72 | 0.39 | 2025-02-26 | 2026-08-26 |
| AMD | 7 | 5 | 8.6 | 1.98 | 0.22 | 2025-02-04 | 2026-08-04 |
| ORCL | 7 | 5 | 10.5 | 10.24 | 0.85 | 2025-03-10 | 2026-09-10 |
| TSLA | 14 | 9 | 5.92 | 3.31 | 0.56 | 2025-01-02 | 2026-07-22 |
| AMZN | 7 | 4 | 6.82 | 6.04 | 0.89 | 2025-02-06 | 2026-07-30 |
| AVGO | 7 | 4 | 8.35 | 6.03 | 0.78 | 2025-03-06 | 2026-09-02 |
| NFLX | 7 | 4 | 7.75 | 6.42 | 0.72 | 2025-01-21 | 2026-07-16 |
| KO | 7 | 3 | 2.97 | 3.46 | 1.23 | 2025-02-11 | 2026-07-28 |
| MSFT | 7 | 3 | 4.79 | 7.2 | 1.64 | 2025-01-29 | 2026-07-29 |
| QCOM | 7 | 3 | 6.66 | 7.39 | 1.19 | 2025-02-05 | 2026-07-29 |
| WMT | 7 | 3 | 4.94 | 5.6 | 1.18 | 2025-02-20 | 2026-08-20 |
| DIS | 7 | 2 | 6.52 | 7.61 | 1.19 | 2025-02-05 | 2026-08-05 |
| META | 7 | 2 | 7.15 | 9.16 | 1.18 | 2025-01-29 | 2026-07-29 |
the exact SQL behind every number
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
m.sym AS symbol,
toUInt32(count()) AS event_count,
toUInt32(countIf(m.realized_pct <= i.straddle_pct)) AS under_implied_count,
round(quantileDeterministic(0.5)(i.straddle_pct, cityHash64(m.sym, m.report_date)), 2) AS median_implied_pct,
round(quantileDeterministic(0.5)(m.realized_pct, cityHash64(m.sym, m.report_date)), 2) AS median_realized_pct,
round(quantileDeterministic(0.5)(m.realized_pct / i.straddle_pct, cityHash64(m.sym, m.report_date)), 2) AS median_ratio,
toString(min(m.report_date)) AS sample_from,
toString(max(m.report_date)) AS sample_through
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 m.sym
HAVING count() >= 5
ORDER BY under_implied_count / event_count DESC, symbol ASC
More from this analysisDo Stocks Move as Much as Options Predict?
The ten widest overshoots: realized versus implied
ranking 10×4
→
NVDA: implied move both ways versus the realized move, report by report
series 7×5
→
Where the realized move landed relative to implied
ranking 6×4
→
Under-implied share and median ratio, year by year
ranking 2×4
→
See all 3,256 queries →