{"slug":"msft-premarket-and-after-hours-prices","qid":"follow_through","label":"follow_through","post_title":"msft-premarket-and-after-hours-prices","post_url":"/blog/lang/zh-hant/msft-premarket-and-after-hours-prices#q-follow_through","columns":["gap_bucket","sessions","continuation_pct","median_aligned_pct"],"rows":[{"gap_bucket":"0.25-0.50%","sessions":649,"continuation_pct":48.2,"median_aligned_pct":-0.04},{"gap_bucket":"0.50-1.00%","sessions":658,"continuation_pct":48,"median_aligned_pct":-0.09},{"gap_bucket":"1.00-2.00%","sessions":365,"continuation_pct":53.4,"median_aligned_pct":0.12},{"gap_bucket":"2.00%+","sessions":138,"continuation_pct":51.4,"median_aligned_pct":0.14}],"shape":"ranking","sql":"WITH bars AS\n(\n    SELECT\n        date,\n        any(open)  AS open_px,\n        any(close) AS close_px\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'MSFT'\n      AND date >= '2016-01-01'\n      AND date <  '2026-09-01'\n    GROUP BY date\n),\ngaps AS\n(\n    SELECT\n        date,\n        round((toFloat64(open_px) / prev_close - 1) * 100, 3)        AS gap_pct,\n        round((toFloat64(close_px) / toFloat64(open_px) - 1) * 100, 3) AS session_pct\n    FROM\n    (\n        SELECT\n            date,\n            open_px,\n            close_px,\n            lagInFrame(toFloat64(close_px)) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n        FROM bars\n    )\n    WHERE prev_close > 0\n)\nSELECT\n    multiIf(abs(gap_pct) < 0.50, '0.25-0.50%',\n            abs(gap_pct) < 1.00, '0.50-1.00%',\n            abs(gap_pct) < 2.00, '1.00-2.00%',\n                                 '2.00%+')                                                                  AS gap_bucket,\n    count()                                                                                                  AS sessions,\n    round(100.0 * countIf(sign(session_pct) = sign(gap_pct)) / count(), 1)                                    AS continuation_pct,\n    round(quantileDeterministic(0.5)(session_pct * sign(gap_pct), toUInt64(toYYYYMMDD(date))), 2)             AS median_aligned_pct\nFROM gaps\nWHERE abs(gap_pct) >= 0.25\nGROUP BY gap_bucket\nHAVING count() > 0\nORDER BY min(abs(gap_pct)) ASC","computed_at":"2026-09-26T15:42:43.271284+00:00","elapsed":0.004480493}