Strasmore Research
सीखें Matt Connorलेखक: Matt Connor

Anchored VWAP: सूत्र और उपयोग समझें

Anchored VWAP चुने गए bar से संचयी औसत शुरू करता है और रीसेट नहीं होता। Python में सूत्र देखें और जानें कि anchor बदलने पर परिणाम कैसे बदलता है।

Anchored VWAP एक वॉल्यूम-भारित औसत मूल्य है, जो आपके चुने हुए एक बार से अपने संचयी योग शुरू करता है और उन्हें कभी रीसेट नहीं करता। Session VWAP हर opening bell पर फिर से शुरू होता है। इसलिए यह केवल बताता है कि आज औसतन शेयर किस मूल्य पर खरीदे-बेचे गए हैं। Anchored VWAP अलग सवाल का जवाब देता है: आपके चुने हुए शुरुआती बिंदु से अब तक औसतन शेयर किस मूल्य पर खरीदे-बेचे गए हैं।

Anchored VWAP क्या है?

दोनों संस्करणों में गणना एक जैसी होती है। शुरुआत से अब तक के प्रत्येक बार के मूल्य को उस बार के volume से गुणा करें और संचयी योग बनाए रखें। Volume का अलग संचयी योग भी रखें। पहले योग को दूसरे योग से विभाजित करें। इसे सूत्र के रूप में लिखें तो bar n पर anchored VWAP, anchor bar से bar n तक price और volume के गुणनफलों के योग को उन्हीं bars के volume के योग से विभाजित करने पर मिलता है।

किसी bar का मूल्य आमतौर पर उसका typical price होता है। यह उसके high, low और close का औसत होता है। यदि feed bar का VWAP प्रकाशित करता है, तो उसी का इस्तेमाल किया जा सकता है।

किसी भी योग से कुछ हटाया नहीं जाता। 50-day moving average हर नए observation के साथ सबसे पुराने observation को हटा देता है। इसी वजह से वह दिशा बदल सकता है। Anchored VWAP में केवल जोड़ होता है, इसलिए उसकी memory स्थायी होती है। Session VWAP में यही गणना हर opening पर दोनों योगों को शून्य करके की जाती है। इस अर्थ में उसका anchor opening bell होता है।

VWAP और anchored VWAP में क्या अंतर है?

नीचे का panel एक quarter के Apple daily bars पर दोनों की गणना करता है। session_vwap column प्रत्येक single session के भीतर का volume weighted average price है। यह हर दिन नया बनता है। anchored_vwap column window के पहले session से शुरू होकर आगे संचय करता है।

क्वेरीएक तिथि पर एंकर किए गए 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 sessions में, Apr 1 से Jun 30 तक, daily series market movement के साथ चलती है, जबकि anchored series धीरे-धीरे मुड़ती है। Anchored line 255.02 से शुरू होती है। पहले दिन एक ही session पूरा इतिहास होता है। Window के अंत तक यह 286.86 पर पहुंचती है, जबकि अंतिम session VWAP 288.09 होता है। यही इसका मुख्य बिंदु है। शुरुआत में anchored line daily line के करीब रहती है। इसके बाद उसके पीछे जमा volume बढ़ने पर वह सपाट होने लगती है।

लोग anchor कहां लगाते हैं?

लोकप्रिय anchors में earnings release, gap का पहला bar, 52-week low या हाल में listed stock का opening print शामिल हैं। इन सभी के पीछे एक ही दावा होता है। उस क्षण के बाद transaction करने वाले सभी प्रतिभागियों ने औसतन anchored VWAP के आसपास भुगतान किया। इसलिए line से ऊपर का मूल्य बताता है कि औसत participant को कागजी लाभ हो रहा है।

एक महत्वपूर्ण बात अक्सर नहीं बताई जाती। Anchor एक judgment call है और परिणाम उसी के साथ बदलता है। नीचे का panel उसी stock को पिछले बारह महीनों में से प्रत्येक महीने की शुरुआत पर anchor करता है। फिर उस महीने से एक तय अंतिम तारीख तक के औसत भुगतान मूल्य की गणना करता है।

