{"slug":"why-do-stocks-gap-overnight","qid":"straddle","label":"MSFT straddle prices at the close before the gap: Jan 28, 2026, Jan 30 expiry","post_title":"Why Do Stocks Gap Up or Down Overnight?","post_url":"/blog/why-do-stocks-gap-overnight#q-straddle","columns":["strike_price","call_mid","put_mid","straddle_cost","implied_move_pct"],"rows":[{"strike_price":"$477.5","call_mid":15.2,"put_mid":10.67,"straddle_cost":25.87,"implied_move_pct":5.37},{"strike_price":"$480","call_mid":13.8,"put_mid":11.95,"straddle_cost":25.75,"implied_move_pct":5.35},{"strike_price":"$482.5","call_mid":12.62,"put_mid":13.07,"straddle_cost":25.69,"implied_move_pct":5.33},{"strike_price":"$485","call_mid":11.47,"put_mid":14.42,"straddle_cost":25.89,"implied_move_pct":5.37}],"shape":"table","sql":"WITH prior AS (\n    SELECT round(argMax(toFloat64(close), window_start), 2) AS prior_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'MSFT'\n      AND window_start >= toDateTime('2026-01-28 09:30:00', 'America/New_York')\n      AND window_start < toDateTime('2026-01-28 16:00:00', 'America/New_York')\n),\nquotes AS (\n    SELECT toFloat64(substring(ticker, 14, 8)) / 1000 AS strike,\n           substring(ticker, 13, 1) AS cp,\n           round(argMax((bid_price + ask_price) / 2, sip_timestamp), 2) AS mid\n    FROM global_markets.cache_options_quotes\n    WHERE ticker LIKE 'O:MSFT260130%'\n      AND sip_timestamp >= toDateTime('2026-01-28 15:45:00', 'America/New_York')\n      AND sip_timestamp < toDateTime('2026-01-28 16:00:00', 'America/New_York')\n      AND bid_price > 0\n      AND ask_price > 0\n    GROUP BY ticker\n)\nSELECT concat('$', toString(strike)) AS strike_price,\n       maxIf(mid, cp = 'C') AS call_mid,\n       maxIf(mid, cp = 'P') AS put_mid,\n       round(maxIf(mid, cp = 'C') + maxIf(mid, cp = 'P'), 2) AS straddle_cost,\n       round(100 * (maxIf(mid, cp = 'C') + maxIf(mid, cp = 'P')) / (SELECT prior_close FROM prior), 2) AS implied_move_pct\nFROM quotes\nWHERE abs(strike - (SELECT prior_close FROM prior)) <= 5\nGROUP BY strike\nHAVING countIf(cp = 'C') > 0 AND countIf(cp = 'P') > 0\nORDER BY strike","computed_at":"2026-07-26T06:36:49.393831+00:00","elapsed":0.099167232}