Strasmore Research
Học tập Matt ConnorBởi Matt Connor · Cập nhật 2026-08-08

Anchored VWAP: Công thức và cách dùng

Anchored VWAP tính giá trung bình theo khối lượng từ một bar bạn chọn và không thiết lập lại. Xem công thức Python và tác động của việc đổi mốc neo.

Anchored VWAP là giá trung bình theo khối lượng bắt đầu cộng dồn từ một bar do bạn chọn và không bao giờ thiết lập lại. Session VWAP bắt đầu lại ở mỗi phiên mở cửa, nên chỉ trả lời câu hỏi giá trung bình mà cổ phiếu đã được giao dịch trong hôm nay là bao nhiêu. Anchored VWAP trả lời một câu hỏi khác: kể từ thời điểm bạn chọn làm mốc, giá trung bình mà cổ phiếu đã được giao dịch là bao nhiêu.

Anchored VWAP là gì?

Cả hai phiên bản đều dùng cùng một phép tính. Lấy mọi bar kể từ thời điểm bắt đầu, nhân giá của mỗi bar với khối lượng của bar đó và cộng dồn. Đồng thời, cộng dồn khối lượng riêng. Sau đó chia tổng thứ nhất cho tổng thứ hai. Viết đầy đủ, anchored VWAP tại bar n là tổng của giá nhân với khối lượng từ bar neo đến bar n, chia cho tổng khối lượng của cùng các bar đó.

Giá của một bar thường là giá điển hình, tức trung bình của giá cao nhất, thấp nhất và đóng cửa, hoặc là VWAP của chính bar đó nếu nguồn dữ liệu cung cấp.

Không có giá trị nào bị loại khỏi hai tổng này. Đường trung bình động 50 ngày loại bỏ quan sát cũ nhất mỗi khi thêm quan sát mới, nhờ đó đường có thể đổi hướng. Anchored VWAP chỉ cộng thêm dữ liệu, nên bộ nhớ của nó là vĩnh viễn. Session VWAP cũng dùng phép tính này, nhưng cả hai tổng được đưa về 0 ở mỗi lần mở cửa. Vì vậy, có thể xem đây là anchored VWAP với mốc neo là thời điểm mở cửa.

VWAP khác anchored VWAP như thế nào?

Biểu đồ dưới đây tính cả hai chỉ báo trên dữ liệu ngày của Apple trong một quý. Cột session_vwap là giá trung bình theo khối lượng trong từng phiên riêng lẻ, với một giá trị mới mỗi ngày. Cột anchored_vwap bắt đầu từ phiên đầu tiên của khoảng thời gian và cộng dồn từ đó.

Truy vấnVWAP phiên hằng ngày so với VWAP neo tại một ngày (AAPL)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Trong 62 phiên, từ Apr 1 đến Jun 30, chuỗi dữ liệu hằng ngày di chuyển theo diễn biến giao dịch, trong khi chuỗi anchored thay đổi chậm hơn. Đường anchored bắt đầu tại 255.02, vì trong ngày đầu tiên, một phiên duy nhất chính là toàn bộ lịch sử. Đến cuối khoảng thời gian, đường này đạt 286.86, so với session VWAP cuối kỳ là 288.09. Hình dạng của hai đường cho thấy điểm cốt lõi. Ban đầu, đường anchored bám khá sát đường theo ngày. Sau đó, nó dần phẳng ra khi khối lượng đứng sau phép tính ngày càng lớn.

Mọi người thường đặt mốc neo ở đâu?

Các mốc neo phổ biến gồm ngày công bố kết quả kinh doanh, bar đầu tiên của một gap, mức thấp nhất trong 52 tuần, hoặc giao dịch khớp lệnh đầu tiên của một cổ phiếu mới niêm yết. Lập luận đằng sau các lựa chọn này giống nhau. Tất cả những người giao dịch sau thời điểm đó đã trả mức giá trung bình bằng anchored VWAP. Vì vậy, giá nằm trên đường này cho thấy người tham gia trung bình đang có lãi trên giấy.

