{"slug":"verifiable-ai-trading-track-records","qid":"intraday_timing","label":"How far SPY travels from its opening print, by ET half hour, first half of 2026","post_title":"Can an AI Trading Track Record Be Verified?","post_url":"/blog/verifiable-ai-trading-track-records#q-intraday_timing","columns":["et_time","session_count","median_abs_move_pct"],"rows":[{"et_time":"09:30","session_count":123,"median_abs_move_pct":0.216},{"et_time":"10:00","session_count":123,"median_abs_move_pct":0.242},{"et_time":"10:30","session_count":123,"median_abs_move_pct":0.276},{"et_time":"11:00","session_count":123,"median_abs_move_pct":0.291},{"et_time":"11:30","session_count":123,"median_abs_move_pct":0.304},{"et_time":"12:00","session_count":123,"median_abs_move_pct":0.362},{"et_time":"12:30","session_count":123,"median_abs_move_pct":0.377},{"et_time":"13:00","session_count":123,"median_abs_move_pct":0.385},{"et_time":"13:30","session_count":123,"median_abs_move_pct":0.427},{"et_time":"14:00","session_count":123,"median_abs_move_pct":0.443},{"et_time":"14:30","session_count":123,"median_abs_move_pct":0.433},{"et_time":"15:00","session_count":123,"median_abs_move_pct":0.453},{"et_time":"15:30","session_count":123,"median_abs_move_pct":0.415}],"shape":"series","sql":"WITH minute_px AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,\n           toTimeZone(window_start, 'America/New_York') AS et,\n           toFloat64(close) AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-02')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n),\nopens AS (\n    SELECT session_date, argMin(px, et) AS open_px\n    FROM minute_px\n    GROUP BY session_date\n),\nbuckets AS (\n    SELECT session_date,\n           toStartOfInterval(et, INTERVAL 30 MINUTE) AS bucket,\n           argMax(px, et) AS bucket_px\n    FROM minute_px\n    GROUP BY session_date, bucket\n)\nSELECT formatDateTime(b.bucket, '%H:%i') AS et_time,\n       count() AS session_count,\n       round(quantileDeterministic(0.5)(abs(100 * (b.bucket_px / o.open_px - 1)),\n                                        cityHash64(b.session_date)), 3) AS median_abs_move_pct\nFROM buckets AS b\nINNER JOIN opens AS o ON b.session_date = o.session_date\nGROUP BY et_time\nORDER BY et_time","computed_at":"2026-08-03T11:22:45.971131+00:00","elapsed":0.003754723}