Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-21

วิธีคำนวณ Value at Risk: 3 รูปแบบที่นักลงทุนควรรู้

อธิบายการคำนวณ Value at Risk ด้วยวิธี Historical, Parametric และ Monte Carlo บนผลตอบแทน SPY พร้อมวิเคราะห์ข้อจำกัดของ VaR และความสำคัญของ Expected Shortfall ที่มักถูกมองข้าม

มูลค่าความเสี่ยง (Value at Risk หรือ VaR)

Value at Risk หรือ VaR คำนวณโดยการกำหนดกรอบเวลาและระดับความเชื่อมั่น จากนั้นจึงอ่านค่าเปอร์เซ็นไทล์จากชุดข้อมูลผลตอบแทน หาก VaR หนึ่งวัน ณ ระดับความเชื่อมั่นร้อยละเก้าสิบเก้าเท่ากับร้อยละสอง หมายความว่าผลขาดทุนจะต่ำกว่าร้อยละสองในเก้าสิบเก้าจากทุกหนึ่งร้อยวันทำการ และจะเกินกว่านั้นในวันที่หนึ่งร้อย วิธีการมาตรฐานสามวิธีใช้ข้อมูลนำเข้าชุดเดียวกันในการตอบคำถามนี้ แต่ผลลัพธ์ที่ได้กลับแตกต่างกันมากกว่าที่คนส่วนใหญ่คาดคิด

สิ่งที่ Value at Risk วัดผลจริง ๆ

VaR คือค่า Quantile ของการกระจายตัวของผลขาดทุน หากนำผลตอบแทนรายวันในกลุ่มตัวอย่างมาเรียงลำดับจากแย่ที่สุดไปดีที่สุด แล้วนับถอยหลังเข้ามาหนึ่งเปอร์เซ็นต์จากฝั่งที่แย่ที่สุด ผลตอบแทนที่จุดนั้นเมื่อแสดงเป็นค่าความสูญเสียที่เป็นบวก คือค่า 1-day 99% historical VaR การคำนวณนี้ไม่ได้ให้คำมั่นสัญญาถึงกรณีที่เลวร้ายที่สุด แต่มันเป็นเพียงการระบุขอบเขตของพื้นที่ที่การประมาณการนั้นครอบคลุมถึง

นี่คือคุณสมบัติที่ผู้อ่านมักเข้าใจผิดบ่อยที่สุด ค่า 99% VaR ระบุว่าวันที่แย่ที่สุดหนึ่งเปอร์เซ็นต์จะอยู่นอกเหนือจากเกณฑ์นี้ไป และไม่ได้ระบุว่าเลยไปไกลเพียงใด Maximum drawdown ตอบคำถามที่ต่างออกไป คือผลขาดทุนจากจุดสูงสุดลงสู่จุดต่ำสุดที่พอร์ตการลงทุนนั้นเคยเผชิญจริง ซึ่งทั้งสองค่านี้อาจจัดอันดับพอร์ตการลงทุนคู่เดียวกันในลำดับที่ตรงกันข้ามได้

ตัวเลขทุกตัวด้านล่างอ้างอิงจากข้อมูลชุดเดียว คือราคาปิดรายวันของ SPY ตั้งแต่ต้นปี 2010 จนถึงสิ้นเดือนธันวาคม 2025 โดยแปลงเป็นเปอร์เซ็นต์การเปลี่ยนแปลงแบบวันต่อวัน หน้าต่างข้อมูลถูกกำหนดไว้ตายตัวแทนที่จะเป็นแบบเคลื่อนที่ และแต่ละส่วนจะสร้างข้อมูลชุดเดิมขึ้นใหม่จากวันที่เดียวกัน ดังนั้นตัวเลขจึงไม่มีการคลาดเคลื่อนระหว่างการประมวลผล

คำสั่งดึงข้อมูลชุดข้อมูลผลตอบแทน: ผลตอบแทนรายวันของ SPY แยกตามปีปฏิทิน ตั้งแต่ปี 2010 ถึง 2025
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
Run this yourself

ข้อมูลชุดนี้ครอบคลุมระยะเวลา 16 ปีปฏิทิน โดยมี 252 วันทำการเฉพาะใน 2010 เพียงปีเดียว คุณสมบัติสองประการของข้อมูลนี้มีความสำคัญต่อทุกสิ่งที่ตามมา ค่าเฉลี่ยของวันทำการแทบไม่มีนัยสำคัญในกรอบเวลานี้ โดยอยู่ที่ 0.054% ใน 2010 เมื่อเทียบกับส่วนเบี่ยงเบนมาตรฐานรายวัน หรือ sigma ที่ 1.13% และค่า sigma ไม่ใช่ค่าคงที่ โดย 2020 มีค่าอยู่ที่ 2.11% ต่อวัน ส่วน 2017 อยู่ที่ 0.43% ดังนั้นค่า sigma เพียงค่าเดียวจึงไม่สามารถอธิบายทั้งสองช่วงเวลาได้

