Wetin be Average Daily Volume (ADV)?
Average daily volume na di normal shares wey dem dey trade for one stock per day. E be di denominator inside days to cover, relative volume, and every liquidity screen.
Average daily volume — ADV — na di number wey dem dey use pass wey nobody dey explain: e mean di normal shares wey dem dey trade for one stock per day, wey dem average over some period wey don pass. E dey serve as di denominator inside days to cover, di baseline inside relative volume, and di liquidity test inside every screener — wey mean say all those numbers dey carry ADV quiet choices: which period, which sessions, shares or dollars. Dis page go define am well, show di arithmetic by hand, and measure each of those choices on real tape.
Average daily volume, wey dem measure
Twenty regular-hours sessions — June 11 reach July 10, 2026 — four names wey everybody sabi plus one wey dem deliberately make thin. Shares, dollars, and (for later) the part of each name total volume wey dey trade outside regular hours:
The exact SQL behind every number
WITH per_day AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sumIf(toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') >= '09:30'
AND formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '16:00') AS rth_shares,
sumIf(toFloat64(close) * toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') >= '09:30'
AND formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '16:00') AS rth_dollars,
sum(toFloat64(volume)) AS all_shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'MU', 'KO', 'CATO')
AND window_start >= toDateTime('2026-06-11 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
GROUP BY ticker, et_date
)
SELECT ticker,
round(avg(rth_shares) / 1e6, 2) AS adv_shares_m,
round(avg(rth_dollars) / 1e9, 2) AS adv_dollars_bn,
round(100 * (sum(all_shares) - sum(rth_shares)) / sum(all_shares), 1) AS extended_hours_pct,
count() AS sessions
FROM per_day
GROUP BY ticker
ORDER BY adv_shares_m DESCDis table carry di whole argument for dis page. MU and AAPL dey trade almost di same number of shares every day — 42.01M against 41.47M — but di dollar column divide dem wide apart: $44.49B against $12.24B a day. Shares dey measure activity; dollars dey measure money. Di ranking even flip for di top: SPY dey lead for shares (46.01M across 20 sessions) while MU dey lead dis table for dollars. And for di bottom, CATO dey trade 0.05 million shares a day — money wey small sotey di billions column show 0 for dis scale. Na dat kind tape wey one single institutional order be di day volume, and where trading costs dey live for anoda universe.
How to calculate average daily volume
Di arithmetic deliberately boring: add di daily share volumes for di window wey you choose, divide by di number of days. One full week of Coca-Cola regular-hours tape (July 6–10, 2026), with di running total and average wey dem compute for di same query:
The exact SQL behind every number
SELECT session_date,
shares_m,
round(sum(shares_m) OVER (), 1) AS five_day_total_m,
round(avg(shares_m) OVER (), 1) AS adv_m,
round(avg(shares_m) OVER () * 0.01 * 1000, 0) AS one_pct_of_adv_k
FROM (
SELECT formatDateTime(toDate(toTimeZone(window_start, 'America/New_York')), '%Y-%m-%d') AS session_date,
round(sumIf(toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') >= '09:30'
AND formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '16:00') / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-07-06 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
GROUP BY session_date
)
ORDER BY session_dateAdd di five days — 10.7 + 12.1 + 10.7 + 11 + 8.3 million shares — and di total na 52.8M. Divide by five: 10.6M shares, KO 5-session ADV. A 20-session ADV na di same arithmetic over 20 rows — dat na di number for di first table. Notice wetin di average hide: 2026-07-07 print 12.1M and 2026-07-10 print 8.3M, day-to-day swings wey ADV smooth into one figure. Di last column dey preview position sizing: one percent of KO ADV na about 106 thousand shares — di scale wey one single order start to be noticeable share of di day tape.
Na di window wey you pick dey decide how fast ADV go forget
Twenty sessions na di normal way dem dey count am (na one trading month); ten, thirty, sixty-five, and ninety all dey for ground. Di window na im dey decide how fast ADV go forget. MU na di live example for 2026 — na name wey im tape change so tey for mid-year wey make im trailing-month ADV and im trailing-quarter ADV dey tell different tori for spring, you fit see di receipts for im June deep-dive. Na di same stock for di same seven months, dem measure am with both windows at once:
The exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sum(toFloat64(volume)) AS day_shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= toDateTime('2025-08-01 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY et_date
),
rolled AS (
SELECT et_date,
avg(day_shares) OVER (ORDER BY et_date ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) AS adv20,
avg(day_shares) OVER (ORDER BY et_date ROWS BETWEEN 89 PRECEDING AND CURRENT ROW) AS adv90,
row_number() OVER (ORDER BY et_date) AS rn,
count() OVER () AS total_rows
FROM daily
)
SELECT formatDateTime(et_date, '%Y-%m-%d') AS date,
round(adv20 / 1e6, 1) AS adv_20_session_m,
round(adv90 / 1e6, 1) AS adv_90_session_m
FROM rolled
WHERE rn > 90 AND (rn % 3 = total_rows % 3)
ORDER BY et_dateFor 2025-12-10 di two windows gree: 21.3M for di 20-session count, 19.9M for di 90. By 2026-04-14 dem don split go 45.6M against 31.9M — two "official" ADVs for one stock for one day, and every screener, days-to-cover figure, or relative-volume reading wey dem key to one window no gree with di same tool wey dem key to di oda one. By 2026-07-10 di two don gree again (42M vs 41.9M): di re-rated volume level don old reach di long window too. When two sources no gree about one stock im ADV, di window na di first suspect; weda dem include extended-hours volume na di second one.
Wetin dey happen to ADV just after volume shock
Di chart up top dey hint am; here we don measure am. Take MU im sharpest volume shock for 2026 — di session wey pass im own trailing 20-session ADV pass any oda — den compare di ADV wey screener show as dem enter dat day wit wetin e show one month later:
The exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sum(toFloat64(volume)) AS day_shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= toDateTime('2025-11-01 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY et_date
),
ranked AS (
SELECT et_date, day_shares,
day_shares / avg(day_shares) OVER (ORDER BY et_date ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS shock_ratio,
row_number() OVER (ORDER BY et_date) AS rn
FROM daily
),
biggest AS (
SELECT et_date, day_shares, shock_ratio
FROM ranked
WHERE rn > 20 AND et_date >= toDate('2026-01-01')
ORDER BY shock_ratio DESC, et_date ASC
LIMIT 1
),
before AS (
SELECT avg(day_shares) AS adv FROM (
SELECT day_shares FROM daily WHERE et_date < (SELECT et_date FROM biggest) ORDER BY et_date DESC LIMIT 20
)
),
after AS (
SELECT avg(day_shares) AS adv FROM (
SELECT day_shares FROM daily WHERE et_date >= (SELECT et_date FROM biggest) ORDER BY et_date ASC LIMIT 20
)
)
SELECT formatDateTime((SELECT et_date FROM biggest), '%Y-%m-%d') AS event_date,
round((SELECT day_shares FROM biggest) / 1e6, 1) AS event_day_shares_m,
round((SELECT adv FROM before) / 1e6, 1) AS adv_20_before_m,
round((SELECT shock_ratio FROM biggest), 1) AS event_vs_prior_adv_x,
round((SELECT adv FROM after) / 1e6, 1) AS adv_20_after_m,
round(100 * ((SELECT adv FROM after) / (SELECT adv FROM before) - 1), 0) AS adv_shift_pctFor 2026-03-19, MU print 64.7M shares against prior ADV of 28.7M — na 2.3x im own baseline. Over di next 20 sessions, di trailing ADV average na 45M: na 57% jump for di denominator. Every number wey dem derive from ADV move wit am — relative volume readings shrink (di baseline grow) and days to cover shrink (di denominator grow), wit zero change wey need to happen for anybody actual position. For MU own case, di heavy tape continue — di shock show say na re-rating, no be one-day event — but di mechanics na di same tin anyhow: after one heavy stretch, ADV dey measure di event instead of di stock im habits for exactly one window-length.
Wetin count as liquid, wey dem measure
"Millions of dollars per day" na di usual gist wey dem dey use talk say something fit trade well-well. Na dis one be di real distribution — every US-listed symbol wey get at least 15 out of di same 20 sessions, dem rank am by dollar ADV:
The exact SQL behind every number
WITH per_ticker AS (
SELECT ticker, avg(day_dollars) AS adv_dollars
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sumIf(toFloat64(close) * toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') >= '09:30'
AND formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '16:00') AS day_dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= toDateTime('2026-06-11 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
AND match(ticker, '^[A-Z]+$')
GROUP BY ticker, et_date
)
GROUP BY ticker
HAVING count() >= 15
)
SELECT count() AS names,
round(quantileDeterministic(0.25)(adv_dollars, cityHash64(ticker)) / 1e6, 2) AS p25_m,
round(quantileDeterministic(0.50)(adv_dollars, cityHash64(ticker)) / 1e6, 1) AS median_m,
round(quantileDeterministic(0.75)(adv_dollars, cityHash64(ticker)) / 1e6, 1) AS p75_m,
round(quantileDeterministic(0.90)(adv_dollars, cityHash64(ticker)) / 1e6, 1) AS p90_m,
round(quantileDeterministic(0.99)(adv_dollars, cityHash64(ticker)) / 1e6, 0) AS p99_m,
countIf(adv_dollars >= 1e6) AS names_above_1m,
countIf(adv_dollars >= 10e6) AS names_above_10m,
countIf(adv_dollars >= 100e6) AS names_above_100m,
countIf(adv_dollars >= 1e9) AS names_above_1bn
FROM per_tickerAcross 10864 symbols, di median name dey turn over $2.2M per day — half of di US market dey trade less pass dat. One quarter of am dey trade under $0.33M. Di 75th percentile dey for $20.4M, di 90th dey for $113.7M, di 99th dey for $1333M. If you count am against round thresholds: 6515 names clear $1M per day, 3535 clear $10M, 1166 clear $100M — and na only 130 clear $1B. Di names wey financial coverage dey revolve around almost entirely dey inside dat last group; di median listed stock na different instrument altogether.
Where ADV dey silently decide oda numbers
- Days to cover = short interest ÷ ADV. One volume spike go shrink di ratio even if short position no change at all — na di denominator do am.
- Relative volume = today pace ÷ ADV. Same number, opposite work: here ADV na di baseline wey dem dey beat.
- Liquidity screens ("only names above 1M ADV") — every backtest and screener dey carry one, and survivorship dey follow quietly: names enter such screens by having their most dramatic weeks.
- Position sizing — di institutional habit of trading only small percent of ADV per day na why big funds simply no fit own certain small stocks: dem go need weeks of di whole tape volume just to build or exit one position.
Di days-to-cover case worth seeing with real numbers, since even di "official" figure dey embed somebody ADV choice. FINRA dey publish days to cover next to im own volume denominator (every venue, im own reporting window, floored at 1.0 — see how dat data arrive); recompute di same ratio with dis page 20-session regular-hours ADV and di answer change:
The exact SQL behind every number
WITH our_adv AS (
SELECT ticker, avg(day_shares) AS adv
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sumIf(toFloat64(volume), formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') >= '09:30'
AND formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') < '16:00') AS day_shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'KO')
AND window_start >= toDateTime('2026-06-11 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
GROUP BY ticker, et_date
)
GROUP BY ticker
),
si AS (
SELECT ticker,
max(short_interest) AS short_interest,
max(avg_daily_volume) AS finra_adv,
max(days_to_cover) AS finra_dtc
FROM global_markets.stocks_short_interest
WHERE settlement_date = '2026-06-30' AND ticker IN ('MU', 'KO')
GROUP BY ticker
)
SELECT si.ticker AS ticker,
round(si.short_interest / 1e6, 1) AS shares_short_m,
round(si.finra_adv / 1e6, 1) AS finra_adv_m,
round(si.finra_dtc, 2) AS finra_days_to_cover,
round(our_adv.adv / 1e6, 1) AS rth_adv_20_session_m,
round(si.short_interest / our_adv.adv, 2) AS days_to_cover_recomputed
FROM si
INNER JOIN our_adv ON si.ticker = our_adv.ticker
ORDER BY tickerSame short interest, two denominators. For KO, FINRA report 2.06 days on im 24.1M-share volume figure; against dis page 12.4M regular-hours ADV, di same 49.6M-share short position work out to 4 days — nearly double. For MU, di published number sit at di reported floor of 1; recomputed, e be 0.75 days. No figure wrong — dem just dey answer with different denominators. Di lesson dey general: any ratio wey get ADV underneath dey quietly quote somebody window and choice.
ADV dey work for options?
Options traders dey use di same idea but with one twist: dem dey count volume in contracts, and each standard equity contract dey control 100 shares. Di same 20 sessions, four option tapes, with di contract count wey dem convert to share-equivalent exposure:
The exact SQL behind every number
WITH daily AS (
SELECT multiIf(ticker LIKE 'O:SPY2%', 'SPY', ticker LIKE 'O:AAPL2%', 'AAPL', ticker LIKE 'O:MU2%', 'MU', 'KO') AS underlying,
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
sum(toFloat64(volume)) AS contracts
FROM global_markets.options_minute_aggs
WHERE (ticker LIKE 'O:SPY2%' OR ticker LIKE 'O:AAPL2%' OR ticker LIKE 'O:MU2%' OR ticker LIKE 'O:KO2%')
AND window_start >= toDateTime('2026-06-11 00:00:00', 'America/New_York')
AND window_start < toDateTime('2026-07-11 00:00:00', 'America/New_York')
GROUP BY underlying, et_date
)
SELECT underlying,
round(avg(contracts) / 1e3, 1) AS avg_daily_contracts_k,
round(avg(contracts) * 100 / 1e6, 1) AS share_equivalent_m,
count() AS sessions
FROM daily
GROUP BY underlying
ORDER BY avg_daily_contracts_k DESCDi scale differences big pass anytin for di stock table. SPY im options tape average na 12543.2 thousand contracts per day — 1254.3M shares of equivalent exposure, wey be big multiple of SPY own 46.01M share ADV. KO dey run di oda way: 64.6 thousand contracts (6.5M share-equivalent), wey dey below im 12.4M share ADV. Options liquidity dey concentrate for small set of underlyings, and e dey thin out more across strikes and expirations — one aggregate figure like dis dey overstate wetin any single contract dey trade, so per-contract volume and open interest still need checking before you size one options order.
How to read ADV like person wey sabi
Three habits dey close the gap between knowing wetin ADV mean and using am well. Put share ADV and dollar ADV side by side — the first table show two names wey almost tie for shares but dey far apart for money, and na the money column be wetin order really care about. No trust ADV immediately after events — the shock panel put number for am: one heavy stretch move the denominator 57% inside one month, e mechanically deflate relative volume and days to cover until the spike don old pass the window. Check ADV against the calendar — expiration Fridays, rebalance days, and index-change dates dey inflate everybody volume at once (witching days pass all), so one market-wide heavy day no dey tell any single name own story.
FAQ for average daily volume
Wetin be good average daily volume?
Wen dem measure across 10864 US symbols for 20 sessions, di median dollar ADV na $2.2M; 3535 names clear $10M for one day and only 130 clear $1B. For retail-size orders, di useful floor na dollars, no be shares — names wey dey di $10M-plus group dey trade without small order wey go move di price.
How you dey calculate average daily volume?
Add di daily share volumes over di window wey you choose and divide am by di number of days. KO five sessions of July 6–10, 2026 sum reach 52.8M shares; divide am by five, di ADV na 10.6M. 20-day ADV na di same arithmetic over 20 sessions.
Which window dem dey use measure ADV?
Di one wey common pass na 20 trading sessions (wey be like one month), but 10-, 30-, 65- and 90-day versions all dey circulate — and dem dey genuinely disagree after any volume shock. For 2026-04-14, MU 20-session ADV read 45.6M while im 90-session ADV read 31.9M for di same day. Check di window before you compare sources.
ADV dey include premarket and after-hours volume?
E depend on di source — di figures for dis page na regular-hours only. Wen dem measure am over di same 20 sessions, extended sessions carry 18.3% of SPY total volume, 6.9% of AAPL own, and 0.2% of thin CATO own — di extended-hours guide break di sessions down.
ADV na shares or dollars?
Traditionally na shares, but dollar ADV na di better liquidity measure across stocks. Over di same 20 sessions, MU and AAPL trade 42.01M and 41.47M shares for one day — nearly tie — while dia dollar ADVs na $44.49B and $12.24B. Same share count, very different oceans.
Every figure na stored, versioned query — expand di SQL under any panel, or compute any window for any ticker for di Strasmore terminal.