Điểm thường không được nói rõ là mốc neo mang tính phán đoán, và kết quả sẽ thay đổi theo mốc đó. Biểu đồ dưới đây đặt mốc neo cho cùng một cổ phiếu tại đầu mỗi tháng trong 12 tháng gần nhất, rồi tính giá trung bình đã trả từ tháng đó đến một ngày kết thúc cố định.

Truy vấnCùng một cổ phiếu và giá cuối cùng, mười hai điểm neo khác nhau (AAPL)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Đặt mốc tại Jul 2025 cho mức giá trung bình đã trả là 259.52. Giá đóng cửa cuối cùng trong khoảng thời gian cao hơn mức này 11.5%, một con số dương khi giá đóng cửa nằm trên đường anchored. Đặt mốc tại Jun 2026 cho kết quả 294.07-1.6%. Cùng một cổ phiếu, cùng một giá cuối kỳ, nhưng có 12 kết luận khác nhau về việc những người nắm giữ cổ phiếu kể từ mốc neo đang có lãi hay không. Phép tính không tự chọn mốc neo cho bạn. Một mốc được chọn sau khi sự việc đã xảy ra có thể bị dịch chuyển cho đến khi biểu đồ ủng hộ thông điệp mong muốn. Vì vậy, ngày neo phải xuất hiện trong chú thích của mọi biểu đồ anchored VWAP mà bạn đọc.

Tính anchored VWAP bằng Python như thế nào?

Cả hai chuỗi dữ liệu đều được tạo trong một lượt duyệt qua các bar. Đoạn mã dưới đây dùng Python 3 với thư viện chuẩn, không cần package hay kết nối mạng. Mã đọc 30 bar và in chuỗi session cạnh chuỗi anchored, sau đó báo bar đầu tiên mà giá cắt trở lại qua đường anchored. Các bar được tạo riêng cho mục đích minh họa. Khi áp dụng cùng vòng lặp cho dữ liệu thực, phép tính không thay đổi.

