What Is VWAP? Volume-Weighted Average Price Explained
Learn what VWAP means, how volume-weighted average price is calculated, and how it differs from a moving average - measured bar by bar from real trades.
VWAP stands for volume-weighted average price: the average price actually paid per share over a trading session, computed as total dollars traded divided by total shares traded, restarting fresh each day. Minutes with heavy trading count for more than quiet ones, which makes VWAP the standard answer to "where did this stock really change hands today?" Every figure on this page comes from a stored, inspectable query over real minute bars and individual trades.
What does VWAP mean in stocks?
A stock's chart shows a price for every minute, but those prices are not equally important: one minute might see hundreds of thousands of shares change hands, another a small fraction of that. A simple average of the minute prices treats both the same. VWAP weights every price by the shares traded at it, so the average lands where the real trading happened.
Put differently, VWAP is the average per share, not the average per minute. If you could line up every share that traded today and ask each one what it went for, VWAP is the mean of those answers.
Two properties follow from the definition: VWAP is per stock — Apple's says nothing about Microsoft's — and per session, with the running totals starting again from zero at the next open.
How is VWAP calculated?
The formula is short: multiply each trade's price by its size in shares, add those up, and divide by total shares traded.
A tiny hypothetical: suppose a stock trades exactly twice today — 100 shares at $10.00, then 900 shares at $11.00. The simple average of the two prices is $10.50. But 900 of the 1,000 shares changed hands at $11.00, and the average dollar paid per share works out to (100 × $10.00 + 900 × $11.00) ÷ 1,000 = $10.90. That $10.90 is the VWAP — pulled toward $11 by the size of the second trade.
In practice nobody adds up millions of trades by hand; the standard shortcut uses one-minute bars — each minute's price times its volume, summed and divided by total volume. Two convention notes. First, every figure on this page uses regular-session minute bars only, from the 9:30 a.m. open through the final bar at 3:59 p.m. ET — the 4:00 p.m. closing auction prints just after that bar and sits outside these figures, while the full-day benchmark VWAPs institutions grade executions against generally include it. Second, many charting platforms start their day-VWAP at the 4:00 a.m. premarket instead. Each convention gives a different number for the same stock on the same day.
VWAP on a real trading day
Now the real thing: Apple on July 2, 2026 — a verified full session (390 one-minute bars in our data) and the last complete trading day before the Independence Day closure on the market holiday schedule. The chart samples price and running VWAP every five minutes.
The exact SQL behind every number
SELECT et_time, price, running_vwap
FROM (
SELECT window_start,
formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_time,
round(close, 2) AS price,
round(sum(close * volume) OVER (ORDER BY window_start)
/ sum(volume) OVER (ORDER BY window_start), 2) AS running_vwap
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
AND window_start >= toDateTime('2026-07-02 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-07-02 16:00:00', 'America/New_York')
)
WHERE toMinute(window_start) % 5 = 4
ORDER BY window_startAt 09:34 ET, the first sampled bar, price ($298.2) and running VWAP ($298.09) sit nearly on top of each other — only a few minutes of volume have accumulated. By the final bar the price stood at $308.22 while the running VWAP settled at $305.99: the session VWAP. The VWAP line steadies as the day ages — by afternoon it carries hours of accumulated volume, and no single minute can move it far.
One more number shows the weighting: the first half hour alone carried 14.9% of the session's volume, roughly double its share of the 390-minute session clock — and those early, heavy bars printed at prices below where the afternoon traded. Volume bunches at the open and again as the 4:00 p.m. closing auction approaches — the same U-shaped intraday pattern that relative volume readings have to adjust for — and VWAP hands the busy stretches it covers the extra weight their share count earns.
VWAP vs. a moving average
A moving average also smooths price, and the two are often confused. The differences are mechanical:
- A simple moving average takes the last N closing prices and gives each one an equal vote, volume ignored. It slides: a 20-minute moving average at 2:00 p.m. covers 1:40 to 2:00 and nothing else.
- VWAP accumulates from the opening bell, weights every bar by shares traded, and resets at the next open. It answers a different question — not "what has the price been doing lately?" but "what has the average buyer paid today?"
The gap between weighted and unweighted is the whole lesson, and one row of data shows it:
The exact SQL behind every number
SELECT formatDateTime(toDate(toTimeZone(min(window_start), 'America/New_York')), '%Y-%m-%d') AS session_date,
count() AS minute_bars,
round(sum(close * volume) / sum(volume), 2) AS session_vwap,
round(avg(close), 2) AS unweighted_avg_price,
round(argMax(close, window_start), 2) AS final_minute_price,
round((avg(close) - sum(close * volume) / sum(volume)) * 100) AS avg_premium_cents,
round(toFloat64(sum(volume)) / 1e6) AS total_volume_millions,
round(sumIf(toFloat64(volume), window_start < toDateTime('2026-07-02 10:00:00', 'America/New_York'))
/ toFloat64(sum(volume)) * 100, 1) AS first_30min_volume_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
AND window_start >= toDateTime('2026-07-02 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-07-02 16:00:00', 'America/New_York')Averaging Apple's 390 minute closes with equal weight gives $306.54. Weighting the same closes by each minute's volume gives $305.99 — 55 cents lower. Same day, same bars, same 60 million shares; the only change is counting shares instead of minutes. The sign matters: an equal-weight average sitting above the VWAP means the heavy-volume minutes traded below the day's typical price. The final minute bar of the session printed $308.22 — the official close lands moments later, in the closing auction.
How accurate is VWAP from minute bars?
VWAP is defined over trades, and minute bars are an approximation — what does the shortcut cost? Most explainers never check. Here is the same session's VWAP computed the long way, from every individual trade print on the consolidated tape, next to the minute-bar version. (Official and vendor VWAPs also drop a handful of condition-coded prints, such as average-price trades, so platforms can differ by a hair.)
The exact SQL behind every number
WITH every_trade AS (
SELECT round(sum(price * size) / sum(size), 4) AS trade_vwap,
round(count() / 1e6, 1) AS trades_millions
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-07-02 09:30:00', 'America/New_York')
AND sip_timestamp < toDateTime('2026-07-02 16:00:00', 'America/New_York')
),
minute_bars AS (
SELECT round(sum(close * volume) / sum(volume), 4) AS bar_vwap
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
AND window_start >= toDateTime('2026-07-02 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-07-02 16:00:00', 'America/New_York')
)
SELECT every_trade.trade_vwap AS trade_level_vwap,
minute_bars.bar_vwap AS minute_bar_vwap,
round(abs(every_trade.trade_vwap - minute_bars.bar_vwap) * 100, 1) AS gap_cents,
round(abs(every_trade.trade_vwap - minute_bars.bar_vwap) / every_trade.trade_vwap * 10000, 1) AS gap_bps,
every_trade.trades_millions
FROM every_trade, minute_barsAcross 1.1 million individual trades, the trade-level VWAP was $305.9162; the minute-bar shortcut gave $305.9908. The two land 7.5 cents apart — 2.4 basis points (hundredths of a percent) of the share price. For a session reference line on this day, the minute-bar shortcut stayed within a dime of the trade-by-trade figure.
Is VWAP the same for every stock?
There is no market-wide VWAP; every stock gets its own each session. Here is the same July 2 session across five household names, each with a verified full 390-bar session:
The exact SQL behind every number
SELECT ticker,
round(sum(close * volume) / sum(volume), 2) AS session_vwap,
round(argMax(close, window_start), 2) AS final_minute_price,
round((argMax(close, window_start) - sum(close * volume) / sum(volume))
/ (sum(close * volume) / sum(volume)) * 100, 2) AS final_vs_vwap_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND window_start >= toDateTime('2026-07-02 09:30:00', 'America/New_York')
AND window_start < toDateTime('2026-07-02 16:00:00', 'America/New_York')
GROUP BY ticker
HAVING count() = 390
ORDER BY indexOf(['AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO'], ticker)Coca-Cola's session VWAP printed $82.96; Tesla's printed $399.64. The final-minute finishes split too: Apple ended 0.73% above its VWAP and Coca-Cola 1.23% above, Microsoft ended almost exactly on its own (0.07%), while Nvidia and Tesla ended below theirs (-0.32% and -1.71%). Five stocks, one day, five different answers.
Who uses VWAP, and for what?
Institutions grading executions. A fund buying a large position cannot fill at one price; it gets an average. The day's VWAP is the yardstick: a buy order filled below VWAP paid less than that day's average dollar. Execution desks report slippage versus VWAP the way students report grades — typically against a full-day benchmark that includes the closing auction print.
Execution algorithms. Brokers offer VWAP algos — programs that slice one large parent order into hundreds of small child orders across the session, sized to the day's typical volume pattern, aiming to fill near the benchmark rather than push the price. Each child order still pays the bid-ask spread, and the counterparty on many of those fills is a market maker quoting both sides.
Day traders, as a session reference. Intraday traders keep the VWAP indicator on the chart as the day's average-cost line: price above VWAP means recent buyers paid more than the session's average; price below, less. An observation about where trading has already happened — not a prediction of where price goes next.
Anchored VWAP, a common variant: identical arithmetic, different starting point — the accumulation starts at a bar the trader picks (an earnings release, an IPO day, a notable high or low) instead of the open.
FAQ
Is VWAP a moving average?
No. A moving average slides a fixed lookback window and gives every bar an equal vote regardless of volume. VWAP starts at the session open, weights each bar by shares traded, and resets every day. On July 2, 2026, an equal-weight average of Apple's minute closes sat 55 cents above its VWAP on identical bars.
Does VWAP include premarket and after-hours trading?
It depends on the platform. This page uses regular-session minute bars only, through the final bar at 3:59 p.m. ET — the 4:00 p.m. closing cross prints after that bar, and full-day benchmark VWAPs generally include it. Many charting apps accumulate from the 4:00 a.m. premarket instead; check the platform's setting before comparing numbers.
What does it mean when a stock trades above VWAP?
It means the current price is higher than the average price paid per share so far that session. On July 2, 2026, Apple ended the final minute of the regular session 0.73% above its session VWAP while Tesla ended below its own. The comparison describes the session's trading; it does not forecast the next move.
What is anchored VWAP?
The same calculation started from a chosen bar instead of the session open — an earnings report, an IPO, a swing high or low. The line tracks the average price paid by everyone who has traded since that event.
Every panel above ships with the exact SQL that produced it — expand any panel to audit the numbers. To compute VWAP for any ticker and session, ask the question in plain English on the Strasmore terminal.