Unusual Volume Stocks This Week Ranked
See unusual volume stocks this week, ranked by trailing-week turnover versus each name’s prior 40 sessions, with weekly returns, rarity context and persistence.
Unusual volume mean say stock dey trade far above its own normal level, no be the market own. If megacap trade 40 million shares, na normal Tuesday; but if small-cap do am, na serious event. This page rank the stocks wey get unusual volume for the week wey just end: for each name, e divide the average volume for the last five sessions by its own average for the previous forty sessions. E also get dollar floor, so every row na stock wey person fit actually trade. E dey refresh every week, and the “data as of” stamp show the window. The measurement itself, relative volume, get its own full guide.
Leaders for unusual-volume this week
Na three columns dey do the main work. Multiple show how far above the stock’s normal level e trade. Baseline show wetin normal be. Huge multiple from very low baseline no be as big an event as modest multiple from busy market. Dollars show whether the activity carry real economic weight. The last column, the change from open to close for the week, na the one wey most volume screens dey leave out.
| ticker | rvol week | recent adv m | baseline adv m | week dollar bn | week pct |
|---|---|---|---|---|---|
| MEDS | 248.7 | 37.15 | 0.15 | 1.03 | 327.3 |
| RETO | 177.3 | 123.16 | 0.69 | 1.4 | -51.8 |
| VEEA | 53.1 | 36.16 | 0.68 | 1.04 | 175 |
| UYLD | 15.9 | 2.6 | 0.16 | 0.66 | 0 |
| SMTH | 14.9 | 5.8 | 0.39 | 0.73 | -0.2 |
| BWIN | 14.3 | 11.62 | 0.81 | 1.86 | 0.3 |
| FTFT | 8.8 | 27.17 | 3.08 | 0.8 | 74.8 |
| XENE | 7.2 | 3.65 | 0.51 | 0.78 | -33.1 |
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 8Read every row in order:
- MEDS, 248.7x e own normal level, na the top name for the board: 37.15M shares per day against 0.15M baseline, $1.03B traded, and open-to-close change of 327.3%.
- RETO, 177.3x against 0.69M-share baseline, with $1.4B turnover behind am; the change for the week na -51.8%.
- VEEA, 53.1x, but against thin 0.68M baseline and only $1.04B turnover; change for the week, 175%.
- UYLD, 15.9x, 2.6M shares per day versus 0.16M normally; 0% open-to-close.
- SMTH, 14.9x, $0.73B traded, -0.2% for the week.
- BWIN, 14.3x against 0.81M-share baseline, $1.86B traded, 0.3% open-to-close.
- FTFT, 8.8x, 27.17M shares per day, $0.8B; the week’s change na 74.8%.
- XENE, the eighth and final row, at 7.2x with $0.78B traded and -33.1% change.
Direction no be part of the ranking. The two columns for right side make this clear: the board leader end the week 327.3% from where e open, while the eighth name end -33.1% from e own opening print. Na one screen, but opposite experiences. Heavy trading show the sessions when market dey genuinely test the stock’s float; e no tell us which side win that test.
How multiple work
Take one stock wey average 200,000 shares every day across the previous forty sessions. For the past week, e trade 1,000,000, then 1,400,000, then 900,000, then 1,100,000, then 600,000 shares. That one na five-session average of 1,000,000. Divide am: 1,000,000 ÷ 200,000 = 5.0x. If we give the same stock two-million-share baseline, that same week go read 0.5x. The numerator na this week; the denominator na how the stock normally dey trade. (The denominator itself na just average daily volume, measured across forty sessions instead of the usual twenty.)
Why forty sessions? E cover roughly two calendar months. E long enough make one earlier spike no dominate the denominator, but e still short enough to show how the stock dey trade today. Why five for the numerator? Na full week, so one halted session or one unusual block trade no go control the reading.
The calculation get one clear warning: the thinner the baseline, the cheaper the multiple. This week's leader get baseline of only 0.15M shares per day. At that size, one crowded session fit pull the whole weekly average up, and na exactly why the board demand six-figure baseline plus a $500M week before any name fit appear at all.
How rare be week like this?
Multiple only dey mean something when you compare am with the distribution wey e come from. Same universe, same window, then bucket every qualifying name based on im multiple:
| rvol bucket | names | pct of universe | universe names |
|---|---|---|---|
| 10x or more | 6 | 0.5 | 1097 |
| 5x to 10x | 2 | 0.2 | 1097 |
| 3x to 5x | 6 | 0.5 | 1097 |
| 2x to 3x | 38 | 3.5 | 1097 |
| 1.5x to 2x | 86 | 7.8 | 1097 |
| 1x to 1.5x | 477 | 43.5 | 1097 |
| below 1x | 482 | 43.9 | 1097 |
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 ASC1097 stocks and ETFs clear the floor this week. From dem, 6 trade at ten times their own norm or more, equal to 0.5% of the universe. Another 2 enter the 5x-to-10x bucket, while 6 enter the 3x-to-5x bucket. The leaderboard above come from that thin top part of the table. Below am, 38 names trade at 2x to 3x their own norm, equal to 3.5% of the universe, and 86 enter the 1.5x-to-2x band, equal to 7.8%. Another 477 dey at just elevated 1x to 1.5x, equal to 43.5% of the qualifying names.
The other side of the table na the part wey nobody dey screenshot: 482 names, equal to 43.9% of the universe, trade below their own forty-session average this week. Na the normal market condition, and na wetin make the top of the board a real outlier, no be rounding error.
Unusual volume dey last?
People dey claim say unusual volume dey continue for days, so stock wey dey near top of board like this one don usually make im big move already. We fit test am. For each of the eight leaders: how many of the five sessions trade at two times the baseline or more, how big the single heaviest session be, and how many sessions separate that heaviest session from the last session of the week.
| ticker | week rvol | days wey pass 2x | peak day rvol | sessions since peak |
|---|---|---|---|---|
| XENE | 7.2 | 1 | 32.2 | 0 |
| FTFT | 8.8 | 2 | 36.6 | 4 |
| UYLD | 15.9 | 2 | 63.1 | 4 |
| SMTH | 14.9 | 3 | 51.8 | 4 |
| RETO | 177.3 | 4 | 338.3 | 1 |
| MEDS | 248.7 | 4 | 838.3 | 2 |
| BWIN | 14.3 | 5 | 22 | 2 |
| VEEA | 53.1 | 5 | 226.5 | 3 |
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 ASCWhen we sort by persistence, the name wey persist least for the board, XENE, pass two times im baseline for 1 of the five sessions, and peak at 32.2x. The most persistent one, VEEA, do am for 5 out of five sessions, with peak of 226.5x. These na events wey happen across many sessions, no be single prints. Na this mechanical reason make weekly board and daily board often name the same stocks.
The last column show the timing: number of sessions between the heaviest day and the final session of the week. E be 0 for XENE, and 3 for VEEA. When that gap pass zero, the loudest tape don print before the week close. The board describe the week wey don end; e no dey forecast the one wey dey start.
Leader get fifteen sessions, day by day
Weekly average dey hide the real shape. Na here current leader’s daily relative volume dey, with each session’s shares compared against that same forty-session baseline. E also show each session’s open-to-close change for the last fifteen sessions:
| session date | session label | rvol day | day pct | peak rvol day |
|---|---|---|---|---|
| 2026-08-28 | Aug 28 | 0.6 | -15.1 | 838.3 |
| 2026-08-31 | Aug 31 | 9.5 | 10 | 838.3 |
| 2026-09-01 | Sep 1 | 0.8 | 3.8 | 838.3 |
| 2026-09-02 | Sep 2 | 0.7 | 1.2 | 838.3 |
| 2026-09-03 | Sep 3 | 0.3 | -5.8 | 838.3 |
| 2026-09-04 | Sep 4 | 2 | -5.2 | 838.3 |
| 2026-09-08 | Sep 8 | 0.6 | -4.8 | 838.3 |
| 2026-09-09 | Sep 9 | 0.9 | -2.3 | 838.3 |
| 2026-09-10 | Sep 10 | 0.3 | 2.3 | 838.3 |
| 2026-09-11 | Sep 11 | 0.5 | -0.8 | 838.3 |
| 2026-09-14 | Sep 14 | 0.3 | -1.7 | 838.3 |
| 2026-09-15 | Sep 15 | 339.7 | 82.1 | 838.3 |
| 2026-09-16 | Sep 16 | 838.3 | 50.2 | 838.3 |
| 2026-09-17 | Sep 17 | 24.9 | -31.6 | 838.3 |
| 2026-09-18 | Sep 18 | 40.3 | -37 | 838.3 |
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, the stock dey trade at 0.6x its baseline. E be ordinary, quiet name then. The heaviest session for the period reach 838.3x. For the latest session, Sep 18, the tape still run at 40.3x, with open-to-close change of -37%.
Notice wetin the chart no show: volume no dey reduce in one straight line. High volume dey come in clusters. Sessions after a peak fit accelerate again instead of fading. Na why you need check claim say “volume is drying up” against the daily series, instead of assuming am. Na this same daily series go serve as starting point for intraday pace measure. Na that measure dem build from scratch for the relative volume guide, and dem use am for VWAP.
Wetin the screen dey filter out
Four rules dey keep the board honest, and each one dey remove something wey reader fit want see:
- $500M dollar-volume floor for the week. Share count alone fit fill leaderboard with names where one million shares na small money.
- Baseline above 100,000 shares per day, so the denominator na real number, no be rounding artifact.
- At least 35 of the prior 40 sessions traded, wey dey exclude brand-new listings. Fresh IPO no get meaningful “normal” to divide by, and otherwise e fit hold this board for weeks.
- One reused symbol excluded: ticker wey exchange recently assign to new listing, where vendor history join two different companies together. Its baseline go be fiction.
Rule 1 na the one wey dey remove the wildest multiples for the tape. These na the six biggest ones e exclude:
| ticker | rvol week | week dollar m | average share price | baseline adv m |
|---|---|---|---|---|
| CTNT | 369.7 | 68.3 | 0.07 | 0.53 |
| MRNO | 316.1 | 125.4 | 0.39 | 0.2 |
| QCLS | 287.1 | 240.9 | 0.96 | 0.18 |
| DTSS | 103.8 | 156.2 | 1.31 | 0.23 |
| DCX | 97.7 | 24 | 0.34 | 0.14 |
| TPST | 92.7 | 102.5 | 1.15 | 0.19 |
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 6CTNT traded 369.7x its own norm, but e turn over only $68.3M for the whole week at average share price of $0.07. Behind am: MRNO at 316.1x on $125.4M, with average price of $0.39; QCLS at 287.1x on $240.9M, DTSS at 103.8x on $156.2M, DCX at 97.7x on $24M, and TPST at 92.7x on $102.5M. Real activity, and e truly unusual for those names, but na category where the multiple dey make very small amount of money look bigger.
Wey unusual volume dey come from
The things wey dey cause am again and again, so the board go read faster: earnings weeks, the one source wey get schedule; corporate events, mergers, offerings, index adds and deletes, wey dey bring mechanical volume wey no get anything to do with opinion; squeeze dynamics, where volume dey pile on top price velocity, na the pattern wey short squeeze explanation dey document; plus new listings, wey dey dominate their own tape until the float don mature. Any week board normally na mixture of these things, plus one or two real mysteries. Na those mysteries dey deserve the extra minute.
Unusual volume FAQ
Wetin count as unusual volume for one stock?
No official threshold dey, so use the distribution: out of the 1097 names wey pass this page floor this week, na only 6 trade at 10x their own normal level or more, while 43.9% actually trade below their own average. Anything above roughly 2x don already enter the top few percent of the market for that week.
Unusual volume bullish or bearish?
None of the two. Na attention, and attention dey show up with rallies and collapses too. This week, the board leader finish the five sessions 327.3% from its opening print, while the eighth name finish -33.1%; both qualify with exactly the same measurement.
How long unusual volume dey last?
Usually e dey last pass one day. The persistence panel dey count how many sessions each board name stay above twice baseline: this week, dem range from 1 out of five (XENE) to 5 out of five (VEEA). The heaviest session normally happen before the week end, no be on the final day.
Why the list dey use dollar-volume floor?
Share-count screen without one go fill up with cheap tickers wey their multiple high but the money no plenty: the biggest name wey this week exclude trade at 369.7x its normal level on total volume of $68.3M, with average price of $0.07 per share. The $500M weekly floor make sure say every row for the board get real economic weight.
Unusual stock volume dey show for the options market too?
Often, yes. Heavy equity tape and heavy options tape dey usually come together for the same names, na why traders dey watch both. But options activity dey use different measurement: contracts traded na flow number, while open interest dey count positions wey still remain open. The two answer different questions, so see options volume vs. open interest before you draw any conclusion from an "unusual options activity" alert.
Every number above come from stored, versioned query. Open the SQL under any panel to see the exact measurement, or run the same screen over any window wey you like on the Strasmore terminal.