{"slug":"do-stocks-move-as-much-as-options-predict","qid":"method_trace","label":"NVDA: implied move both ways versus the realized move, report by report","post_title":"Do Stocks Move as Much as Options Predict?","post_url":"/blog/do-stocks-move-as-much-as-options-predict#q-method_trace","columns":["report_date","report_label","straddle_implied_pct","iv_root_t_pct","realized_pct"],"rows":[{"report_date":"2025-02-26","report_label":"February 26, 2025","straddle_implied_pct":10.57,"iv_root_t_pct":13.27,"realized_pct":5.12},{"report_date":"2025-05-28","report_label":"May 28, 2025","straddle_implied_pct":6.92,"iv_root_t_pct":8.67,"realized_pct":2.72},{"report_date":"2025-08-27","report_label":"August 27, 2025","straddle_implied_pct":6.48,"iv_root_t_pct":8.12,"realized_pct":0.88},{"report_date":"2025-11-19","report_label":"November 19, 2025","straddle_implied_pct":7.65,"iv_root_t_pct":9.6,"realized_pct":0.4},{"report_date":"2026-02-25","report_label":"February 25, 2026","straddle_implied_pct":6.09,"iv_root_t_pct":7.64,"realized_pct":4.13},{"report_date":"2026-05-20","report_label":"May 20, 2026","straddle_implied_pct":6.22,"iv_root_t_pct":7.77,"realized_pct":0.5},{"report_date":"2026-08-26","report_label":"August 26, 2026","straddle_implied_pct":5.9,"iv_root_t_pct":7.4,"realized_pct":7.01}],"shape":"series","sql":"WITH\nreports AS (\n    SELECT\n        toString(ticker)    AS sym,\n        toDate(filing_date) AS report_date\n    FROM global_markets.stocks_8k_text\n    WHERE ticker = 'NVDA'\n      AND filing_date >= '2021-09-01'\n      AND filing_date <  '2026-09-20'\n      AND (items_text ILIKE '%results of operations and financial condition%'\n        OR items_text ILIKE '%item 2.02%')\n    GROUP BY sym, report_date\n),\nsessions AS (\n    SELECT\n        toString(ticker) AS sym,\n        toDate(date)     AS session_date,\n        toFloat64(close) AS px\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('NVDA')\n      AND date >= '2021-08-01'\n      AND date <  '2026-09-27'\n      AND close > 0\n),\nspans AS (\n    SELECT\n        r.sym         AS sym,\n        r.report_date AS report_date,\n        maxIf(s.session_date, s.session_date < r.report_date) AS pre_date,\n        minIf(s.session_date, s.session_date > r.report_date) AS post_date\n    FROM reports AS r\n    INNER JOIN sessions AS s ON s.sym = r.sym\n    WHERE s.session_date >= r.report_date - 8\n      AND s.session_date <= r.report_date + 8\n    GROUP BY r.sym, r.report_date\n    HAVING countIf(s.session_date < r.report_date) > 0\n       AND countIf(s.session_date > r.report_date) > 0\n),\nmoves AS (\n    SELECT\n        sp.sym         AS sym,\n        sp.report_date AS report_date,\n        sp.pre_date    AS pre_date,\n        round(100 * abs(b.px / a.px - 1), 2) AS realized_pct\n    FROM spans AS sp\n    INNER JOIN sessions AS a ON a.sym = sp.sym AND a.session_date = sp.pre_date\n    INNER JOIN sessions AS b ON b.sym = sp.sym AND b.session_date = sp.post_date\n),\ngreeks AS (\n    SELECT\n        toString(underlying_symbol)   AS sym,\n        toDate(date)                  AS pre_date,\n        toDate(expiration_date)       AS expiry,\n        lower(option_type)            AS side,\n        toFloat64(strike_price)       AS strike,\n        toFloat64(option_close)       AS opt_px,\n        toFloat64(underlying_close)   AS spot,\n        toFloat64(implied_volatility) AS iv,\n        toUInt16(days_to_expiry)      AS dte\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('NVDA')\n      AND date >= '2021-09-01'\n      AND date <  '2026-09-20'\n      AND iv_converged = 1\n      AND volume > 0\n      AND days_to_expiry BETWEEN 1 AND 45\n      AND underlying_close > 0\n      AND option_close > 0\n      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05\n),\nchain AS (\n    SELECT\n        g.sym      AS sym,\n        g.pre_date AS pre_date,\n        g.expiry   AS expiry,\n        g.side     AS side,\n        g.strike   AS strike,\n        g.opt_px   AS opt_px,\n        g.spot     AS spot,\n        g.iv       AS iv,\n        g.dte      AS dte\n    FROM greeks AS g\n    INNER JOIN moves AS m ON m.sym = g.sym AND m.pre_date = g.pre_date\n    WHERE g.expiry > m.report_date\n),\nfront AS (\n    SELECT sym, pre_date, min(expiry) AS expiry\n    FROM chain\n    GROUP BY sym, pre_date\n),\nstraddles AS (\n    SELECT\n        c.sym       AS sym,\n        c.pre_date  AS pre_date,\n        c.strike    AS strike,\n        any(c.spot) AS spot,\n        max(c.dte)  AS dte,\n        avgIf(c.opt_px, c.side IN ('call', 'c')) AS call_px,\n        avgIf(c.opt_px, c.side IN ('put', 'p'))  AS put_px,\n        avg(c.iv)   AS atm_iv\n    FROM chain AS c\n    INNER JOIN front AS f\n        ON f.sym = c.sym AND f.pre_date = c.pre_date AND f.expiry = c.expiry\n    GROUP BY c.sym, c.pre_date, c.strike\n    HAVING countIf(c.side IN ('call', 'c')) > 0\n       AND countIf(c.side IN ('put', 'p')) > 0\n),\nimplied AS (\n    SELECT\n        sym,\n        pre_date,\n        argMin(round(100 * (call_px + put_px) / spot, 2), abs(strike / spot - 1)) AS straddle_pct,\n        argMin(round(100 * atm_iv * sqrt(dte / 365), 2), abs(strike / spot - 1))  AS iv_root_t_pct\n    FROM straddles\n    GROUP BY sym, pre_date\n)\nSELECT\n    toString(m.report_date) AS report_date,\n    concat(monthName(m.report_date), ' ', toString(toDayOfMonth(m.report_date)), ', ', toString(toYear(m.report_date))) AS report_label,\n    i.straddle_pct          AS straddle_implied_pct,\n    i.iv_root_t_pct         AS iv_root_t_pct,\n    m.realized_pct          AS realized_pct\nFROM moves AS m\nINNER JOIN implied AS i ON i.sym = m.sym AND i.pre_date = m.pre_date\nWHERE i.straddle_pct > 0\nORDER BY m.report_date","computed_at":"2026-09-27T16:03:10.145373+00:00","elapsed":0.010471762}