{"slug":"why-trading-volume-dies-at-midday","qid":"volume_curve","label":"Share of regular-session volume by half hour, SPY and AAPL","post_title":"Why Trading Volume Dies at Midday: U-Shape","post_url":"/blog/why-trading-volume-dies-at-midday#q-volume_curve","columns":["et_time","spy_pct","aapl_pct"],"rows":[{"et_time":"09:30","spy_pct":12.15,"aapl_pct":17.86},{"et_time":"10:00","spy_pct":8.93,"aapl_pct":9.69},{"et_time":"10:30","spy_pct":7.44,"aapl_pct":7.73},{"et_time":"11:00","spy_pct":6.97,"aapl_pct":7.04},{"et_time":"11:30","spy_pct":6.05,"aapl_pct":6.16},{"et_time":"12:00","spy_pct":5.35,"aapl_pct":5.46},{"et_time":"12:30","spy_pct":5.16,"aapl_pct":5.16},{"et_time":"13:00","spy_pct":5.15,"aapl_pct":5.25},{"et_time":"13:30","spy_pct":5.15,"aapl_pct":4.88},{"et_time":"14:00","spy_pct":5.9,"aapl_pct":5.03},{"et_time":"14:30","spy_pct":6.02,"aapl_pct":5.12},{"et_time":"15:00","spy_pct":7.49,"aapl_pct":6.21},{"et_time":"15:30","spy_pct":18.26,"aapl_pct":14.4}],"shape":"series","sql":"WITH session_minutes AS\n(\n    SELECT\n        ticker,\n        formatDateTime(\n            toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),\n            '%H:%i')                                                   AS et_time,\n        toFloat64(volume)                                              AS share_volume\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY', 'AAPL')\n      AND window_start >= '2025-01-02 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),\nby_bucket AS\n(\n    SELECT\n        ticker,\n        et_time,\n        sum(share_volume) AS bucket_volume\n    FROM session_minutes\n    GROUP BY ticker, et_time\n),\nticker_totals AS\n(\n    SELECT\n        ticker,\n        sum(bucket_volume) AS ticker_volume\n    FROM by_bucket\n    GROUP BY ticker\n)\nSELECT\n    b.et_time                                                          AS et_time,\n    round(100 * sumIf(b.bucket_volume, b.ticker = 'SPY')\n          / max(if(t.ticker = 'SPY', t.ticker_volume, 0)), 2)          AS spy_pct,\n    round(100 * sumIf(b.bucket_volume, b.ticker = 'AAPL')\n          / max(if(t.ticker = 'AAPL', t.ticker_volume, 0)), 2)         AS aapl_pct\nFROM by_bucket AS b\nINNER JOIN ticker_totals AS t ON t.ticker = b.ticker\nGROUP BY b.et_time\nORDER BY b.et_time","computed_at":"2026-08-10T14:42:48.254324+00:00","elapsed":0.003347033}