{"slug":"es-futures-trading-hours","qid":"weekday_shape","label":"weekday_shape","post_title":"es-futures-trading-hours","post_url":"/blog/es-futures-trading-hours#q-weekday_shape","columns":["weekday","session_count","avg_volume_millions","earliest_print_et"],"rows":[{"weekday":"Monday","session_count":15,"avg_volume_millions":44.8,"earliest_print_et":"04:00"},{"weekday":"Tuesday","session_count":17,"avg_volume_millions":45.8,"earliest_print_et":"04:00"},{"weekday":"Wednesday","session_count":17,"avg_volume_millions":46.4,"earliest_print_et":"04:00"},{"weekday":"Thursday","session_count":17,"avg_volume_millions":49.3,"earliest_print_et":"04:00"},{"weekday":"Friday","session_count":15,"avg_volume_millions":48.9,"earliest_print_et":"04:00"}],"shape":"series","sql":"WITH sessions AS\n(\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n        sum(volume)                                          AS vol,\n        min(toTimeZone(window_start, 'America/New_York'))    AS first_bar\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= today() - 120\n      AND window_start <  today() - 2\n    GROUP BY d\n)\nSELECT\n    any(formatDateTime(d, '%W'))            AS weekday,\n    count()                                 AS session_count,\n    round(avg(vol) / 1e6, 1)                AS avg_volume_millions,\n    min(formatDateTime(first_bar, '%H:%i')) AS earliest_print_et\nFROM sessions\nGROUP BY toDayOfWeek(d)\nORDER BY toDayOfWeek(d)","computed_at":"2026-09-30T15:08:36.262258+00:00","elapsed":0.100208443}