Paano Kinakalkula ang VaR: 3 Paraan
Alamin kung paano kinukuwenta ang historical, parametric, at Monte Carlo VaR sa iisang SPY return series, pati ang expected shortfall na hindi nasasaklaw ng VaR.
Kinakalkula ang value at risk, o VaR, sa pamamagitan ng pagtatakda ng time horizon at confidence level, pagkatapos ay pagkuha ng percentile mula sa return series. Ang 1-day 99% VaR na 2% ay nangangahulugang mananatiling mas mababa sa 2% ang loss sa 99 sa bawat 100 trading session, at lalampas dito sa ika-100 session. Tatlong standard method ang sumasagot sa tanong na ito gamit ang magkakaparehong input, ngunit mas malaki ang kanilang pagkakaiba kaysa sa karaniwang inaasahan.
Ano talaga ang sinusukat ng value at risk
Ang VaR ay isang quantile ng loss distribution. Ayusin ang bawat daily return sa sample mula sa pinakamasama hanggang sa pinakamaganda. Pumasok nang 1% mula sa pinakamasamang dulo. Ang return na matatapatan mo, kapag isinulat bilang positive loss, ang 1-day 99% historical VaR. Walang ipinapangakong worst-case ang ganitong pagkukuwenta. Tinutukoy lamang nito ang hangganan ng rehiyong inilalarawan ng estimate.
Ito ang katangiang pinakamadalas mapagkamalan ng mga mambabasa. Ipinapahayag ng 99% VaR na ang pinakamasamang 1% ng mga araw ay nasa lampas ng threshold. Hindi nito sinasabi kung gaano kalayo ang lampas na iyon. Sinasagot ng Maximum drawdown ang ibang tanong: ang aktuwal na peak-to-trough loss na dinaanan ng isang portfolio. Dahil dito, maaari nitong i-rank ang parehong pares ng portfolio sa kabaligtarang pagkakasunod.
Ang bawat figure sa ibaba ay nakabatay sa iisang series: daily closes ng SPY mula sa simula ng 2010 hanggang sa katapusan ng 2025, na ginawang close-to-close percent changes. Nakatakda ang window sa halip na rolling. Muling binubuo ng bawat panel ang series gamit ang parehong mga petsa. Kaya hindi nagbabago ang mga numero sa bawat run.
Ang eksaktong SQL sa likod ng bawat numero
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 yearSaklaw ng series ang 16 calendar years, at 252 sessions sa 2010 lamang. Mahalaga ang dalawang katangian nito sa lahat ng susunod na pagsusuri. Halos walang saysay ang mean session sa ganitong horizon: 0.054% sa 2010, kumpara sa daily standard deviation, sigma, na 1.13%. At hindi constant ang sigma. Nasa 2.11% kada araw ang 2020, habang nasa 0.43% naman ang 2017. Hindi kayang ilarawan ng isang sigma ang dalawang ito.
Tatlong paraan ng pagkalkula ng value at risk
Historical VaR: basahin ang percentile mula sa aktuwal na nangyari
Ayusin ang aktuwal na returns at kunin ang percentile. Walang ipinapalagay na distribution, at iyan ang pangunahing bentahe nito. Ang ipinapalagay naman ng method ay nasa sample na ang uri ng araw na dapat saklawin ng estimate. Kapag itinulak nang sapat ang confidence level, iilang pinakamasamang session lamang sa buong window ang magtatakda ng resulta.
Parametric VaR: mean minus z times sigma
Ibuod ang series gamit ang mean at sigma nito, pagkatapos ay ipagpalagay na sumusunod ang returns sa normal distribution. Ang VaR ay z times sigma minus mean, kung saan ang z ay ang standard normal quantile: 1.645 sa 95%, 2.326 sa 99%, 3.090 sa 99.9%. Agad makukuha ang arithmetic, ngunit may partikular na direksiyong pinagmumulan ng pagkabigo ang assumption. Mas dikit-dikit sa gitna ang daily equity returns kaysa sa normal curve, at mas malayo ang mga ito sa magkabilang extreme. Ang sigma rito ang denominator na ginagamit din sa Sharpe ratio, kaya dala nito ang parehong blind spot sa fat-tailed data.
Monte Carlo VaR: mag-simulate gamit ang nakapirming seed
Bumuo ng malaking synthetic sample mula sa ipinapalagay na process, pagkatapos ay basahin ang percentile mula sa mga draw. Gumagamit ang panel sa ibaba ng 40,000 standard normal draws na binuo sa pamamagitan ng Box-Muller transform mula sa uniform sequence na may seed na hash, at isini-scale sa mean at sigma ng series. Nasa SQL ang seed, kaya magkakapareho ang mga draw sa bawat pag-rerun. Nagbibigay ang simulation ng flexibility, path dependence, at multi-asset correlation, ngunit hindi ito awtomatikong nagiging realistic: kung normal distribution ang ibibigay rito, ibabalik nito ang parametric answer na may sampling noise. Kapag ang observed returns naman ang ni-resample, gaya ng technique sa bootstrapped confidence intervals, nananatiling kasama sa analysis ang aktuwal na tail.
Ang eksaktong SQL sa likod ng bawat numero
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)Sa 95.0% level, halos magkakatulad ang resulta ng tatlong method at hindi lalampas sa isang point ang pagitan: 1.66% historical, 1.74% parametric, 1.71% simulated. Sa 99.9%, naghihiwalay ang mga ito: 5.85% historical laban sa 3.31% parametric, na may pagitan na 2.54 percentage points sa parehong data. Katabi ng parametric column ang simulated column sa bawat level. Iyan ang aral, hindi depekto. Inuulit ng simulation ang anumang distribution na ibinigay rito.
Basahin ang panel pababa sa isang column: sa bawat pagtaas ng confidence, lumuluwag ang threshold. Basahin ito pahalang sa isang row: halos walang epekto ang pagpili ng method sa gitna ng distribution, ngunit nangingibabaw ito sa tail. Ang VaR limit na walang nakasaad na method at window ay hindi numerong kayang i-reproduce ng iba.
Ano ang hindi sinasabi ng VaR: expected shortfall
Ang expected shortfall, na tinatawag ding conditional VaR, ay kumukuha ng average ng mga pagkalugi sa mga araw na lumampas sa VaR. Tinutukoy ng VaR kung saan nagsisimula ang tail. Sinusukat naman ng expected shortfall kung ano ang nasa loob nito.
Ang eksaktong SQL sa likod ng bawat numero
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)Sa 99.0%, ang VaR sa seryeng ito ay 3.09% at ang expected shortfall ay 4.43%, o 1.44 na beses ng threshold. Sa ilalim ng normal distribution, dapat ay nasa humigit-kumulang 1.15 ang ratio na iyon sa parehong level. Kahit sa 99.9%, kung saan umabot na sa 5.85% ang threshold, nasa 8.14% ang average na araw na lumampas dito. Ang limit na nakabatay lamang sa VaR ay itinuturing na magkakapareho ang bawat paglabag, at ipinapakita ng ratio column kung gaano ito kalayo sa katotohanan.
Ang 1-day 99% VaR ba ay pareho ang ibig sabihin para sa isang institusyon at trader?
Hindi. Karamihan sa pagkakaiba ay nasa horizon. Ang trader na walang overnight position ay may risk na tumatagal nang ilang oras, kaya tugma ang one-session threshold sa holding period. Gayunman, maaaring lumampas nang malaki ang intraday path sa close-to-close na halaga. Ang institusyong nagpopondo ng long-dated liabilities ay may mga posisyong hawak nang maraming taon. Umaabot sa quarters ang exposure nito. Kaya ang 1-day 99% figure nito ay ginagamit bilang capital at monitoring artifact, hindi bilang paglalarawan ng aktuwal na risk na dala nito. Sa loob ng maraming taon, nakabatay ang bank capital rules sa 1-day 99% VaR. Kalaunan, inilipat ng Basel market risk framework ang panukat sa 97.5% expected shortfall.
Ang standard na pag-uugnay ng magkakaibang horizon ay scaling gamit ang square root of time: i-multiply ang one-session figure sa square root ng bilang ng sessions sa horizon. Ipinapalagay ng hakbang na ito na independent ang returns at constant ang sigma. Ipinapakita na ng year-by-year sigma column sa itaas kung bakit hindi palaging natutupad ang ikalawang palagay.
Ang eksaktong SQL sa likod ng bawat numero
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)Ang unang row ay isang identity check: sa 1 session, kapantay ng measured figure ang scaled figure, na may ratio na 1. Sa 20 sessions, naghihiwalay ang dalawa. Hindi ito umaayon sa karaniwang babala tungkol sa shortcut: nagbibigay ang scaling ng one-session number ng 13.8%, samantalang ang returns na sinukat sa horizon na iyon ay nag-print ng 10.7%, na may ratio na 0.78. Sa window na ito, mas mataas ang scaled figure kaysa sa measured multi-session tail.
Dalawang pattern ang nagtutulakan sa magkasalungat na direksiyon. Numinipis ang fat-tailed single-session distribution kapag pinagsama ang returns. Dahil dito, mas mabagal lumalaki ang aggregated 99% quantile kaysa sa square root of the horizon. Sa kabilang direksiyon naman, nagsasama-sama ang matitinding sessions dahil sa volatility clustering. Sa series na ito, mas malakas ang unang pattern. Gayunman, hindi garantisado ang alinmang direksiyon sa ibang window o ibang asset. Iyan ang punto: assumption ang multiplier, hindi measurement. Umaasa rin ang volatility targeting sa clustering na ito kapag nire-resize nito ang mga posisyon.
May isa pang limitasyon na dapat sabihin nang malinaw. Ang lahat ng nasa itaas ay single-asset VaR para sa isang broad index fund. Ang portfolio na may sampung correlated names ay may concentration risk. Hinahawakan ito ng portfolio VaR gamit ang correlation estimate. Gayunman, pinakamalaki ang galaw ng correlations sa mismong sandaling pinakamahalaga ang estimate.
Mga tala sa method at conventions
- Kinukuha ang percentiles mula sa exact quantile, hindi sa sampled estimate. Ang Monte Carlo draws ay mula sa hash-seeded uniform sequence na isinulat sa SQL, kaya nagre-recompute sa parehong value ang bawat figure dito.
- Ang returns ay close-to-close price changes na walang dividend reinvestment. Ito ang karaniwang convention para sa one-session VaR.
- Gumagamit ang horizon panel ng overlapping windows: may 19 na magkakaparehong araw ang magkakasunod na 20-session returns. Dahil dito, nakabatay ang tail nito sa mas kaunting independent observations kaysa sa ipinahihiwatig ng row count.
Mga Madalas Itanong
Ano ang 1-day 99% VaR?
Ito ang antas ng pagkalugi na malalampasan sa pinakamasamang 1 sa bawat 100 trading days, na sinusukat sa loob ng isang session. Sa serye sa itaas, ang historical estimate ay 3.09%. Tinutukoy ng figure ang isang threshold at wala itong sinasabi tungkol sa laki ng mga pagkalugi na lampas dito.
Aling paraan ng pagkalkula ng VaR ang pinakatumpak?
Wala sa tatlo ang lubos na tumpak sa pangkalahatan dahil magkakaiba ang mga palagay na pinagbabatayan ng bawat isa. Tapat ang Historical VaR sa sample na ibinigay dito, ngunit wala itong sinasabi tungkol sa mga hindi nasaklaw ng sample. Mura ang Parametric VaR, ngunit minamaliit nito ang matitinding pagkalugi sa equity. Ang Monte Carlo ay nakadepende sa kalidad ng distribution na ginagamit dito.
Ano ang pagkakaiba ng VaR at expected shortfall?
Ang VaR ay ang threshold sa napiling confidence level. Ang expected shortfall ay ang average na pagkalugi sa mga araw na lumampas sa threshold na iyon. Sa seryeng ito, ang expected shortfall sa 99% level ay 1.44 na beses ng VaR, kumpara sa humigit-kumulang 1.15 na beses sa ilalim ng normal distribution.
Maaari bang i-convert ang 1-day VaR sa 10-day VaR?
Ang pagpaparami sa square root ng 10 ang karaniwang shortcut. Ipinapalagay nito na independent ang returns at constant ang volatility. Sinusukat ng horizon panel ang agwat: sa loob ng 20 sessions, ang scaled figure ay 13.8% kumpara sa measured na 10.7%.
May SQL na gumawa sa bawat panel sa itaas. Upang patakbuhin ang parehong tatlong calculation sa ibang ticker o window, hilingin ito sa plain English sa Strasmore terminal.