क्वेरीवही स्टॉक और वही अंतिम मूल्य, बारह अलग-अलग एंकर (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 पर anchoring करने से औसत भुगतान मूल्य 259.52 आता है। Window का अंतिम close इसके मुकाबले 11.5% है। यह आंकड़ा तब positive होता है जब close line से ऊपर रहा हो। Jun 2026 पर anchoring करने से 294.07 और -1.6% मिलते हैं। Stock और अंतिम price एक ही हैं, लेकिन anchor के बाद से holders के लाभ में होने या न होने पर बारह अलग निष्कर्ष मिलते हैं। Arithmetic आपके लिए anchor नहीं चुनता। बाद में चुना गया anchor तब तक बदला जा सकता है, जब तक वह chart के intended message का समर्थन न करे। इसलिए जिस anchored VWAP chart को आप पढ़ते हैं, उसके caption में anchor date अवश्य होनी चाहिए।

Python में anchored VWAP की गणना कैसे करते हैं?

दोनों series bars पर एक ही pass से निकलती हैं। नीचे की script standard library Python 3 है। इसमें कोई package या network connection नहीं है। यह thirty bars पढ़ती है और session series को anchored series के साथ print करती है। इसके बाद यह उस पहले bar को report करती है, जहां price anchored line को फिर से पार करता है। Demonstration के लिए bars काल्पनिक हैं। यही loop वास्तविक bars पर चलाने पर arithmetic नहीं बदलता।

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

Counters के दोनों pairs ही पूरी अवधारणा हैं। session_pv और session_vol date बदलने पर zeroed हो जाते हैं। anchor_pv और anchor_vol कभी zeroed नहीं होते। इसके बाद बाकी सब printing है।

Anchored line चलना क्यों बंद कर देती है?

Anchored VWAP की उम्र बढ़ने पर उसे हिलाना कठिन होता जाता है। इसका कारण mechanical है। प्रत्येक नया bar average में अपने volume के बराबर weight लेकर आता है। यह weight anchor के बाद के कुल volume से उसके volume को विभाजित करने पर मिलता है। दूसरे दिन एक session कुल volume का आधा हो सकता है। Two hundred sessions बाद वही session one percent के एक अंश के बराबर रह जाता है। नीचे का panel Apple bars पर इस weight को ten-session blocks में मापता है।

क्वेरीनवीनतम सत्र एंकर किए गए 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

पहले ten sessions में आने वाला bar line का औसतन 30.09% होता है। Anchor bar स्वयं इसका पूरा हिस्सा बनाता है। Session 130 तक नवीनतम bar का weight घटकर 2.14% रह जाता है। इन charts को पढ़ते समय दो बातें स्पष्ट होती हैं। पुराना anchor लगभग सपाट line बनाता है और वर्तमान गतिविधि पर बहुत कम प्रतिक्रिया देता है। नया anchor ऐसी line बनाता है जो price के साथ तेज़ी से बदलती है और उसे बार-बार cross करती है। इनमें से कोई अधिक सही नहीं है। दोनों अलग उम्र पर एक ही formula हैं। सामान्य volume की तुलना में कितना volume आ रहा है, यह सीधे देखने के लिए औसत दैनिक volume और relative volume का उपयोग करें।

Anchored VWAP क्या दिखाने का दावा करता है?

सामान्य दावा positioning से जुड़ा होता है। किसी event पर anchor लगाने पर line उन सभी प्रतिभागियों का औसत भुगतान मूल्य होती है, जिन्होंने उसके बाद transaction किया। इसलिए line से ऊपर का price बताता है कि अधिकांश holders को कागजी लाभ हो रहा है। Line से नीचे का price इसके विपरीत स्थिति बताता है। नीचे का panel पांच household names को पिछले twelve months में उनके द्वारा दर्ज किए गए lowest daily close पर anchor करता है। फिर resulting average के मुकाबले window के अंतिम close को मापता है।

क्वेरीप्रत्येक नाम के पिछले बारह महीनों के न्यूनतम क्लोज़ पर एंकर किया गया
हर आंकड़े के पीछे का पूरा 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

पांच names SPY से 10.4% तक और नीचे MSFT से 1.3% तक फैले हैं। प्रत्येक को उसकी अपनी anchor date के मुकाबले मापा गया है। यह spread बताता है कि क्या हुआ। लेकिन इसकी सीमाओं को स्पष्ट रूप से समझना जरूरी है। Anchored VWAP पहले से दर्ज prices और volumes से निकाला गया descriptive statistic है। यह forecast नहीं है और published research में इसकी स्थापित बढ़त वाला कोई rule नहीं है। इसमें price और volume history में पहले से मौजूद जानकारी के अलावा कुछ नहीं होता। इसे बनाने वाला anchor भी किसी व्यक्ति ने चुना है। किसी date से अब तक के market activity के summary के रूप में इसे पढ़ना उचित है। अंतिम verdict की तरह पढ़ने पर निष्कर्ष को anchor तय कर रहा होता है।

FAQ

VWAP और anchored VWAP में क्या अंतर है?

Session VWAP हर market open पर अपने संचयी योग रीसेट करता है। इसलिए यह केवल वर्तमान दिन का विवरण देता है। Anchored VWAP आपके चुने हुए bar से योग शुरू करता है और कभी रीसेट नहीं होता। इसलिए यह उस bar के बाद के प्रत्येक session में भुगतान किए गए औसत price का विवरण देता है।

Traders VWAP पर anchor कहां लगाते हैं?

सामान्य विकल्पों में earnings date, gap का पहला bar, swing high या swing low और नए listing की trading का पहला day शामिल हैं। कोई भी bar anchor बन सकता है। Line को समझने के लिए reader को anchor date पता होना चाहिए।

क्या anchored VWAP overnight रीसेट होता है?

नहीं। यही इसकी परिभाषित विशेषता है। Price और volume के गुणनफल का running sum तथा volume का running sum दोनों market close के बाद भी बने रहते हैं। वे अगले session में फिर जारी रहते हैं, चाहे वह कितने भी sessions बाद क्यों न हो।

क्या anchored VWAP किसी चीज़ का prediction करता है?

यह forecast के बजाय descriptive statistic है। यह anchor के बाद अब तक किए गए भुगतानों का summary देता है। Anchor बदलने से line बदलती है और apparent conclusion उलट सकता है। इसलिए इस पर आधारित कोई भी claim anchor date के पक्ष में दिए गए तर्क जितना ही मजबूत होता है।

क्या anchored VWAP की गणना daily bars पर की जा सकती है?

हां। इस page के panels daily bars का उपयोग करते हैं और प्रत्येक session VWAP को bar price मानते हैं। Intraday charts में इसके बजाय minute bars का उपयोग होता है। दोनों resolutions पर formula एक जैसा रहता है। केवल increments का आकार बदलता है।


ऊपर के प्रत्येक panel के साथ उसे बनाने वाला SQL भी दिया गया है। आप कोई panel खोलकर anchor date स्वयं बदल सकते हैं। अपनी पसंद की date से वही running totals चलाने के लिए Strasmore terminal पर plain English में अनुरोध करें।