{"slug":"why-trading-volume-dies-at-midday","qid":"range_curve","label":"Average one-minute SPY range in basis points, by half hour","post_title":"Why Trading Volume Dies at Midday: U-Shape","post_url":"/blog/why-trading-volume-dies-at-midday#q-range_curve","columns":["et_time","avg_range_bps","median_range_bps"],"rows":[{"et_time":"09:30","avg_range_bps":7.54,"median_range_bps":6.19},{"et_time":"10:00","avg_range_bps":6.81,"median_range_bps":5.41},{"et_time":"10:30","avg_range_bps":5.87,"median_range_bps":4.73},{"et_time":"11:00","avg_range_bps":5.23,"median_range_bps":4.1},{"et_time":"11:30","avg_range_bps":5.09,"median_range_bps":3.82},{"et_time":"12:00","avg_range_bps":4.89,"median_range_bps":3.51},{"et_time":"12:30","avg_range_bps":4.66,"median_range_bps":3.32},{"et_time":"13:00","avg_range_bps":4.73,"median_range_bps":3.33},{"et_time":"13:30","avg_range_bps":4.52,"median_range_bps":3.15},{"et_time":"14:00","avg_range_bps":4.41,"median_range_bps":3.3},{"et_time":"14:30","avg_range_bps":4.43,"median_range_bps":3.05},{"et_time":"15:00","avg_range_bps":4.37,"median_range_bps":3.14},{"et_time":"15:30","avg_range_bps":5.31,"median_range_bps":3.98}],"shape":"series","sql":"WITH minute_bars AS\n(\n    SELECT\n        formatDateTime(\n            toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),\n            '%H:%i')                                                   AS et_time,\n        10000 * (toFloat64(high) - toFloat64(low)) / toFloat64(close)  AS range_bps,\n        toUInt64(toUnixTimestamp(window_start))                        AS det\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= '2025-01-02 00:00:00'\n      AND window_start <  '2026-07-01 00:00:00'\n      AND close > 0\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    et_time                                              AS et_time,\n    round(avg(range_bps), 2)                             AS avg_range_bps,\n    round(quantileDeterministic(0.5)(range_bps, det), 2) AS median_range_bps\nFROM minute_bars\nGROUP BY et_time\nHAVING count() > 0\nORDER BY et_time","computed_at":"2026-08-10T14:42:48.352720+00:00","elapsed":0.003170164}