Anchored VWAP: সূত্র ও ব্যবহার সহজভাবে
Anchored VWAP আপনার বেছে নেওয়া বারে চলমান গড় শুরু করে, পরে রিসেট হয় না। সহজ Python সূত্র দেখুন এবং anchor সরালে ফল কীভাবে বদলায় জানুন।
Anchored VWAP হলো একটি ভলিউম-ওয়েটেড অ্যাভারেজ প্রাইস, যার চলমান মোট গণনা আপনি বেছে নেওয়া একটি বারে শুরু হয় এবং আর কখনও রিসেট হয় না। Session VWAP প্রতিটি বাজার খোলার ঘণ্টায় নতুন করে শুরু হয়। তাই এটি কেবল আজ গড়ে কোন দামে শেয়ার হাতবদল হয়েছে, সেই প্রশ্নের উত্তর দেয়। Anchored VWAP-এর প্রশ্নটি ভিন্ন: আপনি যে মুহূর্তটিকে শুরুর সীমারেখা হিসেবে বেছে নিয়েছেন, তার পর থেকে গড়ে কোন দামে শেয়ার হাতবদল হয়েছে?
Anchored VWAP কী?
দুই ধরনের VWAP-এই একই গাণিতিক পদ্ধতি ব্যবহৃত হয়। শুরু থেকে প্রতিটি বারের দামকে ওই বারের ভলিউম দিয়ে গুণ করুন এবং চলমান মোট হিসাব রাখুন। ভলিউমের জন্য আলাদা একটি চলমান মোট হিসাব রাখুন। প্রথম মোটকে দ্বিতীয় মোট দিয়ে ভাগ করুন। সূত্রে লিখলে, বার n-এ anchored VWAP হলো anchor bar থেকে বার n পর্যন্ত দাম ও ভলিউমের গুণফলের যোগফল, একই বারগুলোর ভলিউমের যোগফল দিয়ে ভাগ করা।
কোনো বারের দাম সাধারণত তার typical price। এটি high, low এবং close-এর গড়। ফিডে কোনো বারের নিজস্ব VWAP প্রকাশ করা হলে সেটিও ব্যবহার করা যায়।
কোনো মোট হিসাব থেকেই কিছু বাদ যায় না। 50-day moving average নতুন পর্যবেক্ষণ যোগ করার সময় প্রতিবার সবচেয়ে পুরনো পর্যবেক্ষণ বাদ দেয়। তাই সেটি পরিবর্তিত হতে পারে। Anchored VWAP কেবল যোগ করে। ফলে তার স্মৃতি স্থায়ী। Session VWAP একই হিসাব, তবে প্রতিটি বাজার খোলার সময় দুইটি মোটই শূন্য করা হয়। অর্থাৎ এর anchor হলো বাজার খোলার ঘণ্টা।
VWAP এবং anchored VWAP-এর মধ্যে পার্থক্য কী?
নিচের প্যানেলে এক quarter-এর Apple daily bar-এ দুটিই দেখানো হয়েছে। session_vwap কলামে প্রতিটি একক session-এর volume weighted average price দেখানো হয়েছে। এটি প্রতিদিন নতুন করে গণনা করা হয়। anchored_vwap কলামের হিসাব window-এর প্রথম session থেকে শুরু হয়ে সেখান থেকে জমা হয়।
প্রতিটি সংখ্যার পেছনের সঠিক 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 date62টি session-জুড়ে, Apr 1 থেকে Jun 30 পর্যন্ত, daily series বাজারের চলাচলের সঙ্গে বদলায়। Anchored series ধীরে বাঁক নেয়। প্রথম দিনে একটি session-ই পুরো ইতিহাস হওয়ায় anchored line 255.02-এ শুরু হয়। Window-এর শেষে এটি 286.86-এ পৌঁছায়। একই সময়ে শেষ session-এর VWAP ছিল 288.09। আকৃতিটিই মূল শিক্ষা। শুরুতে anchored line daily line-কে ঘনিষ্ঠভাবে অনুসরণ করে। পরে এর পেছনে ভলিউম জমা হওয়ায় line-টি সমতল হতে থাকে।
মানুষ সাধারণত কোথায় anchor বসায়?
জনপ্রিয় anchor হলো earnings release, gap-এর প্রথম bar, একটি 52-week low, অথবা নতুন তালিকাভুক্ত শেয়ারের opening print। এগুলোর সঙ্গে যুক্ত ধারণা একই। ওই মুহূর্তের পর যারা লেনদেন করেছেন, তারা গড়ে anchored VWAP দামে লেনদেন করেছেন। তাই দামের অবস্থান line-এর ওপরে হলে বোঝায়, গড় অংশগ্রহণকারী paper gain-এ আছেন।
এখানে একটি বিষয় সাধারণত বলা হয় না। Anchor বেছে নেওয়া একটি বিচারনির্ভর সিদ্ধান্ত। তাই ফলও anchor-এর সঙ্গে বদলে যায়। নিচের প্যানেলে একই শেয়ারের জন্য গত 12 মাসের প্রতিটি মাসের শুরুতে anchor বসানো হয়েছে। এরপর প্রতিটি মাস থেকে একটি নির্দিষ্ট শেষ তারিখ পর্যন্ত গড় পরিশোধিত দাম গণনা করা হয়েছে।
প্রতিটি সংখ্যার পেছনের সঠিক 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.mJul 2025-এ anchor বসালে গড় পরিশোধিত দাম হয় 259.52। Window-এর শেষ close তার তুলনায় 11.5% অবস্থানে থাকে। Close line-এর ওপরে থাকলে এই সংখ্যা positive হয়। Jun 2026-এ anchor বসালে ফল হয় 294.07 এবং -1.6%। একই শেয়ার, একই শেষ দাম, কিন্তু anchor-এর পর থেকে holders লাভে আছেন কি না—এই প্রশ্নে 12টি ভিন্ন সিদ্ধান্ত। গাণিতিক হিসাব আপনাকে anchor বেছে দেয় না। ঘটনার পরে বেছে নেওয়া anchor-কে এমনভাবে সরানো যায়, যাতে chart আপনার প্রত্যাশিত বক্তব্যকে সমর্থন করে। তাই আপনি যে anchored VWAP chart পড়ছেন, তার caption-এ anchor date থাকা জরুরি।
Python-এ anchored VWAP কীভাবে গণনা করবেন?
দুইটি series-ই bars-এর ওপর একবারের pass থেকে পাওয়া যায়। নিচের script-টি standard library Python 3 ব্যবহার করে। এতে কোনো package বা network দরকার নেই। এটি 30টি bar পড়ে session series-এর পাশে anchored series print করে। এরপর price প্রথম কোথায় anchored line অতিক্রম করে ফিরে এসেছে, তা জানায়। Demonstration-এর জন্য bars-গুলো বানানো হয়েছে। একই loop real bars-এর ওপর চালালেও গাণিতিক হিসাব বদলাবে না।
"""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")
দুই জোড়া counter-ই পুরো ধারণার ভিত্তি। session_pv এবং session_vol তারিখ বদলালে শূন্য হয়ে যায়। anchor_pv এবং anchor_vol কখনও শূন্য হয় না। এরপরের কাজ কেবল ফলাফল print করা।
Anchored line কেন ধীরে ধীরে নড়ে?
Anchored VWAP পুরনো হওয়ার সঙ্গে সঙ্গে তাকে সরানো কঠিন হয়। এর একটি যান্ত্রিক কারণ আছে। প্রতিটি নতুন bar মোট anchor-এর পর থেকে আসা সব ভলিউমের তুলনায় নিজের ভলিউমের অনুপাতে average-এ weight পায়। দ্বিতীয় দিনে একটি session মোট ভলিউমের অর্ধেক weight বহন করতে পারে। 200টি session পরে একই session-এর weight এক শতাংশের ভগ্নাংশে নেমে আসে। নিচের প্যানেলে Apple bars-এ এই weight মাপা হয়েছে, 10টি session-এর block-এ।
প্রতিটি সংখ্যার পেছনের সঠিক 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প্রথম 10টি session-এ আসা bar line-টির গড়ে 30.09% অংশ প্রভাবিত করে। Anchor bar নিজে এর পুরো অংশের জন্য দায়ী। Session 130-এ newest bar-এর weight কমে 2.14% হয়। এই chart পড়লে দুটি বিষয় বোঝা যায়। পুরনো anchor এমন একটি প্রায় সমতল line তৈরি করে, যা বর্তমান ঘটনার প্রতি খুব কম সাড়া দেয়। Fresh anchor এমন line তৈরি করে, যা price-এর চারপাশে দ্রুত ওঠানামা করে এবং price-কে বারবার অতিক্রম করে। কোনোটিই বেশি সঠিক নয়। এগুলো একই formula-এর ভিন্ন বয়সের ফল। স্বাভাবিকের তুলনায় কত ভলিউম আসছে, তা সরাসরি বুঝতে average daily volume এবং relative volume ব্যবহার করা হয়।
Anchored VWAP কী দেখানোর দাবি করে?
সাধারণ দাবি হলো এটি positioning বোঝায়। কোনো event-এ anchor বসালে line-টি ওই event-এর পর থেকে লেনদেন করা সবার গড় পরিশোধিত দাম দেখায়। তাই price line-এর ওপরে থাকলে বোঝায়, সংখ্যাগরিষ্ঠ holder paper gain-এ আছেন। Line-এর নিচে থাকলে বিপরীত অবস্থার ইঙ্গিত দেয়। নিচের প্যানেলে পাঁচটি household name-এর ক্ষেত্রে গত 12 মাসে তাদের প্রত্যেকের দেখা সর্বনিম্ন daily close-এ anchor বসানো হয়েছে। এরপর window-এর শেষ close-কে সেই anchor থেকে তৈরি average-এর সঙ্গে তুলনা করা হয়েছে।
প্রতিটি সংখ্যার পেছনের সঠিক 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পাঁচটি নামের ফল SPY থেকে MSFT পর্যন্ত বিস্তৃত। তাদের নিজ নিজ anchor date-এর তুলনায় মাপটি 10.4% থেকে 1.3% পর্যন্ত। এই spread-এ কী ঘটেছে তা দেখা যায়। তবে সীমাবদ্ধতাগুলো স্পষ্টভাবে বোঝা দরকার। Anchored VWAP হলো ইতিমধ্যে print হওয়া price ও volume থেকে গণনা করা একটি descriptive statistic। এটি forecast নয়। Published research-এ এর established edge-ও নেই। Price এবং volume history-তে আগে থেকে নেই, এমন কোনো তথ্য এটি ধারণ করে না। যে anchor থেকে এটি তৈরি হয়েছে, সেটিও একজন ব্যক্তি বেছে নিয়েছেন। কোনো নির্দিষ্ট তারিখের পরের tape-এর summary হিসেবে এটি সৎ। কিন্তু verdict হিসেবে পড়লে কথা বলছে anchor-ই।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
VWAP এবং anchored VWAP-এর মধ্যে পার্থক্য কী?
Session VWAP প্রতিটি market open-এ চলমান মোট হিসাব reset করে। তাই এটি কেবল বর্তমান দিনের বর্ণনা দেয়। Anchored VWAP আপনার বেছে নেওয়া একটি bar-এ হিসাব শুরু করে এবং আর reset হয় না। তাই ওই bar-এর পর থেকে প্রতিটি session-এ গড়ে যে দামে শেয়ার কেনাবেচা হয়েছে, তা এটি দেখায়।
Traders VWAP-এ কোথায় anchor বসান?
সাধারণ পছন্দ হলো earnings date, gap-এর প্রথম bar, swing high বা swing low, এবং নতুন তালিকাভুক্ত শেয়ারের trading-এর প্রথম দিন। যেকোনো bar anchor হিসেবে ব্যবহার করা যায়। Line-টি বুঝতে পাঠকের যে তথ্য জানা দরকার, তা হলো anchor date।
Anchored VWAP কি overnight reset হয়?
না। এটিই এর সংজ্ঞায়িত বৈশিষ্ট্য। price ও volume-এর গুণফলের চলমান যোগফল এবং volume-এর চলমান যোগফল—দুটিই market close-এর পরেও বহাল থাকে। পরের session-এ, যত session পরই হোক, সেখান থেকেই হিসাব আবার চলতে থাকে।
Anchored VWAP কি কিছু predict করে?
এটি forecast নয়, একটি descriptive statistic। Anchor-এর পর থেকে ইতিমধ্যে যে দামে লেনদেন হয়েছে, তার summary এটি দেয়। Anchor সরালে line-ও সরে যায় এবং আপাত সিদ্ধান্ত বদলে যেতে পারে। তাই এর ওপর ভিত্তি করে করা যেকোনো দাবি anchor date বেছে নেওয়ার যুক্তির মতোই শক্তিশালী।
Daily bar-এ কি anchored VWAP গণনা করা যায়?
হ্যাঁ। এই পৃষ্ঠার প্যানেলগুলোতে daily bar ব্যবহার করা হয়েছে। প্রতিটি session VWAP-কে bar price হিসেবে নেওয়া হয়েছে। Intraday chart-এ এর বদলে minute bar ব্যবহার করা হয়। দুই resolution-এই formula একই। কেবল increment-এর আকার বদলে যায়।
উপরের প্রতিটি panel-এর সঙ্গে সেটি তৈরি করা SQL দেওয়া আছে। তাই আপনি যেকোনো panel খুলে নিজেই anchor date পরিবর্তন করতে পারবেন। আপনার পছন্দের কোনো তারিখ থেকে একই চলমান মোট হিসাব চালাতে Strasmore terminal-এ plain English-এ অনুরোধ করুন।