Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-08-02

Average Daily Volume (ADV) Na Wetin?

Average daily volume na the normal shares wey stock dey trade each day. E dey inside days to cover, relative volume, and liquidity screens.

Average daily volume, ADV, na number wey people use pass but dem hardly ever define am: na the normal number of shares wey stock dey trade each day, averaged across one trailing window. Na the denominator inside days to cover, the baseline inside relative volume, and the liquidity test inside every screener. So, all those numbers carry ADV’s hidden choices: which window, which sessions, shares or dollars. This page define am properly, show the arithmetic step by step, and measure how each choice behave for real market trades.

Average daily volume, wey dem measure

Twenty regular-hours sessions, June 11 reach July 10, 2026, four familiar names plus one wey dey deliberately thin. Shares, dollars, and, for later, the part of each name total volume wey trades outside regular hours:

Query20-session regular-hours ADV: shares, dollars, and the extended-hours share (June 11 – July 10, 2026)
tickerADV shares mADV dollars bnExtended hours %Sessions
SPY46.0134.1918.320
MU42.0144.4912.120
AAPL41.4712.246.920
KO12.41.016.620
CATO0.0500.220
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 DESC
Run am yourself

The table carry the whole argument for this page. MU and AAPL dey trade almost the same number of shares every day, 42.01M against 41.47M, but the dollar column separate dem well: $44.49B against $12.24B per day. Shares measure activity; dollars measure money. The ranking even turn upside down for the top: SPY lead for shares (46.01M across 20 sessions), while MU lead this table for dollars. And for the bottom, CATO dey trade 0.05 million shares per day, so the money small reach the point where the billions column show 0 at this scale. Na this kind tape wey one institutional order fit become the whole volume for the day, and where trading costs dey another universe.

How to calculate average daily volume

The calculation simple: add all the daily share volumes for the period wey you choose, then divide am by the number of days. One full week of Coca-Cola regular-hours tape (July 6–10, 2026), with the running total and average calculated inside the same query:

QueryADV by hand: KO's five daily volumes, their sum, and the average (July 6–10, 2026)
Session dateShares mFive-day total mADV m1% of ADV k
2026-07-0610.752.810.6106
2026-07-0712.152.810.6106
2026-07-0810.752.810.6106
2026-07-091152.810.6106
2026-07-108.352.810.6106
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_date
Run am yourself

Add the five days, 10.7 + 12.1 + 10.7 + 11 + 8.3 million shares, and the total na 52.8M. Divide am by five: 10.6M shares, KO 5-session ADV. A 20-session ADV na the same calculation over 20 rows, and na that number dey inside the first table. See wetin the average dey hide: 2026-07-07 printed 12.1M and 2026-07-10 printed 8.3M, day-to-day movements wey ADV dey smooth into one figure. The last column dey show position sizing: one percent of KO ADV na about 106 thousand shares, the level wey one order fit start to represent noticeable part of the day's tape.

The window na choice, and e dey decide how fast ADV dey forget

Twenty sessions na the common convention (one trading month); ten, thirty, sixty-five, and ninety sef dey circulate. The window dey decide how fast ADV dey forget. MU na 2026 live example, a name wey tape re-rated hard for the middle of the year, so its trailing-month ADV and trailing-quarter ADV spend the spring dey tell different stories, with receipts throughout its June deep-dive. Na the same stock for the same seven months be this, measured with both windows at the same time:

QueryMU: rolling 20-session vs 90-session ADV, December 2025 through July 10, 2026 (sampled every third session)
49 rows (showing 20)
DateADV 20-session mADV 90-session m
2025-12-1021.319.9
2025-12-1520.320.1
2025-12-1820.720.2
2025-12-232020.7
2025-12-2920.720.8
2026-01-0222.221.3
2026-01-0724.522
2026-01-122622.5
2026-01-1526.222.5
2026-01-2126.923
2026-01-2628.523.4
2026-01-2930.523.7
2026-02-0331.923.9
2026-02-0632.624.4
2026-02-1134.124.7
2026-02-173524.9
2026-02-2032.525
2026-02-253225.4
2026-03-0230.225.4
2026-03-0528.425.8
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_date
Run am yourself

