Value at Risk की गणना करने की तीन मुख्य विधियाँ
SPY रिटर्न सीरीज़ पर ऐतिहासिक, पैरामीट्रिक और Monte Carlo विधियों का उपयोग करके VaR की गणना कैसे करें। साथ ही उन जोखिमों को समझें जिन्हें VaR पूरी तरह से छोड़ देता है।
Value at Risk (VaR) की गणना
Value at Risk, या VaR, की गणना एक निश्चित समय-सीमा और एक निश्चित confidence level तय करके की जाती है। इसके बाद रिटर्न सीरीज़ से एक percentile मान लिया जाता है। यदि एक दिन का 99% VaR 2% है, तो इसका अर्थ है कि 100 में से 99 सत्रों में नुकसान 2% से कम रहेगा और सौवें सत्र में यह इससे अधिक हो सकता है। तीन मानक विधियाँ समान इनपुट से इस प्रश्न का उत्तर देती हैं, और उनके परिणाम में लोगों की अपेक्षा से अधिक अंतर होता है।
Value at risk वास्तव में क्या मापता है
VaR नुकसान के वितरण का एक क्वांटाइल (quantile) है। एक नमूने में हर दैनिक रिटर्न को सबसे खराब से सबसे अच्छे के क्रम में व्यवस्थित करें, खराब छोर से एक प्रतिशत आगे बढ़ें, और जिस रिटर्न पर आप पहुँचते हैं, उसे सकारात्मक नुकसान के रूप में लिखने पर वह 1-दिवसीय 99% ऐतिहासिक VaR होता है। इस संरचना में कुछ भी सबसे खराब स्थिति (worst case) का वादा नहीं करता है। यह केवल उस क्षेत्र की सीमा को चिह्नित करता है जहाँ तक अनुमान का विवरण काम करता है।
यह वह विशेषता है जिसे पाठक सबसे अधिक बार गलत समझते हैं। 99% VaR बताता है कि सबसे खराब एक प्रतिशत दिन इस सीमा से आगे आते हैं, और यह इस पर मौन है कि वे सीमा से कितने आगे हैं। Maximum drawdown एक अलग प्रश्न का उत्तर देता है, जो कि एक बुक द्वारा वास्तव में झेला गया उच्चतम से निम्नतम स्तर तक का नुकसान है, और ये दोनों एक ही पोर्टफोलियो की जोड़ी को विपरीत क्रम में रैंक कर सकते हैं।
नीचे दिए गए सभी आंकड़े एक ही श्रृंखला पर आधारित हैं: 2010 की शुरुआत से 2025 के अंत तक SPY के दैनिक क्लोज, जिन्हें क्लोज-टू-क्लोज प्रतिशत परिवर्तनों में परिवर्तित किया गया है। विंडो को रोलिंग के बजाय स्थिर रखा गया है, और प्रत्येक पैनल उन्हीं तारीखों से श्रृंखला का पुनर्निर्माण करता है, इसलिए रन के बीच आंकड़े बदलते नहीं हैं।
हर आंकड़े के पीछे का पूरा SQL
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
)
SELECT
toString(toYear(date)) AS year,
count() AS sessions,
round(avg(ret_pct), 3) AS mean_return_pct,
round(stddevSamp(ret_pct), 2) AS daily_sigma_pct
FROM rets
GROUP BY year
ORDER BY yearयह श्रृंखला 16 कैलेंडर वर्षों तक फैली है, जिसमें केवल 2010 में 252 सत्र शामिल हैं। इस क्षितिज पर निम्नलिखित सभी बातों के लिए इसकी दो विशेषताएं मायने रखती हैं: औसत सत्र इस स्तर पर लगभग अप्रासंगिक है: 2010 में 0.054%, जबकि दैनिक मानक विचलन, सिग्मा, 1.13% है। और सिग्मा स्थिर नहीं है। 2020 में यह 2.11% प्रतिदिन था, और 2017 में 0.43%। एक सिग्मा दोनों का वर्णन नहीं कर सकता।
Value at risk की गणना कैसे की जाती है, तीन तरीके
Historical VaR: जो हुआ है उससे परसेंटाइल पढ़ें
वास्तविक रिटर्न को क्रमबद्ध करें और परसेंटाइल लें। इसमें किसी वितरण (distribution) का अनुमान नहीं लगाया जाता, जो कि इसका मुख्य आकर्षण है। यह विधि केवल यह मानती है कि नमूने (sample) में पहले से ही उस तरह के दिन शामिल हैं जिन्हें अनुमान में कवर किया जाना है। यदि कॉन्फिडेंस लेवल को काफी आगे तक ले जाया जाए, तो पूरी अवधि के केवल कुछ सबसे खराब सत्र ही उत्तर प्रदान करते हैं।
Parametric VaR: माध्य (mean) में से z गुना सिग्मा घटाना
सीरीज को उसके माध्य और सिग्मा के साथ संक्षेपित करें, फिर मान लें कि रिटर्न एक सामान्य वितरण (normal distribution) का पालन करते हैं। VaR, z गुना सिग्मा में से माध्य घटाने पर प्राप्त होता है, जहाँ z एक मानक सामान्य क्वांटाइल है: 95% पर 1.645, 99% पर 2.326, 99.9% पर 3.090। इसकी गणना तुरंत हो जाती है और यह धारणा एक विशिष्ट दिशा में विफल रहती है। दैनिक इक्विटी रिटर्न सामान्य वक्र (normal curve) की तुलना में बीच में अधिक घने होते हैं और चरम सीमाओं पर बहुत दूर तक जाते हैं। यहाँ सिग्मा वह हर है जो Sharpe ratio को भी वहन करता है, और यह फैट-टेल्ड डेटा के लिए वही अंधा बिंदु (blind spot) लाता है।
Monte Carlo VaR: सिम्युलेट करें, सीड (seed) को पिन करके
एक अनुमानित प्रक्रिया से एक बड़ा सिंथेटिक नमूना लें और ड्रॉ (draws) से परसेंटाइल पढ़ें। नीचे दिया गया पैनल एक हैश सीडेड यूनिफॉर्म सीक्वेंस से बॉक्स-मुलर ट्रांसफॉर्म द्वारा निर्मित 40,000 मानक सामान्य ड्रॉ का उपयोग करता है, जिसे सीरीज के माध्य और सिग्मा के अनुसार स्केल किया गया है। सीड SQL में स्थित है, इसलिए हर बार रन करने पर ड्रॉ समान रहते हैं। सिमुलेशन लचीलापन, पाथ डिपेंडेंस और मल्टी-एसेट कोरिलेशन प्रदान करता है, लेकिन यह वास्तविकता की गारंटी नहीं देता: यदि आप इसे सामान्य वितरण देंगे, तो यह सैंपलिंग नॉइज़ के साथ पैरामीट्रिक उत्तर ही वापस देगा। इसके बजाय देखे गए रिटर्न को फिर से सैंपल करना, जो bootstrapped confidence intervals के पीछे की तकनीक है, वास्तविक टेल (tail) को बनाए रखता है।
हर आंकड़े के पीछे का पूरा SQL
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
),
emp AS
(
SELECT
avg(ret_pct) AS mu,
stddevSamp(ret_pct) AS sd,
quantileExact(0.100)(ret_pct) AS h90,
quantileExact(0.050)(ret_pct) AS h95,
quantileExact(0.025)(ret_pct) AS h975,
quantileExact(0.010)(ret_pct) AS h99,
quantileExact(0.005)(ret_pct) AS h995,
quantileExact(0.001)(ret_pct) AS h999
FROM rets
),
draws AS
(
SELECT
quantileExact(0.100)(z) AS z90,
quantileExact(0.050)(z) AS z95,
quantileExact(0.025)(z) AS z975,
quantileExact(0.010)(z) AS z99,
quantileExact(0.005)(z) AS z995,
quantileExact(0.001)(z) AS z999
FROM
(
SELECT sqrt(-2 * log(u1)) * cos(2 * pi() * u2) AS z
FROM
(
SELECT
(cityHash64('var-seed-u1', i) % 999999937 + 1) / 999999938.0 AS u1,
(cityHash64('var-seed-u2', i) % 999999937 + 1) / 999999938.0 AS u2
FROM (SELECT arrayJoin(range(40000)) AS i)
)
)
)
SELECT
tupleElement(lvl, 1) AS confidence,
round(-1 * tupleElement(lvl, 2), 2) AS historical_var_pct,
round(tupleElement(lvl, 3) * sd - mu, 2) AS parametric_var_pct,
round(-1 * (mu + sd * tupleElement(lvl, 4)), 2) AS monte_carlo_var_pct,
round(-1 * tupleElement(lvl, 2) - (tupleElement(lvl, 3) * sd - mu), 2) AS method_spread
FROM
(
SELECT
mu,
sd,
arrayJoin([
('90.0%', h90, 1.281552, z90, 1),
('95.0%', h95, 1.644854, z95, 2),
('97.5%', h975, 1.959964, z975, 3),
('99.0%', h99, 2.326348, z99, 4),
('99.5%', h995, 2.575829, z995, 5),
('99.9%', h999, 3.090232, z999, 6)
]) AS lvl
FROM emp
CROSS JOIN draws
)
ORDER BY tupleElement(lvl, 5)95.0% स्तर पर तीनों विधियाँ एक-दूसरे के एक पॉइंट के भीतर रहती हैं: 1.66% हिस्टोरिकल, 1.74% पैरामीट्रिक, 1.71% सिम्युलेटेड। 99.9% पर वे अलग हो जाती हैं: 5.85% हिस्टोरिकल बनाम 3.31% पैरामीट्रिक, समान डेटा पर 2.54 प्रतिशत अंकों का अंतर। सिम्युलेटेड कॉलम हर स्तर पर पैरामीट्रिक कॉलम के साथ रहता है, जो कि एक दोष के बजाय एक सीख है। एक सिमुलेशन उसी वितरण को दोहराता है जो उसे दिया गया था।
पैनल को कॉलम के अनुसार नीचे पढ़ें और कॉन्फिडेंस में हर कदम थ्रेशोल्ड को चौड़ा करता है। इसे पंक्ति के अनुसार पढ़ें और वितरण के मध्य में विधि का चुनाव शायद ही कोई प्रभाव डालता है, जबकि टेल (tail) पर यह पूरी तरह हावी रहता है। बिना अपनी विधि और विंडो के उद्धृत की गई VaR सीमा एक ऐसी संख्या नहीं है जिसे कोई और दोबारा प्राप्त कर सके।
VaR आपको क्या नहीं बताता: expected shortfall
Expected shortfall, जिसे conditional VaR भी कहा जाता है, उन दिनों के नुकसान का औसत निकालता है जब नुकसान VaR की सीमा को पार कर जाता है। VaR यह चिह्नित करता है कि जोखिम का 'tail' कहाँ से शुरू होता है। Expected shortfall यह मापता है कि उस सीमा के भीतर कितना नुकसान हो सकता है।
हर आंकड़े के पीछे का पूरा SQL
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
),
qs AS
(
SELECT
quantileExact(0.100)(ret_pct) AS q90,
quantileExact(0.050)(ret_pct) AS q95,
quantileExact(0.025)(ret_pct) AS q975,
quantileExact(0.010)(ret_pct) AS q99,
quantileExact(0.005)(ret_pct) AS q995,
quantileExact(0.001)(ret_pct) AS q999
FROM rets
),
tails AS
(
SELECT
any(q90) AS var90,
any(q95) AS var95,
any(q975) AS var975,
any(q99) AS var99,
any(q995) AS var995,
any(q999) AS var999,
avgIf(ret_pct, ret_pct <= q90) AS es90,
avgIf(ret_pct, ret_pct <= q95) AS es95,
avgIf(ret_pct, ret_pct <= q975) AS es975,
avgIf(ret_pct, ret_pct <= q99) AS es99,
avgIf(ret_pct, ret_pct <= q995) AS es995,
avgIf(ret_pct, ret_pct <= q999) AS es999
FROM rets
CROSS JOIN qs
HAVING countIf(ret_pct <= q999) > 0
)
SELECT
tupleElement(lvl, 1) AS confidence,
round(-1 * tupleElement(lvl, 2), 2) AS historical_var_pct,
round(-1 * tupleElement(lvl, 3), 2) AS expected_shortfall_pct,
round(tupleElement(lvl, 3) / tupleElement(lvl, 2), 2) AS es_to_var_ratio
FROM
(
SELECT
arrayJoin([
('90.0%', var90, es90, 1),
('95.0%', var95, es95, 2),
('97.5%', var975, es975, 3),
('99.0%', var99, es99, 4),
('99.5%', var995, es995, 5),
('99.9%', var999, es999, 6)
]) AS lvl
FROM tails
)
ORDER BY tupleElement(lvl, 4)99.0% पर, इस सीरीज का VaR 3.09% है और expected shortfall 4.43% है, या थ्रेशोल्ड का 1.44 गुना है। सामान्य वितरण (normal distribution) के तहत, समान स्तर पर यह अनुपात लगभग 1.15 के आसपास रहता है। यहां तक कि 99.9% पर भी, जहाँ थ्रेशोल्ड पहले ही 5.85% तक पहुँच चुका है, औसत breach वाले दिन का नुकसान 8.14% दर्ज किया गया है। केवल VaR पर आधारित सीमा हर breach को एक समान घटना मानती है, और अनुपात वाला कॉलम यह मापता है कि यह धारणा कितनी गलत है।
क्या 1-day 99% VaR का मतलब एक संस्थान और एक ट्रेडर के लिए एक ही है?
नहीं, और यह अंतर मुख्य रूप से समय-सीमा (horizon) का है। एक ट्रेडर जो रात भर के लिए पोजीशन बंद (flat) रखता है, वह कुछ घंटों के लिए जोखिम उठाता है, इसलिए एक सत्र की सीमा उसकी होल्डिंग अवधि के अनुरूप होती है, हालांकि इंट्राडे उतार-चढ़ाव क्लोज-टू-क्लोज संख्या से काफी अधिक हो सकते हैं। लंबी अवधि की देनदारियों को पूरा करने वाला एक संस्थान वर्षों तक पोजीशन रखता है, उसका एक्सपोज़र कई तिमाहियों तक बना रहता है, और उसका 1-day 99% आंकड़ा उसके द्वारा उठाए जा रहे जोखिम के विवरण के बजाय पूंजी और निगरानी का एक साधन मात्र होता है। बैंक पूंजी नियम वर्षों तक 1-day 99% VaR पर आधारित थे, और बाद में Basel बाजार जोखिम ढांचे ने इस माप को 97.5% expected shortfall में बदल दिया।
समय-सीमाओं के बीच का मानक सेतु 'समय के वर्गमूल' (square root of time) द्वारा स्केलिंग करना है: एक सत्र के आंकड़े को सत्रों में समय-सीमा के वर्गमूल से गुणा करें। यह चरण मानता है कि रिटर्न स्वतंत्र हैं और सिग्मा स्थिर है, जबकि ऊपर दी गई वर्ष-दर-वर्ष सिग्मा कॉलम पहले ही दिखाती है कि यह धारणा विफल हो रही है।
हर आंकड़े के पीछे का पूरा SQL
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-11-01'
AND date < '2026-01-01'
GROUP BY date
),
multi AS
(
SELECT
date,
100 * (close_px / p1 - 1) AS r1,
100 * (close_px / p5 - 1) AS r5,
100 * (close_px / p10 - 1) AS r10,
100 * (close_px / p20 - 1) AS r20
FROM
(
SELECT
date,
close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p1,
lagInFrame(close_px, 5) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p5,
lagInFrame(close_px, 10) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p10,
lagInFrame(close_px, 20) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p20
FROM px
)
WHERE date >= '2010-01-01' AND p20 > 0
),
q AS
(
SELECT
quantileExact(0.01)(r1) AS q1,
quantileExact(0.01)(r5) AS q5,
quantileExact(0.01)(r10) AS q10,
quantileExact(0.01)(r20) AS q20
FROM multi
)
SELECT
tupleElement(h, 1) AS horizon,
round(-1 * tupleElement(h, 3), 2) AS actual_var_pct,
round(-1 * q1 * sqrt(tupleElement(h, 2)), 2) AS sqrt_scaled_var_pct,
round(tupleElement(h, 3) / (q1 * sqrt(tupleElement(h, 2))), 2) AS actual_to_scaled_ratio
FROM
(
SELECT
q1,
arrayJoin([
('1 session', 1.0, q1, 1),
('5 sessions', 5.0, q5, 2),
('10 sessions', 10.0, q10, 3),
('20 sessions', 20.0, q20, 4)
]) AS h
FROM q
)
ORDER BY tupleElement(h, 4)पहली पंक्ति एक पहचान जांच है: 1 session पर स्केल्ड आंकड़ा मापे गए आंकड़े के बराबर है, जिसका अनुपात 1 है। 20 sessions पर दोनों अलग हो जाते हैं, और उस दिशा में नहीं जिसके बारे में शॉर्टकट के लिए आमतौर पर चेतावनी दी जाती है: एक सत्र की संख्या को स्केल करने पर 13.8% प्राप्त होता है, जबकि उस समय-सीमा पर मापा गया रिटर्न 10.7% है, जिसका अनुपात 0.78 है। इस विंडो पर स्केल्ड आंकड़ा मापे गए मल्टी-सेशन टेल से ऊपर रहता है। यहाँ दो पैटर्न एक-दूसरे के विपरीत काम करते हैं। एक फैट-टेल्ड सिंगल सेशन डिस्ट्रीब्यूशन रिटर्न के जुड़ने पर पतला हो जाता है, और एग्रीगेटेड 99% क्वांटाइल समय-सीमा के वर्गमूल की तुलना में धीमी गति से बढ़ता है। वोलैटिलिटी क्लस्टरिंग दूसरी दिशा में काम करती है, जो एक विंडो के भीतर हिंसक सत्रों को इकट्ठा करती है। इस श्रृंखला पर पहला पैटर्न दोनों में से बड़ा है, और किसी अन्य विंडो या एसेट में किसी भी दिशा की गारंटी नहीं है, जो कि मुख्य बिंदु है: मल्टीप्लायर एक धारणा है, माप नहीं। वह क्लस्टरिंग ही वह गुण है जिस पर volatility targeting पोजीशन का आकार बदलते समय निर्भर करती है।
एक और सीमा, जिसे स्पष्ट रूप से कहा गया है। ऊपर दी गई हर चीज़ एक व्यापक इंडेक्स फंड पर सिंगल एसेट VaR है। दस संबंधित नामों की एक बुक में concentration risk होता है जिसे पोर्टफोलियो VaR एक कोरिलेशन अनुमान के माध्यम से संभालता है, और कोरिलेशन ठीक उसी समय सबसे अधिक बदलते हैं जब उस अनुमान का महत्व सबसे अधिक होता है।
विधि संबंधी नोट्स और परंपराएं
- परसेंटाइल एक सटीक क्वांटाइल से आते हैं न कि सैंपल अनुमान से, और मोंटे कार्लो ड्रॉ SQL में लिखे गए एक हैश सीडेड यूनिफॉर्म सीक्वेंस से आते हैं, इसलिए यहाँ हर आंकड़ा समान मान पर फिर से गणना करता है।
- रिटर्न क्लोज-टू-क्लोज मूल्य परिवर्तन हैं जिसमें डिविडेंड का पुनर्निवेश नहीं होता है, जो एक सत्र के VaR के लिए सामान्य परंपरा है।
- होराइजन पैनल ओवरलैपिंग विंडो का उपयोग करता है: लगातार 20 सत्रों के रिटर्न 19 दिनों को साझा करते हैं, इसलिए इसका टेल पंक्ति गणना द्वारा निहित स्वतंत्र अवलोकनों की तुलना में बहुत कम स्वतंत्र अवलोकनों पर आधारित होता है।
अक्सर पूछे जाने वाले प्रश्न
1-day 99% VaR क्या है?
यह नुकसान का वह स्तर है जिसे हर एक सौ ट्रेडिंग दिनों में से सबसे खराब एक दिन पार कर जाता है, जिसे एक सत्र में मापा जाता है। ऊपर दी गई श्रृंखला पर ऐतिहासिक अनुमान 3.09% है। यह आंकड़ा एक सीमा निर्धारित करता है और इसके आगे होने वाले नुकसान के आकार के बारे में कुछ नहीं बताता।
VaR गणना की कौन सी विधि सबसे सटीक है?
तीनों में से कोई भी विधि सैद्धांतिक रूप से सटीक नहीं है, क्योंकि प्रत्येक अलग-अलग मान्यताओं के आधार पर प्रश्न का उत्तर देती है। Historical VaR दिए गए नमूने के प्रति वफादार है और नमूने में शामिल न की गई किसी भी चीज़ के बारे में मौन है। Parametric VaR सस्ता है और इक्विटी के चरम जोखिमों (tails) को कम करके आंकता है। Monte Carlo केवल उस वितरण (distribution) जितना ही अच्छा है जो इसमें डाला गया है।
VaR और expected shortfall में क्या अंतर है?
VaR एक चुने हुए विश्वास स्तर (confidence level) पर सीमा है। Expected shortfall उन दिनों के नुकसान का औसत निकालता है जो इस सीमा को पार कर जाते हैं। इस श्रृंखला पर 99% स्तर पर expected shortfall, VaR का 1.44 गुना है, जबकि सामान्य वितरण (normal distribution) के तहत यह लगभग 1.15 गुना होता है।
क्या आप 1-day VaR को 10-day VaR में बदल सकते हैं?
10 के वर्गमूल (square root) से गुणा करना एक मानक शॉर्टकट है, और यह मानता है कि रिटर्न स्थिर अस्थिरता (constant volatility) के साथ स्वतंत्र हैं। होराइजन पैनल इस अंतर को मापता है: 20 सत्रों में, स्केल किया गया आंकड़ा 13.8% रहा, जबकि मापा गया आंकड़ा 10.7% था।
ऊपर दिए गए प्रत्येक पैनल में वह SQL शामिल है जिसने इसे तैयार किया है। किसी अलग ticker या समय-सीमा पर इन्हीं तीन गणनाओं को चलाने के लिए, Strasmore टर्मिनल पर सादे अंग्रेजी में अनुरोध करें।