วิธีคำนวณ Value at Risk ทั้งสามรูปแบบ

Historical VaR: อ่านค่าเปอร์เซ็นไทล์จากเหตุการณ์ที่เกิดขึ้นจริง

เรียงลำดับผลตอบแทนที่เกิดขึ้นจริงแล้วเลือกค่าตามเปอร์เซ็นไทล์ วิธีนี้ไม่ได้ตั้งสมมติฐานเกี่ยวกับรูปแบบการกระจายตัวของข้อมูล ซึ่งเป็นจุดเด่นของวิธีนี้ สิ่งที่วิธีนี้ตั้งสมมติฐานคือชุดข้อมูลตัวอย่างต้องครอบคลุมลักษณะของวันที่ต้องการประเมินไว้แล้ว หากกำหนดระดับความเชื่อมั่นไว้สูงมาก คำตอบจะขึ้นอยู่กับเพียงไม่กี่วันที่เลวร้ายที่สุดในช่วงเวลาที่เลือกมาเท่านั้น

Parametric VaR: ค่าเฉลี่ยลบด้วย z คูณ sigma

สรุปชุดข้อมูลด้วยค่าเฉลี่ยและค่า sigma จากนั้นตั้งสมมติฐานว่าผลตอบแทนมีการกระจายตัวแบบปกติ (normal distribution) ค่า VaR คือ z คูณ sigma ลบด้วยค่าเฉลี่ย โดยที่ z คือค่า standard normal quantile ซึ่งเท่ากับ 1.645 ที่ระดับ 95%, 2.326 ที่ระดับ 99% และ 3.090 ที่ระดับ 99.9% การคำนวณทำได้ทันที แต่สมมติฐานนี้มีความผิดพลาดในทิศทางที่ชัดเจน ผลตอบแทนรายวันของหุ้นมักจะเกาะกลุ่มกันแน่นกว่าเส้นโค้งปกติในช่วงกลาง และมีค่าที่ปลายหางไกลกว่ามาก ค่า sigma ในที่นี้คือตัวหารที่ใช้ใน Sharpe ratio และนำจุดบอดเดียวกันมาสู่ข้อมูลที่มีลักษณะ fat-tailed

Monte Carlo VaR: จำลองสถานการณ์โดยกำหนดค่าเริ่มต้น (seed)

สุ่มตัวอย่างสังเคราะห์จำนวนมากจากกระบวนการที่ตั้งสมมติฐานไว้ แล้วอ่านค่าเปอร์เซ็นไทล์จากผลการสุ่ม ตารางด้านล่างใช้การสุ่มแบบ standard normal จำนวน 40,000 ครั้ง ซึ่งสร้างขึ้นด้วยวิธี Box-Muller จากลำดับตัวเลขสุ่มที่กำหนดค่าเริ่มต้นไว้ (seeded uniform sequence) โดยปรับสเกลตามค่าเฉลี่ยและ sigma ของชุดข้อมูล ค่าเริ่มต้นนี้ถูกเก็บไว้ใน SQL ดังนั้นผลการสุ่มจะเหมือนเดิมทุกครั้งที่รันใหม่ การจำลองสถานการณ์ให้ความยืดหยุ่น ความสัมพันธ์ตามเส้นทาง (path dependence) และความสัมพันธ์ระหว่างสินทรัพย์หลายตัว แต่ไม่ได้ให้ความสมจริง หากป้อนข้อมูลการกระจายตัวแบบปกติเข้าไป ผลลัพธ์ที่ได้ก็จะเป็นคำตอบแบบ parametric ที่มีสัญญาณรบกวนจากการสุ่มเพิ่มเข้ามา การสุ่มตัวอย่างจากผลตอบแทนที่เกิดขึ้นจริง (resampling) ซึ่งเป็นเทคนิคเบื้องหลัง bootstrapped confidence intervals จะช่วยรักษาลักษณะของปลายหางข้อมูลจริงไว้ได้

คำสั่งดึงข้อมูลหนึ่งชุดข้อมูล สามวิธีคำนวณ: 1-day VaR ที่ระดับความเชื่อมั่น 6 ระดับ
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)
Run this yourself