For 2025-12-10, the two windows agree: 21.3M for the 20-session count, 19.9M for the 90. By 2026-04-14, dem don split to 45.6M against 31.9M, two “official” ADVs for one stock on one day. Every screener, days-to-cover figure, or relative-volume reading wey use one window disagree with the same tool wey use the other. By 2026-07-10, the two don converge again (42M vs 41.9M): the re-rated volume level don age enter the long window too. When two sources disagree about a stock’s ADV, na the window be the first suspect; whether extended-hours volume dey included na the second.

Wetin dey happen to ADV immediately after volume shock

The chart above dey hint am; na here dem measure am. Take MU volume shock wey strong pass for 2026, the session wey pass its own trailing 20-session ADV by the biggest margin, then compare the ADV wey screener show before that day with the one wey e show one month later:

QueryMU's sharpest 2026 volume shock: the event day vs the trailing ADV before and after
Event dateEvent-day shares mADV 20 before mEvent vs prior ADV xADV 20 after mADV shift %
2026-03-1964.728.72.34557
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_pct
Run am yourself

For 2026-03-19, MU print 64.7M shares against previous ADV of 28.7M, wey be 2.3x its own baseline. For the next 20 sessions, trailing ADV average 45M: e mean say the denominator jump 57%. Every number wey come from ADV move together with am. relative volume readings reduce because the baseline grow, and days to cover reduce because the denominator grow. Nobody need change their actual position. For MU, the higher trading activity continue. The shock show re-rating, no be one-day event. But the mechanics remain the same either way: after one period of heavy trading, ADV measure the event instead of the stock’s normal trading pattern for exactly one window-length.

Wetin dey count as liquid, measured

“Millions of dollars every day” na the usual rough way people dey talk about how easy e be to trade. Here na the real distribution: every US-listed symbol wey get at least 15 out of the same 20 sessions, ranked by dollar ADV:

QueryDollar ADV across the whole US tape: percentiles and threshold counts (June 11 – July 10, 2026)
NamesP25 mMedian mP75 mP90 mP99 mNames wey pass 1mNames wey pass 10mNames wey pass 100mnames wey pass 1bn
108640.332.220.4113.71333651535351166130
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_ticker
Run am yourself

Across 10864 symbols, the median name dey turn over $2.2M every day. Half of the US market dey trade below that level. One quarter dey trade below $0.33M. The 75th percentile dey at $20.4M, the 90th at $113.7M, and the 99th at $1333M. Against round thresholds, 6515 names clear $1M every day, 3535 clear $10M, 1166 clear $100M, and only 130 clear $1B. The names wey financial coverage dey focus on dey almost entirely inside that last group. The median listed stock na completely different instrument.

Where ADV dey quietly decide other numbers

  • Days to cover = short interest ÷ ADV. Volume spike fit reduce the ratio even when short position no change. Na the denominator cause am.
  • Relative volume = today's pace ÷ ADV. Na the same number, but e get opposite role here: ADV na the baseline wey today's pace dey beat.
  • Liquidity screens ("only names above 1M ADV"), every backtest and screener get one. Survivorship bias dey follow quietly too: names enter these screens when dem get their most dramatic weeks.
  • Position sizing, the institutional habit of trading only a few percent of ADV per day, na why big funds simply no fit own some small stocks: dem go need weeks of the whole tape's volume to build or exit one position.

The days-to-cover case worth seeing with real numbers, because even the "official" figure still include somebody's ADV choice. FINRA publishes days to cover beside its own volume denominator. E cover every venue and its own reporting window, with floor at 1.0. See how that data arrives. If you calculate the same ratio again with this page's 20-session regular-hours ADV, the answer go change:

