{"slug":"what-is-relative-volume","qid":"spy_cum_checkpoints","label":"SPY: average share of full-day volume completed by each clock time (last 20 sessions)","post_title":"What Is RVOL (Relative Volume)? How to Read It","post_url":"/blog/what-is-relative-volume#q-spy_cum_checkpoints","columns":["et_checkpoint","avg_pct_of_day_volume_done"],"rows":[{"et_checkpoint":"10:00","avg_pct_of_day_volume_done":20.7},{"et_checkpoint":"12:00","avg_pct_of_day_volume_done":42.6},{"et_checkpoint":"14:00","avg_pct_of_day_volume_done":57.2},{"et_checkpoint":"15:30","avg_pct_of_day_volume_done":71.2},{"et_checkpoint":"16:00","avg_pct_of_day_volume_done":87.5}],"shape":"ranking","sql":"WITH per_min AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n           formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_min,\n           sum(toFloat64(volume)) AS v\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= now() - INTERVAL 45 DAY\n      AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))\n    GROUP BY et_date, et_min\n),\nlast20 AS (\n    SELECT DISTINCT et_date FROM per_min ORDER BY et_date DESC LIMIT 20\n)\nSELECT checkpoint AS et_checkpoint,\n       round(avg(share) * 100, 1) AS avg_pct_of_day_volume_done\nFROM (\n    SELECT et_date,\n           checkpoint,\n           sumIf(v, et_min < checkpoint) / sum(v) AS share\n    FROM (\n        SELECT et_date, et_min, v, arrayJoin(['10:00', '12:00', '14:00', '15:30', '16:00']) AS checkpoint\n        FROM per_min\n        WHERE et_date IN (SELECT et_date FROM last20)\n    )\n    GROUP BY et_date, checkpoint\n)\nGROUP BY checkpoint\nORDER BY checkpoint","computed_at":"2026-08-22T04:34:31.219380+00:00","elapsed":0.261706643}