ที่ระดับ 95.0% ทั้งสามวิธีให้ผลลัพธ์ใกล้เคียงกันภายในหนึ่งจุด: 1.66% สำหรับ historical, 1.74% สำหรับ parametric และ 1.71% สำหรับ simulated แต่เมื่อถึงระดับ 99.9% ผลลัพธ์จะเริ่มแตกต่างกัน: 5.85% สำหรับ historical เทียบกับ 3.31% สำหรับ parametric ซึ่งมีส่วนต่างถึง 2.54 เปอร์เซ็นต์จากข้อมูลชุดเดียวกัน คอลัมน์ที่ได้จากการจำลองสถานการณ์จะแสดงผลเคียงข้างกับคอลัมน์ parametric ในทุกระดับ ซึ่งถือเป็นบทเรียนมากกว่าจะเป็นข้อบกพร่อง เพราะการจำลองสถานการณ์จะสะท้อนรูปแบบการกระจายตัวตามที่ได้รับมาเท่านั้น

หากอ่านตารางในแนวตั้ง แต่ละระดับความเชื่อมั่นที่เพิ่มขึ้นจะทำให้เกณฑ์กว้างขึ้น หากอ่านในแนวนอน การเลือกวิธีคำนวณแทบไม่มีผลในช่วงกลางของการกระจายตัว แต่จะมีอิทธิพลอย่างมากที่ปลายหาง ขีดจำกัด VaR ที่ระบุโดยไม่มีการแจ้งวิธีคำนวณและช่วงเวลาที่ใช้ จึงไม่ใช่ตัวเลขที่ผู้อื่นจะสามารถคำนวณซ้ำได้

สิ่งที่ VaR ไม่ได้บอกคุณ: Expected shortfall

Expected shortfall หรือที่เรียกว่า conditional VaR คือค่าเฉลี่ยของผลขาดทุนในวันที่มูลค่าความเสียหายเกินกว่าระดับ VaR โดย VaR เป็นตัวกำหนดจุดเริ่มต้นของส่วนหางของความเสี่ยง (tail) ในขณะที่ Expected shortfall จะวัดขนาดของความเสียหายที่อยู่ภายในส่วนหางนั้น

คำสั่งดึงข้อมูลการเปรียบเทียบ VaR กับ 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)
Run this yourself

99.0% ค่า VaR ของชุดข้อมูลนี้อยู่ที่ 3.09% และค่า Expected shortfall อยู่ที่ 4.43% หรือคิดเป็น 1.44 เท่าของเกณฑ์ดังกล่าว ภายใต้การแจกแจงแบบปกติ อัตราส่วนนี้ควรจะอยู่ที่ประมาณ 1.15 ในระดับเดียวกัน แม้แต่ที่ 99.9% ซึ่งเกณฑ์ได้ขยับไปถึง 5.85% แล้ว ค่าเฉลี่ยของวันที่เกิดความเสียหายเกินเกณฑ์ยังคงอยู่ที่ 8.14% การกำหนดวงเงินโดยพิจารณาจาก VaR เพียงอย่างเดียวถือว่าทุกเหตุการณ์ที่เกินเกณฑ์มีความเท่าเทียมกัน ซึ่งคอลัมน์อัตราส่วนจะเป็นตัวชี้วัดว่าแนวคิดดังกล่าวไม่เป็นความจริงเพียงใด

ค่า 1-day 99% VaR มีความหมายเหมือนกันสำหรับสถาบันการเงินและเทรดเดอร์หรือไม่

ไม่เหมือนกัน และความแตกต่างส่วนใหญ่มาจากกรอบเวลา เทรดเดอร์ที่ปิดสถานะก่อนข้ามคืนจะถือความเสี่ยงเพียงไม่กี่ชั่วโมง ดังนั้นเกณฑ์หนึ่งรอบการซื้อขายจึงสอดคล้องกับระยะเวลาการถือครอง แม้ว่าความเคลื่อนไหวระหว่างวันอาจผันผวนเกินกว่าตัวเลขราคาปิดต่อราคาปิดไปมากก็ตาม ในขณะที่สถาบันการเงินซึ่งมีภาระผูกพันระยะยาวจะถือครองสถานะเป็นปี และมีความเสี่ยงที่ครอบคลุมไปถึงระดับไตรมาส ดังนั้นตัวเลข 1-day 99% จึงทำหน้าที่เป็นเพียงเครื่องมือสำหรับกำกับเงินกองทุนและการติดตามผล มากกว่าจะเป็นการอธิบายความเสี่ยงที่แท้จริงที่สถาบันนั้นแบกรับอยู่ กฎเกณฑ์เงินกองทุนของธนาคารใช้ค่า 1-day 99% VaR มานานหลายปี ก่อนที่กรอบการกำกับดูแลความเสี่ยงด้านตลาดของ Basel จะเปลี่ยนไปใช้การวัดแบบ 97.5% expected shortfall ในภายหลัง

