Strasmore Research
學習 Matt Connor作者: Matt Connor · 更新於 2026-08-08

Anchored VWAP 公式與用途怎麼看

了解 Anchored VWAP 如何從指定 K 棒開始累計、為何不會重設,以及用 Python 直觀呈現公式與改變錨定點對結果的影響。

Anchored VWAP 是一種成交量加權平均價格,從使用者選定的某一根 K 棒開始累計,且不會重設。Session VWAP 則在每次開盤時重新開始,因此只能回答今天股票平均以什麼價格成交。Anchored VWAP 回答的是另一個問題:自你選定的起點以來,股票平均以什麼價格成交。

什麼是 anchored VWAP?

兩者使用完全相同的計算方式。從起點開始,將每根 K 棒的價格乘以該根 K 棒的成交量,並持續累計。同時,另行累計成交量。再以前者除以後者。具體而言,第 n 根 K 棒的 anchored VWAP,是從錨定 K 棒到第 n 根 K 棒的價格乘以成交量總和,除以同一期間的成交量總和。

K 棒價格通常採用典型價格,也就是最高價、最低價與收盤價的平均值;若資料源提供該根 K 棒的 VWAP,則通常直接採用該 VWAP。

兩個累計值都不會刪除任何資料。50日移動平均線每增加一筆新觀測值,就會移除最舊的觀測值,因此價格線可以轉向。Anchored VWAP 只會持續增加,過去資料會永久保留。Session VWAP 則是在每次開盤時將兩個累計值歸零。換言之,它是錨定點設在開盤鐘聲的 anchored VWAP。

VWAP 與 anchored VWAP 有什麼差異?

下圖以 Apple 的單季日線 K 棒,同時計算兩者。session_vwap 欄是每個單一交易時段內的成交量加權平均價格,每天都會重新計算。anchored_vwap 欄則從觀察區間的第一個交易時段開始,並持續累計。