QueryDays to cover, recomputed: FINRA's denominator vs this page's 20-session regular-hours ADV (settlement June 30, 2026)
tickershares short mfinra adv mfinra days to coverrth adv 20 session mdays to cover wey dem recalculate
KO49.624.12.0612.44
MU31.760.31420.75
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 ticker
Run am yourself

Na the same short interest, but two denominators. For KO, FINRA reports 2.06 days based on its 24.1M-share volume figure. Against this page's 12.4M regular-hours ADV, the same 49.6M-share short position comes to 4 days, almost double. For MU, the published number dey at the reported floor of 1. When recalculated, e becomes 0.75 days. Neither figure wrong. Dem just answer with different denominators. The lesson apply generally: any ratio wey get ADV underneath dey quietly quote somebody's window and session choices.

ADV dey work for options?

Options traders still dey use the same concept, but one thing change: dem dey count volume for contracts, and each standard equity contract dey control 100 shares. Na the same 20 sessions, four option tapes, with the contract count convert to share-equivalent exposure:

QueryOptions ADV: average daily contracts and share-equivalent exposure (June 11 – July 10, 2026)
underlyingavg daily contracts kshare equivalent mSessions
SPY12543.21254.320
AAPL1265.1126.520
MU804.780.520
KO64.66.520
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 DESC
Run am yourself

The difference for scale pass anything wey dey the stock table by far. SPY's options tape average 12543.2 thousand contracts every day, equal to 1254.3M shares of exposure, plenty pass SPY own 46.01M share ADV. KO dey go the other way: 64.6 thousand contracts (6.5M share-equivalent), below its 12.4M share ADV. Options liquidity dey gather for small number of underlyings, and e dey thin out more across strikes and expirations. So, aggregate figure like this fit overstate how much any single contract dey trade. You still need check volume and open interest for each contract before you size an options order.

ADV dey read like market practitioner

Three habits fit close the gap between knowing the definition and knowing how to use am. Always pair share ADV with dollar ADV. The first table show two names wey nearly match for shares but far apart for money. Na the money column order really dey care about. No trust ADV immediately after events. The shock panel put number on am: one heavy trading stretch move the denominator 57% within one month. This mechanically reduce relative volume and days to cover until the spike comot from the measurement window. Check ADV against the calendar. Expiration Fridays, rebalance days, and index-change dates dey increase everybody volume at once. Witching days dey do am pass. So, one heavy market-wide day no tell you anything about the story for any single name.

ADV FAQ

Good average daily volume (ADV) na wetin?

Across 10864 US symbols for 20 sessions, median dollar ADV na $2.2M; 3535 names trade $10M every day, but na only 130 clear $1B. For retail-size orders, dollars matter pass shares. Names wey dey the $10M-plus group fit trade without small order shifting the price.

How dem dey calculate average daily volume?

Add the daily share volumes for the window wey you choose, then divide by the number of days. KO's five sessions from July 6–10, 2026 total 52.8M shares. Divide am by five, and ADV na 10.6M. 20-day ADV na the same calculation across 20 sessions.

Which window dem dey use to measure ADV?

Most times, na 20 trading sessions, wey be about one month. But 10-, 30-, 65- and 90-day versions dey too, and dem fit show different results after any volume shock. On 2026-04-14, MU's 20-session ADV read 45.6M, while its 90-session ADV read 31.9M that same day. Check the window before you compare sources.

ADV include premarket and after-hours volume?

E depend on the source. The figures for this page na regular-hours only. Across the same 20 sessions, extended sessions carry 18.3% of SPY's total volume, 6.9% of AAPL's, and 0.2% of thin CATO's. the extended-hours guide explain how the sessions break down.

ADV na shares or dollars?

Traditionally, na shares. But dollar ADV dey measure liquidity better across stocks. Across the same 20 sessions, MU and AAPL trade 42.01M and 41.47M shares per day, almost equal. But their dollar ADVs na $44.49B and $12.24B. Same number of shares, but the liquidity fit differ well well.


Every figure na stored, versioned query. Expand the SQL under any panel, or calculate any window for any ticker on the Strasmore terminal.