Strasmore Research

Anchored VWAP: فارمولا اور استعمال کیا ہے؟

Anchored VWAP آپ کے منتخب bar سے running average شروع کرتا ہے اور reset نہیں ہوتا۔ سادہ Python formula دیکھیں اور جانیں کہ anchor بدلنے سے نتیجہ کیسے بدلتا ہے۔

Anchored VWAP ایک volume weighted average price ہے جس کے running totals آپ کے منتخب کردہ ایک bar سے شروع ہوتے ہیں اور پھر کبھی reset نہیں ہوتے۔ Session VWAP ہر opening bell پر دوبارہ شروع ہوتا ہے، اس لیے یہ صرف یہ بتاتا ہے کہ آج اوسط شیئر کس قیمت پر trade ہوا ہے۔ Anchored version ایک مختلف سوال کا جواب دیتا ہے: آپ کے منتخب کردہ starting point سے اب تک اوسط شیئر کس قیمت پر trade ہوا ہے۔

Anchored VWAP کیا ہے؟

دونوں versions میں arithmetic ایک جیسی ہوتی ہے۔ آغاز سے ہر bar لیں، اس کی قیمت کو اسی bar کے volume سے ضرب دیں اور running total برقرار رکھیں۔ volume کا الگ running total بھی رکھیں۔ پہلے total کو دوسرے total سے divide کریں۔ تفصیل کے ساتھ، bar n پر anchored VWAP، anchor bar سے bar n تک price اور volume کی حاصل ضربوں کے مجموعے کو انہی bars کے volume کے مجموعے سے تقسیم کرنے کے برابر ہے۔

Bar کی price عموماً اس کی typical price ہوتی ہے، یعنی اس کے high، low اور close کی اوسط۔ اگر feed bar کا VWAP شائع کرے تو وہ بھی استعمال کیا جا سکتا ہے۔

دونوں totals میں سے کچھ بھی کبھی حذف نہیں ہوتا۔ 50-day moving average ہر نئی observation شامل کرتے وقت اپنی قدیم ترین observation نکال دیتا ہے، اسی وجہ سے وہ رخ بدل سکتا ہے۔ Anchored VWAP صرف اضافہ کرتا ہے، اس لیے اس کی memory مستقل رہتی ہے۔ Session VWAP میں یہی calculation ہر open پر دونوں totals کو zero کر کے کی جاتی ہے۔ یوں یہ ایسا anchored VWAP ہے جس کا anchor opening bell ہے۔

VWAP اور anchored VWAP میں کیا فرق ہے؟

نیچے دیا گیا panel ایک quarter کے دوران Apple کے daily bars پر دونوں calculations چلاتا ہے۔ session_vwap column ہر single session کے اندر volume weighted average price دکھاتا ہے، اس لیے ہر دن ایک نیا number آتا ہے۔ anchored_vwap column window کے پہلے session سے شروع ہوتا ہے اور وہاں سے total جمع کرتا ہے۔

استفسار کریںDaily session VWAP بمقابل ایک تاریخ پر anchored 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 tape کے ساتھ حرکت کرتی ہے جبکہ anchored series آہستہ آہستہ خم کھاتی ہے۔ پہلے دن ایک session ہی پوری history ہوتا ہے، اس لیے anchored line 255.02 پر کھلتی ہے۔ Window کے اختتام تک یہ 286.86 پر پہنچتی ہے، جبکہ آخری session VWAP 288.09 ہوتی ہے۔ اصل سبق اس کی shape میں ہے۔ Anchored line ابتدا میں daily line کو قریب سے follow کرتی ہے، پھر اس کے پیچھے volume جمع ہونے کے ساتھ flat ہونے لگتی ہے۔

لوگ anchor کہاں لگاتے ہیں؟

عام anchors میں earnings release، gap کا پہلا bar، 52-week low، یا نئے listed stock کا opening print شامل ہیں۔ ان سب کے پیچھے بنیادی دعویٰ ایک ہی ہے۔ اس لمحے کے بعد transaction کرنے والے ہر شخص نے اوسطاً anchored VWAP پر ادائیگی کی، اس لیے line سے اوپر کی price یہ ظاہر کرتی ہے کہ اوسط participant کو paper gain حاصل ہے۔

