The ten widest overshoots: realized versus 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?.
| event | implied_pct | realized_pct | ratio |
|---|---|---|---|
| ORCL September 9, 2025 | 9.3 | 37.68 | 4.05 |
| AMZN July 30, 2026 | 6.97 | 19.82 | 2.84 |
| AMD May 5, 2026 | 8.6 | 23.38 | 2.72 |
| TSLA July 22, 2026 | 5.92 | 15.63 | 2.64 |
| AAPL July 30, 2026 | 3.67 | 8.66 | 2.36 |
| QCOM April 29, 2026 | 8.37 | 19.72 | 2.36 |
| AMD February 3, 2026 | 8.35 | 18.71 | 2.24 |
| KO February 11, 2025 | 2.96 | 6.44 | 2.18 |
| TSLA April 2, 2026 | 3.55 | 7.46 | 2.1 |
| DIS May 7, 2025 | 6.79 | 14.05 | 2.07 |
- Rows × columns
- 10 × 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 |
|---|---|---|---|
event |
text | 10 distinct values | |
implied_pct |
number | 2.96 to 9.3 | percent |
realized_pct |
number | 6.44 to 37.68 | percent |
ratio |
number | 2.07 to 4.05 | ratio or rate |
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
concat(m.sym, ' ', monthName(m.report_date), ' ', toString(toDayOfMonth(m.report_date)), ', ', toString(toYear(m.report_date))) AS event,
i.straddle_pct AS implied_pct,
m.realized_pct AS realized_pct,
round(m.realized_pct / i.straddle_pct, 2) AS ratio
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
ORDER BY m.realized_pct / i.straddle_pct DESC
LIMIT 10
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.