{"slug":"twap-vs-vwap-vs-pov-orders","qid":"curve_dispersion","label":"curve_dispersion","post_title":"twap-vs-vwap-vs-pov-orders","post_url":"/blog/twap-vs-vwap-vs-pov-orders#q-curve_dispersion","columns":["et_time","median_share_pct","lowest_share_pct","highest_share_pct"],"rows":[{"et_time":"09:30","median_share_pct":11.51,"lowest_share_pct":6.34,"highest_share_pct":17.14},{"et_time":"10:00","median_share_pct":7.9,"lowest_share_pct":4.55,"highest_share_pct":13.14},{"et_time":"10:30","median_share_pct":6.79,"lowest_share_pct":3.25,"highest_share_pct":14.21},{"et_time":"11:00","median_share_pct":5.94,"lowest_share_pct":2.89,"highest_share_pct":11.67},{"et_time":"11:30","median_share_pct":5.53,"lowest_share_pct":2.6,"highest_share_pct":23.55},{"et_time":"12:00","median_share_pct":5.06,"lowest_share_pct":1.8,"highest_share_pct":10.68},{"et_time":"12:30","median_share_pct":4.3,"lowest_share_pct":2.03,"highest_share_pct":12.03},{"et_time":"13:00","median_share_pct":4.75,"lowest_share_pct":2.63,"highest_share_pct":8.85},{"et_time":"13:30","median_share_pct":4.25,"lowest_share_pct":2.51,"highest_share_pct":11.9},{"et_time":"14:00","median_share_pct":5.4,"lowest_share_pct":3.1,"highest_share_pct":11.98},{"et_time":"14:30","median_share_pct":5.42,"lowest_share_pct":3.85,"highest_share_pct":12.79},{"et_time":"15:00","median_share_pct":7.6,"lowest_share_pct":4.06,"highest_share_pct":13.06},{"et_time":"15:30","median_share_pct":21.32,"lowest_share_pct":14.21,"highest_share_pct":36.6}],"shape":"series","sql":"WITH bars AS\n(\n    SELECT\n        toTimeZone(window_start, 'America/New_York')  AS et,\n        toHour(et) * 60 + toMinute(et)                AS minute_of_day,\n        toDate(et)                                    AS et_date,\n        toFloat64(volume)                             AS shares\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= toDateTime('2026-06-01 00:00:00', 'UTC')\n      AND window_start <  toDateTime('2026-09-01 00:00:00', 'UTC')\n),\nper_bucket AS\n(\n    SELECT\n        et_date,\n        formatDateTime(toStartOfInterval(et, INTERVAL 30 MINUTE), '%H:%i', 'America/New_York') AS et_time,\n        sum(shares)                                                                            AS bucket_shares\n    FROM bars\n    WHERE minute_of_day >= 570\n      AND minute_of_day <  960\n    GROUP BY et_date, et_time\n),\nper_day AS\n(\n    SELECT\n        et_date,\n        sum(bucket_shares) AS day_shares\n    FROM per_bucket\n    GROUP BY et_date\n)\nSELECT\n    b.et_time                                                                                          AS et_time,\n    round(100 * quantileDeterministic(0.5)(b.bucket_shares / d.day_shares, toYYYYMMDD(b.et_date)), 2)  AS median_share_pct,\n    round(100 * min(b.bucket_shares / d.day_shares), 2)                                                AS lowest_share_pct,\n    round(100 * max(b.bucket_shares / d.day_shares), 2)                                                AS highest_share_pct\nFROM per_bucket AS b\nINNER JOIN per_day AS d ON d.et_date = b.et_date\nGROUP BY et_time\nORDER BY et_time","computed_at":"2026-09-17T15:50:27.534608+00:00","elapsed":0.004391632}