Stocks wey get unusual volume dis week
Unusual volume stocks dis week, ranked: trailing-week turnover vs. each name prior 40 sessions, with weekly returns, rarity context and persistence.
Unusual volume mean say one stock dey trade well-well pass e own normal level — no be di market own. If one megacap stock trade 40 million shares, na normal Tuesday. But if na small-cap stock do am, e don turn event. Dis page rank di unusual volume stocks for di week wey just end: we divide each name trailing five-session average volume by e own average for di prior forty sessions, plus dollar floor so every row na stock wey pesin fit actually trade. E dey refresh every week, and di "data as of" stamp na di window. Di measurement itself — relative volume — get e own full guide.
Di pipo wey get unusual volume dis week
Three columns dey do di work. Di multiple dey show how far di stock trade pass im own normal. Di baseline dey show wetin normal be — and big multiple wey come from small baseline na smaller event pass modest one wey come from busy tape. Di dollars dey show weda di activity get economic sense. Di last column, di week open-to-close change, na di one wey plenty volume screens dey leave out.
The exact SQL behind every number
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars,
argMin(toFloat64(open), toTimeZone(window_start, 'America/New_York')) AS day_open,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS day_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
argMaxIf(s.day_open, c.rn, c.rn <= 5) AS week_open,
argMinIf(s.day_close, c.rn, c.rn <= 5) AS week_close,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
)
SELECT ticker,
round(adv_recent / adv_base, 1) AS rvol_week,
round(adv_recent / 1e6, 2) AS recent_adv_m,
round(adv_base / 1e6, 2) AS baseline_adv_m,
round(dollar_recent / 1e9, 2) AS week_dollar_bn,
round(100.0 * (week_close / week_open - 1), 1) AS week_pct
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 8Every row, read am in order:
- JLHL — 99.2x im own norm, di top of di board: 16.95M shares per day against baseline of 0.17M, $0.68B wey dem trade, and open-to-close change of 160.6%.
- AGEN — 41.1x on top 0.62M-share baseline, with $0.88B of turnover behind am; di week change na 54.3%.
- IONS — 4.7x, but on top thin 1.43M baseline and only $2.1B of turnover; change for di week, -19.6%.
- ALNY — 2.3x, 1.91M shares per day versus 0.83M normally; -26.2% open-to-close.
- BBIO — 2.1x, $2.25B wey dem trade, -0.2% for di week.
- MULL — 2.1x on top 1.96M-share baseline, $0.52B wey dem trade, -22.8% open-to-close.
- HLI — 1.9x, 0.9M shares per day, $0.61B; di week change, 5.6%.
- QGEN — di eighth and last row, at 1.8x with $0.76B wey dem trade and 8.7% change.
Direction no be part of di ranking, and di two right-hand columns make dat one clear: di board leader end di week 160.6% from im opening print while di eighth name end 8.7% from im own — one screen, opposite experiences. Heavy tape dey mark di sessions wen dem dey truly test one stock float; e no dey talk anytin about which side of dat test win.
How dem dey calculate di multiple
Take one stock wey dey average 200,000 shares per day for di last forty sessions. For di past week, e trade 1,000,000, den 1,400,000, den 900,000, den 1,100,000, den 600,000 shares — dat one give you five-session average of 1,000,000. Divide am: 1,000,000 ÷ 200,000 = 5.0x. Give dat same stock two-million-share baseline instead, and dat same week go read 0.5x. Di numerator na dis week; di denominator na who di stock normally be. (Di denominator itself na just average daily volume, wey dem measure over forty sessions instead of di usual twenty.)
Why forty sessions? E cover about two calendar months — long enough so one old spike no go fit control di denominator, short enough so e still describe di stock as e dey trade today. Why five for di numerator? Na full week, so one session wey halt or one one-off block no go own di reading.
Di arithmetic carry honest warning: di thinner di baseline, di cheaper di multiple. Dis week leader get baseline of just 0.17M shares per day — for dat size, one crowded session go drag di whole weekly average up with am, and dat na exactly why di board dey demand six-figure baseline and $500M week before any name fit show at all.
How rare be week like dis one?
Multiple only get meaning when you check am against the distribution wey e come from. Same universe, same window, every name wey qualify dey bucketed by im multiple:
The exact SQL behind every number
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
scored AS (
SELECT ticker,
multiIf(adv_recent / adv_base >= 10, 1,
adv_recent / adv_base >= 5, 2,
adv_recent / adv_base >= 3, 3,
adv_recent / adv_base >= 2, 4,
adv_recent / adv_base >= 1.5, 5,
adv_recent / adv_base >= 1, 6, 7) AS bucket_key
FROM per_name
),
buckets AS (
SELECT arrayJoin([(1, '10x or more'), (2, '5x to 10x'), (3, '3x to 5x'), (4, '2x to 3x'),
(5, '1.5x to 2x'), (6, '1x to 1.5x'), (7, 'below 1x')]) AS bk
)
SELECT bk.2 AS rvol_bucket,
countIf(scored.bucket_key = bk.1) AS names,
round(100.0 * countIf(scored.bucket_key = bk.1) / count(), 1) AS pct_of_universe,
count() AS universe_names
FROM scored CROSS JOIN buckets
GROUP BY bk
ORDER BY bk.1 ASC647 stocks and ETFs clear the floor dis week. Out of dem, 2 trade at ten times their own norm or more — na 0.3% of the universe. Anoda 0 land for the 5x-to-10x bucket and 1 for the 3x-to-5x bucket. The leaderboard wey dey up dey drawn from dat thin top of the table. Below dat one, 3 names trade at 2x to 3x their own norm (0.5% of the universe) and 5 land for the 1.5x-to-2x band (0.8%). Anoda 19 just siddon for elevated 1x to 1.5x, 2.9% of the qualifying names.
The oda end of the table na the part wey nobody dey screenshot: 617 names — 95.4% of the universe — trade below their own forty-session average dis week. Dat na the ordinary state of the market, and na im make the top of the board be genuine outlier instead of rounding error.
Unusual volume dey stay?
Wetin people dey talk na say unusual volume dey last for many days, so any name wey dey near the top of board like dis don already do im movement. We fit test am. For each of di eight leaders: how many of di five sessions run for twice di baseline or better, how big di single heaviest session be, and how many sessions separate dat heaviest session from di week last one.
The exact SQL behind every number
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
leaders AS (
SELECT ticker, adv_recent / adv_base AS rvol_week, adv_base
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 8
),
daily AS (
SELECT l.ticker AS ticker,
l.rvol_week AS rvol_week,
c.rn AS rn,
s.vol / l.adv_base AS rvol_day
FROM sess s
INNER JOIN cal c ON s.d = c.d
INNER JOIN leaders l ON s.ticker = l.ticker
WHERE c.rn <= 5
)
SELECT ticker,
round(max(rvol_week), 1) AS week_rvol,
countIf(rvol_day >= 2) AS days_above_2x,
round(max(rvol_day), 1) AS peak_day_rvol,
argMax(rn, (rvol_day, -rn)) - 1 AS sessions_since_peak
FROM daily
GROUP BY ticker
ORDER BY days_above_2x ASC, peak_day_rvol ASC, ticker ASCArrange am by persistence, di name wey no persistent pass for di board, HLI, clear twice im baseline for 1 of di five sessions, e peak for 6.2x. Di one wey persistent pass, JLHL, do am for 3 of five, with peak of 404.6x. Dis ones na multi-session events, no be single prints — wey be di mechanical reason why weekly board and daily board dey tend to name di same stocks.
Di last column na di timing one: sessions between di heaviest day and di week final session — 4 for HLI, 4 for JLHL. Where dat gap dey above zero, di loudest tape don already print before di week close. Di board dey describe di week wey end; e no dey forecast di one wey dey start.
Di leader fifteen sessions, day by day
Di weekly average dey hide di real shape. Na here be di current leader daily relative volume — each session shares against dat same forty-session baseline — plus each session open-to-close change, for di last fifteen sessions:
The exact SQL behind every number
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars,
argMin(toFloat64(open), toTimeZone(window_start, 'America/New_York')) AS day_open,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS day_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
leader AS (
SELECT ticker, adv_base
FROM per_name
ORDER BY adv_recent / adv_base DESC, ticker ASC
LIMIT 1
),
path AS (
SELECT formatDateTime(s.d, '%Y-%m-%d') AS session_date,
formatDateTime(s.d, '%b %e') AS session_label,
s.vol / l.adv_base AS rvol_day,
100.0 * (s.day_close / s.day_open - 1) AS day_pct
FROM sess s
INNER JOIN cal c ON s.d = c.d
INNER JOIN leader l ON s.ticker = l.ticker
WHERE c.rn <= 15
)
SELECT session_date,
session_label,
round(rvol_day, 1) AS rvol_day,
round(day_pct, 1) AS day_pct,
round(max(rvol_day) OVER (), 1) AS peak_rvol_day
FROM path
ORDER BY session_date ASCFifteen sessions ago di stock dey run 0.5x im baseline — na ordinary, quiet name. Di heaviest session for dis stretch hit 404.6x. For di most recent session, Jul 15, di tape still dey run 0.7x with open-to-close change of -3.5%.
Make una note wetin di chart no dey do: e no dey decay for orderly line. Elevated volume dey come for clusters, and di sessions after one peak fit re-accelerate instead of fade — na one reason why "volume dey dry up" na claim wey you gats check against di daily series instead of just assume am. Na dat same daily series be where intraday pace measure go start, di one wey dem build from scratch for di relative volume guide and wey VWAP dey use.
Wetin di screen dey comot
Four rules dey keep di board straight, and each one dey throway something wey reader fit want see:
- A $500M dollar-volume floor for di week. Share counts alone fit full leaderboard with names wey one million shares na pocket change.
- A baseline above 100,000 shares a day, so di denominator na real number and no be rounding artifact.
- At least 35 of di prior 40 sessions trade, wey dey exclude brand-new listings — fresh IPO no get any meaningful "normal" to divide by, and e for just own dis board for weeks.
- One reused symbol wey dem exclude: a ticker wey di exchanges recently reassign to new listing, wey im vendor history join two different companies together. Im baseline for be fiction.
Rule 1 na di one wey dey comot di wildest multiples for tape. Na di six biggest wey e exclude be dis:
The exact SQL behind every number
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND recent_sessions = 5 AND base_sessions >= 35
AND dollar_recent > 0 AND dollar_recent < 500000000
)
SELECT ticker,
round(adv_recent / adv_base, 1) AS rvol_week,
round(dollar_recent / 1e6, 1) AS week_dollar_m,
round(dollar_recent / (adv_recent * 5), 2) AS avg_share_price,
round(adv_base / 1e6, 2) AS baseline_adv_m
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 6SOBR trade 109.8x im own norm, yet e only turn over $262.4M all week at average share price of $1.04. Behind am: ZBAO at 109.3x on $72M (average price $0.44), WRAP at 51.8x on $162.5M, CPHI at 38.1x on $31.8M, KAPA at 36.7x on $9.5M, and LGPS at 20.2x on $57.5M. Real activity, genuinely unusual for those names — and a category where di multiple dey flatter very small amount of money.
Where unusual volume dey come from
Di producers wey dey show face steady, so di board go read sharp: earnings weeks, na di one wey dem schedule; corporate events — mergers, offerings, index adds and deletes — wey dey come with mechanical volume wey no get anything to do with opinion; squeeze dynamics, where volume dey pile on top price velocity, di pattern wey di short squeeze explainer document; and new listings, wey dey control dia own tape until di float season. Any week board na usually blend, plus one or two real mysteries — and di mysteries na di rows wey worth di extra minute.
Unusual volume FAQ
Wetin count as unusual volume for stock?
No official threshold dey, so use di distribution: out of di 647 names wey pass dis page floor dis week, na only 2 trade for 10x dia own norm or pass, and 95.4% actually trade below dia own average. Anyting wey pass roughly 2x don already dey inside di top few percent of di market for any given week.
Unusual volume na bullish or bearish?
E no be any of dem — na attention, and attention dey come with rallies and collapses just di same. Dis week di board leader finish di five sessions 160.6% from im opening print and di eighth name finish 8.7%; both of dem qualify on exactly di same measurement.
How long unusual volume dey last?
E dey usually last pass one day. Di persistence panel dey count each board name sessions wey pass twice baseline: dis week dem run from 1 out of five (HLI) go reach 3 out of five (JLHL), and di heaviest session typically dey land before di week end instead of for im final day.
Why di list dey use dollar-volume floor?
Share-count screen wey no get one dey fill up with cheap tickers wey di multiple big but di money no dey: dis week biggest name wey dem exclude trade 109.8x im norm on $262.4M total, for average price of $1.04 per share. Di $500M weekly floor dey make sure every row for board dey economically real.
Unusual stock volume dey show for options market too?
E dey often show, yes — heavy equity tape and heavy options tape dey tend to arrive together on di same names, na why traders dey watch both. But dem dey measure options activity differently sha: contracts traded na flow number, while open interest dey count positions wey still stand, and di two dey answer different questions — check options volume versus open interest before you read anyting into "unusual options activity" alert.
Every number wey dey up na stored, versioned query — expand di SQL under any panel to see di exact measurement, or run di same screen over any window wey you like for Strasmore terminal.