查詢每日交易時段 VWAP 與錨定於單一日期的 VWAP 比較(AAPL)
每個數據背後的精確 SQL 語法
SELECT
    toString(date)                AS session_date,
    formatDateTime(date, '%b %e') AS bar_label,
    round(toFloat64(vwap), 2)     AS session_vwap,
    round(
        sum(toFloat64(vwap) * toFloat64(volume)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
      / sum(toFloat64(volume))                   OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    , 2)                          AS anchored_vwap
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
  AND date >= '2026-04-01'
  AND date <= '2026-06-30'
ORDER BY date
Run this yourself

62 個交易時段中,期間從 Apr 1Jun 30,日線序列會隨盤勢移動,anchored 序列則緩慢彎曲。第一天只有一個交易時段,因此該日的歷史資料也只有這一個交易時段,anchored 線從 255.02 開始;到觀察區間結束時,則來到 286.86,而最後一個交易時段的 VWAP 為 288.09。這個形狀就是重點。Anchored 線起初緊跟每日 VWAP,之後隨著累計成交量增加而逐漸變平。

人們通常把錨定點設在哪裡?

常見錨定點包括財報發布、跳空缺口的第一根 K 棒、52週低點,或新上市股票的第一筆成交。這些錨定方式背後的主張都相同:自該時點後進行交易的所有人,平均成交價格就是 anchored VWAP。因此,當價格高於該線時,代表平均持倉者處於帳面獲利。

但通常未被明說的是,錨定點是一項判斷,而答案會隨錨定點改變。下圖將同一檔股票分別錨定在最近12個月的月初,並計算從各月開始到同一個固定終點的平均成交價格。

查詢同一股票與相同最新價格,十二個不同錨定點(AAPL)
每個數據背後的精確 SQL 語法
WITH
    monthly AS (
        SELECT
            toStartOfMonth(date)                     AS m,
            sum(toFloat64(vwap) * toFloat64(volume)) AS pv,
            sum(toFloat64(volume))                   AS vol
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'AAPL'
          AND date >= '2025-07-01'
          AND date <= '2026-06-30'
        GROUP BY m
    ),
    anchored AS (
        SELECT
            m,
            sum(pv)  OVER (ORDER BY m ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
          / sum(vol) OVER (ORDER BY m ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS avwap
        FROM monthly
    ),
    final_close AS (
        SELECT toFloat64(argMax(close, date)) AS last_close
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'AAPL'
          AND date >= '2026-06-01'
          AND date <= '2026-06-30'
    )
SELECT
    formatDateTime(a.m, '%b %Y')                 AS anchor_from,
    round(a.avwap, 2)                            AS anchored_vwap,
    round(100 * (f.last_close / a.avwap - 1), 2) AS close_vs_avwap_pct
FROM anchored AS a
CROSS JOIN final_close AS f
ORDER BY a.m
Run this yourself

將錨定點設在 Jul 2025 時,平均成交價格為 259.52;觀察區間最後一個收盤價相對於該價格為 11.5%。當收盤價高於該線時,這個數值為正。將錨定點設在 Jun 2026 時,結果則為 294.07-1.6%。同一檔股票、相同的最後價格,卻因錨定點不同,對於自該點持有的投資人是否獲利,得到12種不同結論。計算公式本身不會替你選擇錨定點。事後選定的錨定點可以不斷調整,直到支持圖表想表達的觀點。因此,你閱讀任何 anchored VWAP 圖表時,圖說都應標明錨定日期。

如何使用 Python 計算 anchored VWAP?

兩個序列都能透過一次遍歷 K 棒計算出來。以下程式使用標準函式庫 Python 3,不需要套件或網路連線。程式讀取30根 K 棒,並將 Session 序列列在 anchored 序列旁邊,接著回報價格第一次重新穿越 anchored 線的 K 棒。這些 K 棒是為示範而虛構。將同一個迴圈套用到實際 K 棒後,計算方式不變。

"""Session VWAP and anchored VWAP from the same running totals. Standard library only."""
import csv
import io

# Illustrative bars, not market data: three sessions of ten 30 minute bars.
BARS = """bar,price,volume
2026-03-02 09:30,100.40,240000
2026-03-02 10:00,100.90,180000
2026-03-02 10:30,101.30,150000
2026-03-02 11:00,101.10,130000
2026-03-02 11:30,100.60,120000
2026-03-02 12:00,100.20,110000
2026-03-02 12:30,99.80,120000
2026-03-02 13:00,99.50,140000
2026-03-02 13:30,99.70,170000
2026-03-02 14:00,99.40,260000
2026-03-03 09:30,99.10,300000
2026-03-03 10:00,98.70,210000
2026-03-03 10:30,98.90,160000
2026-03-03 11:00,98.40,150000
2026-03-03 11:30,98.10,140000
2026-03-03 12:00,98.30,120000
2026-03-03 12:30,98.80,130000
2026-03-03 13:00,99.20,150000
2026-03-03 13:30,99.60,190000
2026-03-03 14:00,99.90,280000
2026-03-04 09:30,100.20,320000
2026-03-04 10:00,100.60,230000
2026-03-04 10:30,100.90,170000
2026-03-04 11:00,101.40,160000
2026-03-04 11:30,101.20,140000
2026-03-04 12:00,101.60,130000
2026-03-04 12:30,102.10,140000
2026-03-04 13:00,102.40,160000
2026-03-04 13:30,102.20,200000
2026-03-04 14:00,102.60,290000
"""

ANCHOR = "2026-03-02 10:30"   # the bar the anchored series starts on

session_pv = session_vol = 0.0
anchor_pv = anchor_vol = 0.0
current_day = None
anchored = False
start_side = None
crossover = None

print(f"{'bar':<18}{'price':>8}{'session':>10}{'anchored':>10}")

for row in csv.DictReader(io.StringIO(BARS)):
    stamp = row["bar"]
    day, price, vol = stamp[:10], float(row["price"]), float(row["volume"])

    if day != current_day:                  # the session totals reset at every open
        session_pv = session_vol = 0.0
        current_day = day
    session_pv += price * vol
    session_vol += vol
    session_vwap = session_pv / session_vol

    anchored = anchored or stamp == ANCHOR
    if not anchored:
        print(f"{stamp:<18}{price:>8.2f}{session_vwap:>10.2f}{'.':>10}")
        continue

    anchor_pv += price * vol                # the anchored totals never reset
    anchor_vol += vol
    anchored_vwap = anchor_pv / anchor_vol
    print(f"{stamp:<18}{price:>8.2f}{session_vwap:>10.2f}{anchored_vwap:>10.2f}")

    gap = price - anchored_vwap
    if start_side is None and abs(gap) > 1e-9:
        start_side = gap > 0
    elif start_side is not None and crossover is None and (gap > 0) != start_side:
        crossover = stamp

print("first bar back through the anchored VWAP:", crossover or "no crossing here")

兩組計數器就是整個概念。session_pvsession_vol 會在日期變更時歸零。anchor_pvanchor_vol 則永遠不會歸零。之後的程式只是在輸出結果。

為什麼 anchored 線會停止移動?

Anchored VWAP 隨時間經過而越來越難移動,原因是機械性的。每根新 K 棒進入平均值時,其權重等於自身成交量除以錨定點後的總成交量。第二天時,一個交易時段可能占總成交量的一半。200個交易時段後,同一個交易時段只占不到百分之一。下圖以 Apple 的 K 棒為例,每10個交易時段為一組,衡量該權重。

查詢最新交易時段對錨定 VWAP 的影響程度(AAPL)
每個數據背後的精確 SQL 語法
WITH running AS (
    SELECT
        row_number() OVER (ORDER BY date) AS n,
        toFloat64(volume)
      / sum(toFloat64(volume)) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS weight
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'AAPL'
      AND date >= '2026-01-02'
      AND date <= '2026-06-30'
)
SELECT
    intDiv(n - 1, 10) * 10 + 10 AS bars_since_anchor,
    round(100 * avg(weight), 2) AS newest_bar_weight_pct
FROM running
GROUP BY bars_since_anchor
ORDER BY bars_since_anchor
Run this yourself

前10個交易時段中,新進 K 棒的成交量平均占該線的 30.09%,其中錨定 K 棒本身占全部權重。到了第 130 個交易時段,最新 K 棒的權重降至 2.14%。閱讀這些圖表時,可以得到兩個結論。較早的錨定點會形成近乎水平的線,對當前走勢反應很小;較新的錨定點則會形成隨價格快速波動、頻繁穿越價格的線。兩者沒有誰比較正確,只是同一公式處於不同時間長度。若要直接觀察新增成交量相對於正常水準的多寡,可使用平均每日成交量相對成交量衡量。

anchored VWAP 顯示什麼?

一般的說法是,它可以用來觀察持倉狀況。當錨定點設在某個事件上,這條線代表自事件後所有交易的平均成交價格。因此,價格高於該線,表示多數持倉處於帳面獲利;價格低於該線則相反。下圖將5個家喻戶曉的股票名稱,分別錨定在過去12個月中各自出現的最低日收盤價,然後計算觀察區間最後一個收盤價相對於該平均價格的表現。

查詢以各股票過去十二個月的最低收盤價作為錨定點
每個數據背後的精確 SQL 語法
WITH
    bars AS (
        SELECT
            ticker,
            date,
            toFloat64(vwap)   AS px,
            toFloat64(volume) AS vol,
            toFloat64(close)  AS c
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'SPY')
          AND date >= '2025-07-01'
          AND date <= '2026-06-30'
    ),
    lows AS (
        SELECT
            ticker,
            argMin(date, c) AS low_date
        FROM bars
        GROUP BY ticker
    )
SELECT
    b.ticker                                AS symbol,
    formatDateTime(l.low_date, '%b %e, %Y') AS anchored_at,
    round(sumIf(b.px * b.vol, b.date >= l.low_date) / sumIf(b.vol, b.date >= l.low_date), 2) AS anchored_vwap,
    round(argMax(b.c, b.date), 2)           AS last_close,
    round(100 * (argMax(b.c, b.date)
        / (sumIf(b.px * b.vol, b.date >= l.low_date) / sumIf(b.vol, b.date >= l.low_date)) - 1), 1) AS close_vs_avwap_pct
FROM bars AS b
INNER JOIN lows AS l ON b.ticker = l.ticker
GROUP BY b.ticker, l.low_date
ORDER BY close_vs_avwap_pct DESC
Run this yourself

這5個股票名稱從 SPY10.4%,到 MSFT1.3%,每一檔都以自身的錨定日期計算。這個差異描述了實際發生的情況,但必須清楚說明其限制。Anchored VWAP 是根據已經成交的價格與成交量計算出的描述性統計,不是預測,也不是已有發表研究證實具備優勢的交易規則。它不包含價格與成交量歷史中原本沒有的資訊,而產生該數值的錨定點也是由人選定的。若將它視為自某個日期以來的盤勢摘要,這種解讀是誠實的。若將它視為判決,真正發言的是錨定點。

常見問題

VWAP 與 anchored VWAP 有什麼差異?

Session VWAP 會在每次市場開盤時重設累計值,因此只能描述當日行情。Anchored VWAP 則從使用者選定的某根 K 棒開始累計,且不會重設,因此描述的是自該 K 棒以來每個交易時段的平均成交價格。

交易者會將 VWAP 錨定在哪裡?

常見選擇包括財報發布日、跳空缺口的第一根 K 棒、波段高點或波段低點,以及新上市股票的首個交易日。任何 K 棒都可以作為錨定點,而讀者必須知道錨定日期,才能解讀這條線。

Anchored VWAP 會在隔夜期間重設嗎?

不會,這正是它的定義特徵。價格乘以成交量的累計總和,以及成交量的累計總和,都會跨越收盤延續,並在下一個交易時段重新開始累計,無論中間相隔多少個交易時段。

Anchored VWAP 能預測任何事情嗎?

它是描述性統計,而非預測工具。它總結的是自錨定點以來已經支付的價格。移動錨定點就會移動這條線,也可能反轉表面上的結論。因此,任何建立在其上的主張,都取決於該錨定日期是否具備充分理由。

Anchored VWAP 可以用日線 K 棒計算嗎?

可以。本頁圖表使用日線 K 棒,並將每個交易時段的 VWAP 作為 K 棒價格。盤中圖表則使用分鐘 K 棒。無論採用哪個時間週期,公式都相同,只有每次累加的幅度不同。


上方每個圖表都附有產生該圖表的 SQL,因此你可以開啟圖表並自行調整錨定日期。若要從你關注的日期開始計算相同的累計值,請在 Strasmore terminal 以自然語言提出要求。