یہ وہ حصہ ہے جو عموماً بیان نہیں کیا جاتا۔ Anchor ایک judgment call ہے، اور جواب بھی اسی کے ساتھ بدلتا ہے۔ نیچے دیا گیا panel اسی stock کو گزشتہ بارہ months میں سے ہر ماہ کے آغاز پر anchor کرتا ہے، پھر اس ماہ سے ایک مقررہ آخری تاریخ تک ادا کی گئی اوسط price نکالتا ہے۔

استفسار کریںوہی stock، وہی آخری price، بارہ مختلف anchors (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 سے average price paid 259.52 آتی ہے۔ Window کی آخری close اس کے مقابل 11.5% بنتی ہے۔ Close line سے اوپر ہو تو یہ figure مثبت ہوتی ہے۔ Jun 2026 پر anchoring 294.07 اور -1.6% دیتی ہے۔ Stock وہی ہے، آخری price وہی ہے، مگر anchor کے بعد سے holders کی مالی پوزیشن کے بارے میں بارہ مختلف نتائج سامنے آتے ہیں۔ Arithmetic آپ کے لیے anchor منتخب نہیں کرتی۔ ماضی کا کوئی anchor بعد میں اس وقت تک بدلا جا سکتا ہے جب تک وہ chart کے مطلوبہ مؤقف کی حمایت نہ کرے۔ اسی لیے ہر anchored VWAP chart کے caption میں anchor date درج ہونی چاہیے۔

Python میں anchored VWAP کیسے calculate کرتے ہیں؟

دونوں series bars پر ایک ہی pass سے حاصل ہو جاتی ہیں۔ نیچے دیا گیا script standard library Python 3 ہے۔ اس میں کوئی package یا network استعمال نہیں ہوتا۔ یہ تیس bars پڑھتا ہے، session series کو anchored series کے ساتھ print کرتا ہے، پھر وہ پہلا bar بتاتا ہے جہاں price دوبارہ anchored line کو cross کرتی ہے۔ Demonstration کے لیے bars فرضی ہیں۔ اسی loop کو real 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 ہی پوری concept کی بنیاد ہیں۔ session_pv اور session_vol date بدلنے پر zero ہو جاتے ہیں۔ anchor_pv اور anchor_vol کبھی zero نہیں ہوتے۔ اس کے بعد باقی کام صرف printing کا ہے۔

Anchored line حرکت کرنا کیوں چھوڑ دیتی ہے؟

Anchored VWAP عمر بڑھنے کے ساتھ move کرنا مشکل ہو جاتا ہے۔ اس کی وجہ mechanical ہے۔ ہر نیا bar average میں اتنے weight کے ساتھ شامل ہوتا ہے جو anchor کے بعد کے کل volume میں اس bar کے volume کے برابر ہوتا ہے۔ دوسرے دن ایک session کل volume کا نصف ہو سکتا ہے۔ دو سو sessions بعد یہی session one percent کے بھی ایک حصے کے برابر رہ جاتا ہے۔ نیچے دیا گیا panel Apple bars پر اس weight کو دس دس sessions کے blocks میں measure کرتا ہے۔

استفسار کریںتازہ ترین session anchored 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

پہلے دس sessions میں آنے والا bar line کو اوسطاً 30.09% move کرتا ہے، جبکہ anchor bar خود اس پورے اثر کا ذمہ دار ہوتا ہے۔ Session 130 تک newest bar کا weight کم ہو کر 2.14% رہ جاتا ہے۔ ان charts کو پڑھتے وقت دو باتیں سامنے آتی ہیں۔ پرانا anchor تقریباً flat line بناتا ہے جو موجودہ حرکت پر بہت کم ردِعمل دیتی ہے۔ نیا anchor ایسی line بناتا ہے جو price کے گرد تیزی سے گھومتی ہے اور اسے بار بار cross کرتی ہے۔ ان میں سے کوئی زیادہ درست نہیں۔ یہ مختلف عمر میں ایک ہی formula ہیں۔ معمول کے مقابلے میں کتنا volume آ رہا ہے، یہ براہِ راست جانچنے کے لیے average daily volume اور relative volume استعمال کیے جاتے ہیں۔

Anchored VWAP کیا ظاہر کرنے کا دعویٰ کرتا ہے؟

عام دعویٰ positioning سے متعلق ہوتا ہے۔ اگر anchor کسی event پر رکھا جائے تو line اس کے بعد transaction کرنے والے تمام participants کی average price paid ہوتی ہے۔ اس لیے line سے اوپر کی price یہ ظاہر کرتی ہے کہ اکثریت paper gain پر hold کر رہی ہے، جبکہ line سے نیچے کی price اس کے برعکس صورتِ حال دکھاتی ہے۔ نیچے دیا گیا panel پانچ معروف household names کو گزشتہ بارہ months میں ان کے شائع کردہ lowest daily close پر anchor کرتا ہے، پھر window کی آخری close کو resulting average کے مقابل measure کرتا ہے۔

استفسار کریںہر نام کے گزشتہ بارہ ماہ کی کم ترین closing price پر anchored
ہر عدد کے پیچھے موجود درست 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% تک پھیلتے ہیں۔ ہر name کو اس کی اپنی anchor date کے مقابل measure کیا گیا ہے۔ یہ spread جو کچھ ہوا اسے بیان کرتا ہے، مگر اس کی حدود واضح رہنی چاہییں۔ Anchored VWAP prices اور volumes سے calculated ایک descriptive statistic ہے جو پہلے ہی print ہو چکے ہیں۔ یہ forecast نہیں اور published research میں ثابت شدہ edge رکھنے والا rule بھی نہیں۔ اس میں price اور volume history سے باہر کی کوئی information نہیں ہوتی۔ اسے پیدا کرنے والا anchor بھی کسی شخص نے منتخب کیا ہوتا ہے۔ کسی date کے بعد tape کا خلاصہ سمجھ کر اسے پڑھیں تو یہ honest ہے۔ اسے حتمی verdict سمجھیں تو اصل بات anchor بتا رہا ہوتا ہے۔

عمومی سوالات

VWAP اور anchored VWAP میں کیا فرق ہے؟

Session VWAP ہر market open پر اپنے running totals reset کرتا ہے، اس لیے یہ صرف موجودہ دن کو describe کرتا ہے۔ Anchored VWAP اپنے totals آپ کے منتخب کردہ bar سے شروع کرتا ہے اور کبھی reset نہیں ہوتا، اس لیے یہ اس bar کے بعد ہر session میں ادا کی گئی average price کو describe کرتا ہے۔

Traders VWAP پر anchor کہاں لگاتے ہیں؟

عام انتخاب earnings date، gap کا پہلا bar، swing high یا swing low، اور نئی listing کے پہلے trading day پر مشتمل ہوتے ہیں۔ کوئی بھی bar anchor بن سکتا ہے۔ Line کو interpret کرنے کے لیے reader کو anchor date معلوم ہونا ضروری ہے۔

کیا anchored VWAP overnight reset ہوتا ہے؟

نہیں۔ یہی اس کی defining property ہے۔ price اور volume کی حاصل ضرب کا running sum اور volume کا running sum دونوں close کے بعد بھی برقرار رہتے ہیں، پھر اگلے session میں دوبارہ چلتے ہیں، چاہے اس وقت تک کتنے ہی sessions گزر چکے ہوں۔

کیا anchored VWAP کسی چیز کی پیش گوئی کرتا ہے؟

یہ forecast کے بجائے descriptive statistic ہے۔ یہ anchor کے بعد اب تک ادا کی گئی price کا خلاصہ پیش کرتا ہے۔ Anchor بدلنے سے line بدل جاتی ہے اور بظاہر نتیجہ بھی الٹ سکتا ہے۔ اس لیے اس پر مبنی ہر دعویٰ اتنا ہی مضبوط ہے جتنا اس anchor date کے انتخاب کا جواز۔

کیا anchored VWAP daily bars پر calculate کیا جا سکتا ہے؟

ہاں۔ اس page کے panels daily bars استعمال کرتے ہیں، جہاں ہر session کا VWAP bar price ہوتا ہے۔ Intraday charts میں اس کے بجائے minute bars استعمال ہوتے ہیں۔ دونوں resolutions پر formula ایک جیسا رہتا ہے۔ صرف increments کا size بدلتا ہے۔


اوپر موجود ہر panel کے ساتھ وہ SQL بھی دیا گیا ہے جس سے اسے تیار کیا گیا۔ آپ اسے کھول کر anchor date خود تبدیل کر سکتے ہیں۔ اپنی دلچسپی کی تاریخ سے یہی running totals چلانے کے لیے Strasmore terminal پر plain English میں درخواست دیں۔