{"slug":"why-stock-quotes-are-delayed-15-minutes","qid":"fifteen_minute_gap","label":"How far SPY travels in 15 minutes, by hour of the session (June 2026)","post_title":"Why Stock Quotes Are Delayed 15 Minutes","post_url":"/blog/why-stock-quotes-are-delayed-15-minutes#q-fifteen_minute_gap","columns":["et_time","median_gap_pct","p95_gap_pct","sample_count"],"rows":[{"et_time":"09:00","median_gap_pct":0.125,"p95_gap_pct":0.556,"sample_count":630},{"et_time":"10:00","median_gap_pct":0.095,"p95_gap_pct":0.408,"sample_count":1260},{"et_time":"11:00","median_gap_pct":0.079,"p95_gap_pct":0.324,"sample_count":1260},{"et_time":"12:00","median_gap_pct":0.063,"p95_gap_pct":0.274,"sample_count":1260},{"et_time":"13:00","median_gap_pct":0.055,"p95_gap_pct":0.295,"sample_count":1260},{"et_time":"14:00","median_gap_pct":0.054,"p95_gap_pct":0.26,"sample_count":1260},{"et_time":"15:00","median_gap_pct":0.065,"p95_gap_pct":0.295,"sample_count":945}],"shape":"series","sql":"WITH regular_bars AS\n(\n    SELECT\n        toTimeZone(window_start, 'America/New_York')                      AS et,\n        toTimeZone(window_start, 'America/New_York') + INTERVAL 15 MINUTE AS et_later,\n        toFloat64(close)                                                  AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND close > 0\n      AND window_start >= '2026-06-01 00:00:00'\n      AND window_start <  '2026-07-01 00:00:00'\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960\n)\nSELECT\n    formatDateTime(toStartOfHour(a.et), '%H:%i')                                                       AS et_time,\n    round(quantileDeterministic(0.5)(abs(b.px / a.px - 1) * 100, toUInt64(toUnixTimestamp(a.et))), 3)   AS median_gap_pct,\n    round(quantileDeterministic(0.95)(abs(b.px / a.px - 1) * 100, toUInt64(toUnixTimestamp(a.et))), 3)  AS p95_gap_pct,\n    count()                                                                                            AS sample_count\nFROM regular_bars AS a\nINNER JOIN regular_bars AS b ON b.et = a.et_later\nGROUP BY et_time\nORDER BY et_time","computed_at":"2026-08-06T15:16:28.021519+00:00","elapsed":0.003725667}