{"slug":"relative-volume-screener-from-the-free-sql-api","qid":"screener_top20","label":"screener_top20","post_title":"relative-volume-screener-from-the-free-sql-api","post_url":"/blog/relative-volume-screener-from-the-free-sql-api#q-screener_top20","columns":["ticker","rvol_time_adjusted","rvol_naive","volume_mm_by_1100","screen_asof"],"rows":[{"ticker":"IONQ","rvol_time_adjusted":5.23,"rvol_naive":2.16,"volume_mm_by_1100":32.25,"screen_asof":"Sep 23"},{"ticker":"UNG","rvol_time_adjusted":2.99,"rvol_naive":0.9,"volume_mm_by_1100":15.6,"screen_asof":"Sep 23"},{"ticker":"QBTS","rvol_time_adjusted":2.41,"rvol_naive":0.96,"volume_mm_by_1100":12.56,"screen_asof":"Sep 23"},{"ticker":"WBD","rvol_time_adjusted":2.33,"rvol_naive":0.81,"volume_mm_by_1100":24.42,"screen_asof":"Sep 23"},{"ticker":"RGTI","rvol_time_adjusted":2.14,"rvol_naive":0.88,"volume_mm_by_1100":11.62,"screen_asof":"Sep 23"},{"ticker":"CMG","rvol_time_adjusted":2.09,"rvol_naive":0.58,"volume_mm_by_1100":5.13,"screen_asof":"Sep 23"},{"ticker":"BB","rvol_time_adjusted":2.08,"rvol_naive":0.66,"volume_mm_by_1100":6.6,"screen_asof":"Sep 23"},{"ticker":"XLF","rvol_time_adjusted":2.04,"rvol_naive":0.55,"volume_mm_by_1100":17.05,"screen_asof":"Sep 23"},{"ticker":"PLTR","rvol_time_adjusted":2,"rvol_naive":0.75,"volume_mm_by_1100":15.97,"screen_asof":"Sep 23"},{"ticker":"IEMG","rvol_time_adjusted":1.97,"rvol_naive":0.45,"volume_mm_by_1100":4.62,"screen_asof":"Sep 23"},{"ticker":"DVN","rvol_time_adjusted":1.97,"rvol_naive":0.59,"volume_mm_by_1100":4.88,"screen_asof":"Sep 23"},{"ticker":"PSKY","rvol_time_adjusted":1.94,"rvol_naive":0.49,"volume_mm_by_1100":7.86,"screen_asof":"Sep 23"},{"ticker":"NCLH","rvol_time_adjusted":1.92,"rvol_naive":0.51,"volume_mm_by_1100":6.78,"screen_asof":"Sep 23"},{"ticker":"RWM","rvol_time_adjusted":1.91,"rvol_naive":0.72,"volume_mm_by_1100":15.01,"screen_asof":"Sep 23"},{"ticker":"ERY","rvol_time_adjusted":1.89,"rvol_naive":0.68,"volume_mm_by_1100":9.55,"screen_asof":"Sep 23"},{"ticker":"SOXS","rvol_time_adjusted":1.85,"rvol_naive":0.85,"volume_mm_by_1100":36.6,"screen_asof":"Sep 23"},{"ticker":"VG","rvol_time_adjusted":1.84,"rvol_naive":0.56,"volume_mm_by_1100":6.67,"screen_asof":"Sep 23"},{"ticker":"DKNG","rvol_time_adjusted":1.79,"rvol_naive":0.41,"volume_mm_by_1100":4.07,"screen_asof":"Sep 23"},{"ticker":"META","rvol_time_adjusted":1.76,"rvol_naive":0.7,"volume_mm_by_1100":11.69,"screen_asof":"Sep 23"},{"ticker":"QID","rvol_time_adjusted":1.74,"rvol_naive":0.43,"volume_mm_by_1100":14.15,"screen_asof":"Sep 23"}],"shape":"table","sql":"WITH\n    liquid AS (\n        SELECT ticker\n        FROM global_markets.stocks_daily_aggs\n        WHERE date > today() - 45\n          AND ticker NOT IN ('SPCX')\n        GROUP BY ticker\n        HAVING avg(volume) >= 10000000\n           AND min(close) >= 5\n    ),\n    sessions AS (\n        SELECT date\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n          AND date > today() - 45\n        ORDER BY date DESC\n        LIMIT 21\n    ),\n    bars AS (\n        SELECT\n            ticker,\n            toDate(et_ts)                        AS session_date,\n            toHour(et_ts) * 60 + toMinute(et_ts) AS et_min,\n            toFloat64(volume)                    AS vol\n        FROM\n        (\n            SELECT\n                ticker,\n                toTimeZone(window_start, 'America/New_York') AS et_ts,\n                volume\n            FROM global_markets.delayed_stocks_minute_aggs\n            WHERE ticker IN (SELECT ticker FROM liquid)\n              AND window_start >= toDateTime(today() - 45)\n        )\n        WHERE session_date IN (SELECT date FROM sessions)\n    ),\n    totals AS (\n        SELECT\n            ticker,\n            session_date,\n            sumIf(vol, et_min >= 570 AND et_min < 660) AS vol_by_1100,\n            sumIf(vol, et_min >= 570 AND et_min < 960) AS vol_day,\n            maxIf(et_min, et_min < 960)                AS last_min\n        FROM bars\n        GROUP BY ticker, session_date\n    ),\n    (\n        SELECT session_date\n        FROM totals\n        GROUP BY session_date\n        HAVING countIf(last_min >= 955) >= 100\n        ORDER BY session_date DESC\n        LIMIT 1\n    ) AS asof\nSELECT\n    ticker,\n    round(maxIf(vol_by_1100, session_date = asof) / avgIf(vol_by_1100, session_date < asof), 2) AS rvol_time_adjusted,\n    round(maxIf(vol_by_1100, session_date = asof) / avgIf(vol_day, session_date < asof), 2)     AS rvol_naive,\n    round(maxIf(vol_by_1100, session_date = asof) / 1e6, 2)                                    AS volume_mm_by_1100,\n    formatDateTime(asof, '%b %e')                                                              AS screen_asof\nFROM totals\nGROUP BY ticker\nHAVING countIf(session_date < asof) >= 18\n   AND maxIf(last_min, session_date = asof) >= 955\n   AND avgIf(vol_by_1100, session_date < asof) > 0\nORDER BY rvol_time_adjusted DESC\nLIMIT 20","computed_at":"2026-09-25T15:03:23.961793+00:00","elapsed":8.065198218}