{"slug":"relative-volume-screener-from-the-free-sql-api","qid":"rvol_trace","label":"rvol_trace","post_title":"relative-volume-screener-from-the-free-sql-api","post_url":"/blog/relative-volume-screener-from-the-free-sql-api#q-rvol_trace","columns":["et_time","rvol_time_adjusted","rvol_naive"],"rows":[{"et_time":"09:30","rvol_time_adjusted":1.67,"rvol_naive":0.26},{"et_time":"10:00","rvol_time_adjusted":2.18,"rvol_naive":0.53},{"et_time":"10:30","rvol_time_adjusted":2.49,"rvol_naive":0.76},{"et_time":"11:00","rvol_time_adjusted":2.49,"rvol_naive":0.91},{"et_time":"11:30","rvol_time_adjusted":2.75,"rvol_naive":1.15},{"et_time":"12:00","rvol_time_adjusted":2.81,"rvol_naive":1.31},{"et_time":"12:30","rvol_time_adjusted":2.83,"rvol_naive":1.45},{"et_time":"13:00","rvol_time_adjusted":2.91,"rvol_naive":1.61},{"et_time":"13:30","rvol_time_adjusted":2.99,"rvol_naive":1.78},{"et_time":"14:00","rvol_time_adjusted":3.08,"rvol_naive":1.98},{"et_time":"14:30","rvol_time_adjusted":2.97,"rvol_naive":2.09},{"et_time":"15:00","rvol_time_adjusted":2.87,"rvol_naive":2.2},{"et_time":"15:30","rvol_time_adjusted":2.59,"rvol_naive":2.59}],"shape":"series","sql":"WITH\n    bars AS (\n        SELECT\n            toDate(et_ts)                                                        AS session_date,\n            formatDateTime(toStartOfInterval(et_ts, INTERVAL 30 MINUTE), '%H:%i') AS et_time,\n            toHour(et_ts) * 60 + toMinute(et_ts)                                 AS et_min,\n            toFloat64(volume)                                                    AS vol\n        FROM\n        (\n            SELECT\n                toTimeZone(window_start, 'America/New_York') AS et_ts,\n                volume\n            FROM global_markets.delayed_stocks_minute_aggs\n            WHERE ticker = 'CSCO'\n              AND window_start >= '2026-08-24'\n              AND window_start <  '2026-09-23'\n        )\n    ),\n    slots AS (\n        SELECT\n            session_date,\n            et_time,\n            min(et_min) AS slot_min,\n            sum(vol)    AS slot_vol\n        FROM bars\n        WHERE et_min >= 570 AND et_min < 960\n        GROUP BY session_date, et_time\n    ),\n    cum AS (\n        SELECT\n            session_date,\n            et_time,\n            slot_min,\n            sum(slot_vol) OVER (PARTITION BY session_date ORDER BY slot_min) AS cum_vol\n        FROM slots\n    ),\n    base AS (\n        SELECT avg(day_vol) AS avg_day_vol\n        FROM\n        (\n            SELECT session_date, sum(slot_vol) AS day_vol\n            FROM slots\n            WHERE session_date < '2026-09-22'\n            GROUP BY session_date\n        )\n    )\nSELECT\n    et_time,\n    round(maxIf(cum_vol, session_date = '2026-09-22') / avgIf(cum_vol, session_date < '2026-09-22'), 2) AS rvol_time_adjusted,\n    round(maxIf(cum_vol, session_date = '2026-09-22') / (SELECT avg_day_vol FROM base), 2)             AS rvol_naive\nFROM cum\nGROUP BY et_time\nORDER BY min(slot_min)","computed_at":"2026-09-25T15:03:15.802763+00:00","elapsed":0.012665203}