วิธีการเชื่อมโยงระหว่างกรอบเวลาที่เป็นมาตรฐานคือการปรับสเกลด้วยรากที่สองของเวลา (square root of time) โดยการนำตัวเลขของหนึ่งรอบการซื้อขายมาคูณด้วยรากที่สองของจำนวนรอบในกรอบเวลาที่ต้องการ ขั้นตอนนี้ตั้งอยู่บนสมมติฐานว่าผลตอบแทนมีความเป็นอิสระต่อกันและมีค่า sigma คงที่ ซึ่งคอลัมน์ sigma รายปีที่แสดงไว้ข้างต้นได้ชี้ให้เห็นแล้วว่าสมมติฐานดังกล่าวไม่เป็นความจริง

คำสั่งดึงข้อมูลการปรับสเกลตามเวลา (Square root of time) เทียบกับผลขาดทุนจริงในหลายช่วงการซื้อขาย ที่ระดับ 99%
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)
Run this yourself

แถวแรกเป็นการตรวจสอบความถูกต้อง: ที่ 1 session ตัวเลขที่ปรับสเกลแล้วจะมีค่าเท่ากับตัวเลขที่วัดได้จริง คิดเป็นอัตราส่วน 1 เมื่อขยับออกไปที่ 20 sessions ทั้งสองค่าเริ่มแยกออกจากกัน และไม่ได้เป็นไปในทิศทางที่มักมีการเตือนเกี่ยวกับทางลัดนี้ โดยการปรับสเกลจากตัวเลขหนึ่งรอบการซื้อขายให้ค่าเท่ากับ 13.8% ในขณะที่ผลตอบแทนที่วัดได้จริงในช่วงเวลาดังกล่าวอยู่ที่ 10.7% ซึ่งคิดเป็นอัตราส่วน 0.78 ในช่วงเวลานี้ ตัวเลขที่ปรับสเกลแล้วมีค่าสูงกว่าค่าที่วัดได้จริงจากส่วนหางของข้อมูลหลายรอบการซื้อขาย มีสองรูปแบบที่ส่งผลกระทบต่อกันในที่นี้ ประการแรก การกระจายตัวของผลตอบแทนหนึ่งรอบการซื้อขายที่มีส่วนหางหนา (fat-tailed) จะบางลงเมื่อนำผลตอบแทนมารวมกัน ทำให้ค่า 99% quantile ที่รวมผลตอบแทนแล้วขยายตัวช้ากว่ารากที่สองของกรอบเวลา ประการที่สองคือการเกาะกลุ่มของความผันผวน (volatility clustering) ซึ่งส่งผลในทางตรงกันข้าม โดยการสะสมช่วงเวลาที่รุนแรงไว้ภายในกรอบเวลาเดียวกัน สำหรับชุดข้อมูลนี้ รูปแบบแรกมีอิทธิพลมากกว่า และไม่มีการรับประกันว่าทิศทางจะเป็นเช่นนี้ในกรอบเวลาอื่นหรือสินทรัพย์อื่น ซึ่งนั่นคือประเด็นสำคัญ: ตัวคูณเป็นเพียงสมมติฐาน ไม่ใช่การวัดผล และการเกาะกลุ่มของความผันผวนนี้เองคือคุณสมบัติที่ volatility targeting ใช้ในการปรับขนาดสถานะ

ข้อจำกัดอีกประการหนึ่งที่ต้องกล่าวถึงอย่างชัดเจนคือ ข้อมูลทั้งหมดข้างต้นเป็น VaR ของสินทรัพย์เดี่ยวในกองทุนดัชนีขนาดใหญ่ พอร์ตการลงทุนที่ประกอบด้วยหุ้นสิบตัวที่มีความสัมพันธ์กันจะมีความเสี่ยง concentration risk ซึ่ง VaR ของพอร์ตการลงทุนจะจัดการผ่านการประมาณค่าความสัมพันธ์ (correlation estimate) แต่ความสัมพันธ์มักจะเปลี่ยนแปลงมากที่สุดในช่วงเวลาที่การประมาณค่าดังกล่าวมีความสำคัญที่สุด

