{"slug":"what-is-relative-volume","qid":"rvol_distribution","label":"Full-day RVOL percentiles across high-volume US stocks and ETFs (20-day ADV above 5M shares), latest completed session","post_title":"What Is RVOL (Relative Volume)? How to Read It","post_url":"/blog/what-is-relative-volume#q-rvol_distribution","columns":["percentile","rvol"],"rows":[{"percentile":"p10","rvol":0.08},{"percentile":"p25","rvol":0.57},{"percentile":"p50 (median)","rvol":0.86},{"percentile":"p75","rvol":1.2},{"percentile":"p90","rvol":1.69},{"percentile":"p99","rvol":3.43}],"shape":"ranking","sql":"WITH daily AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n           toFloat64(sum(volume)) AS day_volume\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE window_start >= now() - INTERVAL 40 DAY\n      AND toDate(toTimeZone(window_start, 'America/New_York')) < toDate(toTimeZone(now(), 'America/New_York'))\n    GROUP BY ticker, et_date\n),\nspy_days AS (\n    SELECT et_date,\n           day_volume,\n           avg(day_volume) OVER (ORDER BY et_date ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS prior_avg\n    FROM daily\n    WHERE ticker = 'SPY' AND day_volume > 10000000\n),\nsessions AS (\n    SELECT et_date FROM spy_days\n),\nlatest AS (\n    SELECT max(et_date) AS d FROM spy_days WHERE prior_avg > 0 AND day_volume >= 0.6 * prior_avg\n),\nprior20 AS (\n    SELECT et_date FROM sessions WHERE et_date < (SELECT d FROM latest) ORDER BY et_date DESC LIMIT 20\n),\nrvols AS (\n    SELECT ticker, day_vol / adv20 AS rvol\n    FROM (\n        SELECT ticker,\n               sumIf(day_volume, et_date = (SELECT d FROM latest)) AS day_vol,\n               sumIf(day_volume, et_date IN (SELECT et_date FROM prior20)) / 20 AS adv20,\n               countIf(day_volume > 0 AND et_date IN (SELECT et_date FROM prior20)) AS sessions_traded\n        FROM daily\n        WHERE ticker NOT IN ('SPCX')\n        GROUP BY ticker\n        HAVING adv20 > 5000000 AND day_vol > 0 AND sessions_traded = 20\n    )\n)\nSELECT pair.1 AS percentile,\n       round(pair.2, 2) AS rvol\nFROM (\n    SELECT arrayJoin(arrayZip(['p10', 'p25', 'p50 (median)', 'p75', 'p90', 'p99'], quantilesExact(0.1, 0.25, 0.5, 0.75, 0.9, 0.99)(rvol))) AS pair\n    FROM rvols\n)\nORDER BY percentile","computed_at":"2026-08-22T04:34:40.258179+00:00","elapsed":8.159189363}