"""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")

Hai cặp bộ đếm là toàn bộ ý tưởng. session_pvsession_vol được đưa về 0 mỗi khi ngày thay đổi. anchor_pvanchor_vol không bao giờ được thiết lập lại. Phần còn lại chỉ là in kết quả.

Vì sao đường anchored dần ít biến động?

Anchored VWAP càng tồn tại lâu thì càng khó dịch chuyển, vì một lý do mang tính cơ học. Mỗi bar mới tham gia vào mức trung bình với tỷ trọng bằng khối lượng của chính bar đó chia cho tổng khối lượng kể từ mốc neo. Trong ngày thứ hai, một phiên có thể chiếm một nửa tổng khối lượng. Sau 200 phiên, chính phiên đó chỉ còn chiếm một phần nhỏ hơn một phần trăm. Biểu đồ dưới đây đo tỷ trọng này trên các bar của Apple, theo từng nhóm 10 phiên.

Truy vấnPhiên mới nhất có thể làm VWAP neo biến động bao nhiêu (AAPL)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Trong 10 phiên đầu tiên, bar mới đóng góp trung bình 30.09% vào đường anchored, trong đó chính bar neo chiếm toàn bộ tỷ trọng. Đến phiên 130, bar mới nhất chỉ còn chiếm 2.14%. Khi đọc các biểu đồ này, có hai điểm cần lưu ý. Mốc neo cũ tạo ra một đường gần như phẳng và hầu như không phản ứng với diễn biến hiện tại. Mốc neo mới tạo ra một đường biến động mạnh quanh giá và liên tục cắt qua giá. Không đường nào chính xác hơn. Chúng chỉ là cùng một công thức ở các độ tuổi khác nhau. Để theo dõi trực tiếp lượng khối lượng mới so với mức thông thường, khối lượng giao dịch trung bình ngàykhối lượng tương đối là các chỉ báo phù hợp.

Anchored VWAP cho thấy điều gì?

Lập luận tiêu chuẩn là anchored VWAP cho biết vị thế của người tham gia. Khi mốc neo gắn với một sự kiện, đường này là giá trung bình mà tất cả những người giao dịch kể từ đó đã trả. Vì vậy, giá nằm trên đường cho thấy phần lớn người nắm giữ đang có lãi trên giấy, còn giá nằm dưới đường cho thấy điều ngược lại. Biểu đồ dưới đây đặt mốc neo cho năm cổ phiếu quen thuộc tại mức đóng cửa ngày thấp nhất mà mỗi cổ phiếu ghi nhận trong 12 tháng qua, sau đó đo giá đóng cửa cuối kỳ so với mức trung bình tương ứng.

Truy vấnNeo tại mức giá đóng cửa thấp nhất riêng của từng mã trong mười hai tháng qua
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Năm cổ phiếu trải từ SPY tại 10.4% xuống MSFT tại 1.3%, mỗi cổ phiếu được đo từ ngày neo riêng. Khoảng chênh lệch đó mô tả những gì đã xảy ra, nhưng cần xác định rõ giới hạn của chỉ báo. Anchored VWAP là một thống kê mô tả được tính từ giá và khối lượng đã khớp trong quá khứ. Đây không phải dự báo và cũng không phải quy tắc có lợi thế đã được xác lập trong các nghiên cứu công bố. Chỉ báo không chứa thông tin nào mà lịch sử giá và khối lượng chưa có. Hơn nữa, mốc tạo ra chỉ báo do một người lựa chọn. Nếu được đọc như bản tóm tắt diễn biến giao dịch kể từ một ngày cụ thể, chỉ báo này phản ánh đúng dữ liệu. Nếu được đọc như một kết luận, chính mốc neo mới là yếu tố đang lên tiếng.

Câu hỏi thường gặp

VWAP khác anchored VWAP như thế nào?

Session VWAP thiết lập lại các tổng cộng dồn ở mỗi lần thị trường mở cửa, nên chỉ mô tả ngày hiện tại. Anchored VWAP bắt đầu cộng dồn từ một bar do bạn chọn và không bao giờ thiết lập lại. Vì vậy, nó mô tả giá trung bình đã trả trong mọi phiên kể từ bar đó.

Nhà giao dịch đặt mốc neo VWAP ở đâu?

Các lựa chọn phổ biến gồm ngày công bố kết quả kinh doanh, bar đầu tiên của một gap, đỉnh hoặc đáy dao động, và ngày giao dịch đầu tiên của một cổ phiếu mới niêm yết. Bất kỳ bar nào cũng có thể làm mốc neo. Người đọc cần biết ngày neo để diễn giải đường chỉ báo.

Anchored VWAP có thiết lập lại qua đêm không?

Không. Đây là đặc tính cốt lõi của chỉ báo. Tổng cộng dồn của giá nhân với khối lượng và tổng cộng dồn của khối lượng đều được giữ qua thời điểm đóng cửa. Chúng tiếp tục được cộng thêm vào phiên kế tiếp, dù phiên đó diễn ra sau bao nhiêu phiên.

Anchored VWAP có dự báo được điều gì không?

Đây là một thống kê mô tả, không phải dự báo. Nó tóm tắt mức giá đã được trả kể từ mốc neo. Thay đổi mốc neo sẽ làm thay đổi đường chỉ báo và có thể đảo ngược kết luận bề ngoài. Vì vậy, mọi nhận định dựa trên anchored VWAP chỉ vững chắc đến mức lập luận ủng hộ ngày neo đó.

Có thể tính anchored VWAP trên dữ liệu ngày không?

Có. Các biểu đồ trên trang này dùng dữ liệu ngày, trong đó VWAP của từng phiên được dùng làm giá của bar. Biểu đồ trong ngày sử dụng các bar theo phút. Công thức giống hệt nhau ở cả hai độ phân giải. Chỉ kích thước của các bước cộng dồn là thay đổi.


Mỗi biểu đồ trên đều đi kèm câu lệnh SQL tạo ra dữ liệu, để bạn có thể mở biểu đồ và tự thay đổi ngày neo. Để tính cùng các tổng cộng dồn từ một ngày bạn quan tâm, hãy yêu cầu bằng tiếng Anh tự nhiên trên terminal Strasmore.