หมายเหตุเกี่ยวกับระเบียบวิธีและข้อตกลง
  • เปอร์เซ็นไทล์คำนวณจากค่า quantile ที่แม่นยำแทนการใช้ค่าประมาณจากการสุ่มตัวอย่าง และการสุ่มแบบ Monte Carlo มาจากลำดับตัวเลขสุ่มที่กำหนดค่าเริ่มต้น (seed) ไว้ใน SQL ดังนั้นทุกตัวเลขในที่นี้จึงคำนวณออกมาได้ค่าเดิมเสมอ
  • ผลตอบแทนคือการเปลี่ยนแปลงของราคาปิดต่อราคาปิดโดยไม่มีการนำเงินปันผลกลับมาลงทุนใหม่ ซึ่งเป็นข้อตกลงมาตรฐานสำหรับการคำนวณ 1-day VaR
  • แผงกรอบเวลาใช้หน้าต่างข้อมูลที่ซ้อนทับกัน (overlapping windows): ผลตอบแทน 20 รอบการซื้อขายที่ต่อเนื่องกันจะใช้ข้อมูล 19 วันร่วมกัน ดังนั้นส่วนหางของข้อมูลจึงอ้างอิงจากจำนวนข้อมูลที่เป็นอิสระต่อกันน้อยกว่าที่จำนวนแถวแสดงไว้

คำถามที่พบบ่อย

1-day 99% VaR คืออะไร

คือระดับผลขาดทุนที่เลวร้ายที่สุดหนึ่งวันในรอบหนึ่งร้อยวันทำการ โดยวัดผลในช่วงเวลาหนึ่งเซสชัน สำหรับชุดข้อมูลข้างต้น ค่าประมาณการย้อนหลังอยู่ที่ 3.09% ตัวเลขนี้ระบุเพียงเกณฑ์ขั้นต่ำและไม่ได้บ่งบอกถึงขนาดของผลขาดทุนที่จะเกิดขึ้นเกินกว่าระดับดังกล่าว

วิธีการคำนวณ VaR แบบใดแม่นยำที่สุด

ไม่มีวิธีใดในสามวิธีนี้ที่แม่นยำในเชิงนามธรรม เนื่องจากแต่ละวิธีตอบคำถามภายใต้สมมติฐานที่แตกต่างกัน Historical VaR จะยึดตามกลุ่มตัวอย่างที่ได้รับและไม่สามารถคาดการณ์สิ่งที่อยู่นอกเหนือจากตัวอย่างนั้นได้ Parametric VaR มีต้นทุนต่ำแต่ประเมินความเสี่ยงส่วนหาง (tails) ของหุ้นต่ำเกินไป ส่วน Monte Carlo จะแม่นยำเท่ากับคุณภาพของข้อมูลการกระจายตัวที่ป้อนเข้าไปเท่านั้น

VaR และ expected shortfall แตกต่างกันอย่างไร

VaR คือเกณฑ์วัดที่ระดับความเชื่อมั่นที่เลือกไว้ ส่วน expected shortfall คือค่าเฉลี่ยของผลขาดทุนในวันที่เกินเกณฑ์ดังกล่าว สำหรับชุดข้อมูลนี้ expected shortfall ที่ระดับเกณฑ์ร้อยละเก้าสิบเก้าอยู่ที่ 1.44 เท่าของ VaR เมื่อเทียบกับประมาณหนึ่งจุดหนึ่งห้าเท่าภายใต้การกระจายตัวแบบปกติ (normal distribution)

สามารถแปลง 1-day VaR เป็น 10-day VaR ได้หรือไม่

การคูณด้วยรากที่สองของสิบเป็นวิธีลัดมาตรฐาน โดยมีสมมติฐานว่าผลตอบแทนมีความเป็นอิสระต่อกันและมีความผันผวนคงที่ แผงข้อมูลช่วงเวลา (horizon panel) แสดงให้เห็นถึงช่องว่างดังกล่าว โดยในช่วงยี่สิบเซสชัน ตัวเลขที่คำนวณด้วยวิธีสเกลอยู่ที่ 13.8% เทียบกับค่าที่วัดได้จริงที่ 10.7%


แผงข้อมูลทุกส่วนด้านบนประกอบด้วย SQL ที่ใช้สร้างข้อมูลนั้น หากต้องการคำนวณทั้งสามวิธีนี้กับ ticker หรือช่วงเวลาอื่น สามารถสอบถามเป็นภาษาอังกฤษผ่านทาง Strasmore terminal ได้โดยตรง

#risk#value at risk#expected shortfall#quant#position sizing