{"slug":"the-10-am-rule-in-stocks","qid":"session_shape","label":"session_shape","post_title":"the-10-am-rule-in-stocks","post_url":"/blog/the-10-am-rule-in-stocks#q-session_shape","columns":["et_time","volume_share_pct","range_share_pct"],"rows":[{"et_time":"09:30","volume_share_pct":15.5,"range_share_pct":54.5},{"et_time":"10:00","volume_share_pct":9.8,"range_share_pct":38.1},{"et_time":"10:30","volume_share_pct":8,"range_share_pct":31.5},{"et_time":"11:00","volume_share_pct":7,"range_share_pct":27.6},{"et_time":"11:30","volume_share_pct":6,"range_share_pct":24.7},{"et_time":"12:00","volume_share_pct":5.4,"range_share_pct":22.6},{"et_time":"12:30","volume_share_pct":4.9,"range_share_pct":21.3},{"et_time":"13:00","volume_share_pct":5,"range_share_pct":21.6},{"et_time":"13:30","volume_share_pct":4.9,"range_share_pct":20.8},{"et_time":"14:00","volume_share_pct":5.4,"range_share_pct":21.7},{"et_time":"14:30","volume_share_pct":5.5,"range_share_pct":20.6},{"et_time":"15:00","volume_share_pct":6.5,"range_share_pct":21},{"et_time":"15:30","volume_share_pct":15.9,"range_share_pct":29.1}],"shape":"series","sql":"WITH bars AS (\n    SELECT\n        ticker,\n        toDate(toTimeZone(window_start, 'America/New_York'))            AS trade_day,\n        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n            + toMinute(toTimeZone(window_start, 'America/New_York'))    AS et_minute,\n        high,\n        low,\n        volume\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'MSFT', 'NVDA', 'KO')\n      AND window_start >= '2023-01-01'\n      AND window_start <  '2026-01-01'\n),\nregular AS (\n    SELECT *\n    FROM bars\n    WHERE et_minute >= 570 AND et_minute < 960\n),\nday_totals AS (\n    SELECT\n        ticker,\n        trade_day,\n        max(high)   AS day_high,\n        min(low)    AS day_low,\n        sum(volume) AS day_volume,\n        count()     AS bar_count\n    FROM regular\n    GROUP BY ticker, trade_day\n    HAVING bar_count >= 300\n       AND day_high > day_low\n       AND day_volume > 0\n),\nhalf_hours AS (\n    SELECT\n        ticker,\n        trade_day,\n        intDiv(et_minute - 570, 30) AS bucket,\n        max(high)                   AS bucket_high,\n        min(low)                    AS bucket_low,\n        sum(volume)                 AS bucket_volume\n    FROM regular\n    GROUP BY ticker, trade_day, bucket\n)\nSELECT\n    formatDateTime(toDateTime((570 + h.bucket * 30) * 60, 'UTC'), '%H:%i') AS et_time,\n    round(avg(100 * toFloat64(h.bucket_volume) / toFloat64(d.day_volume)), 1) AS volume_share_pct,\n    round(avg(100 * toFloat64(h.bucket_high - h.bucket_low)\n                  / toFloat64(d.day_high - d.day_low)), 1)                   AS range_share_pct\nFROM half_hours AS h\nINNER JOIN day_totals AS d\n    ON d.ticker = h.ticker AND d.trade_day = h.trade_day\nGROUP BY h.bucket\nORDER BY h.bucket","computed_at":"2026-09-26T15:10:54.056337+00:00","elapsed":0.003620646}