{"slug":"why-trading-volume-dies-at-midday","qid":"by_year","label":"SPY open, midday and close volume against an average minute, by year","post_title":"Why Trading Volume Dies at Midday: U-Shape","post_url":"/blog/why-trading-volume-dies-at-midday#q-by_year","columns":["year","open30_index","midday_index","close30_index"],"rows":[{"year":"2019","open30_index":1.5,"midday_index":0.68,"close30_index":2.41},{"year":"2020","open30_index":1.45,"midday_index":0.7,"close30_index":2.47},{"year":"2021","open30_index":1.54,"midday_index":0.64,"close30_index":2.66},{"year":"2022","open30_index":1.49,"midday_index":0.67,"close30_index":2.51},{"year":"2023","open30_index":1.35,"midday_index":0.69,"close30_index":2.52},{"year":"2024","open30_index":1.4,"midday_index":0.66,"close30_index":2.86},{"year":"2025","open30_index":1.55,"midday_index":0.7,"close30_index":2.41},{"year":"2026","open30_index":1.62,"midday_index":0.69,"close30_index":2.34}],"shape":"ranking","sql":"WITH session_minutes AS\n(\n    SELECT\n        toYear(toTimeZone(window_start, 'America/New_York'))            AS yr,\n        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n          + toMinute(toTimeZone(window_start, 'America/New_York'))     AS et_minute,\n        toFloat64(volume)                                              AS share_volume\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= '2019-01-01 00:00:00'\n      AND window_start <  '2026-07-01 00:00:00'\n)\nSELECT\n    toString(yr)                                                       AS year,\n    round((sumIf(share_volume, et_minute >= 570 AND et_minute < 600)\n           / countIf(et_minute >= 570 AND et_minute < 600))\n          / (sum(share_volume) / count()), 2)                          AS open30_index,\n    round((sumIf(share_volume, et_minute >= 690 AND et_minute < 840)\n           / countIf(et_minute >= 690 AND et_minute < 840))\n          / (sum(share_volume) / count()), 2)                          AS midday_index,\n    round((sumIf(share_volume, et_minute >= 930 AND et_minute < 960)\n           / countIf(et_minute >= 930 AND et_minute < 960))\n          / (sum(share_volume) / count()), 2)                          AS close30_index\nFROM session_minutes\nWHERE et_minute >= 570 AND et_minute < 960\nGROUP BY yr\nHAVING countIf(et_minute >= 570 AND et_minute < 600) > 0\n   AND countIf(et_minute >= 690 AND et_minute < 840) > 0\n   AND countIf(et_minute >= 930 AND et_minute < 960) > 0\nORDER BY yr","computed_at":"2026-08-10T14:42:48.541961+00:00","elapsed":0.003859605}