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

Cara Pengiraan Value at Risk: Tiga Kaedah Utama

Ketahui cara pengiraan Value at Risk menggunakan kaedah sejarah, parametrik dan Monte Carlo pada siri pulangan SPY serta analisis mengenai kekurangan expected shortfall.

Nilai Berisiko (Value at Risk)

Value at Risk, atau VaR, dikira dengan menetapkan tempoh masa, menetapkan tahap keyakinan, dan kemudian membaca persentil daripada siri pulangan. VaR 1 hari 99% sebanyak 2% bermakna kerugian kekal di bawah 2% dalam 99 daripada setiap 100 sesi dan melebihi angka tersebut pada sesi yang keseratus. Tiga kaedah standard menjawab soalan tersebut daripada input yang sama, dan hasilnya berbeza lebih daripada yang dijangkakan oleh kebanyakan orang.

Apakah yang sebenarnya diukur oleh value at risk

VaR ialah kuantil bagi taburan kerugian. Susun setiap pulangan harian dalam sampel daripada yang paling teruk kepada yang terbaik, bergerak satu peratus dari hujung yang buruk, dan pulangan yang anda peroleh, yang ditulis sebagai kerugian positif, ialah VaR sejarah 99% satu hari. Tiada apa-apa dalam pembinaan itu menjanjikan kes terburuk. Ia menandakan pinggir kawasan yang tidak lagi diterangkan oleh anggaran tersebut.

Itulah sifat yang paling kerap disalah anggap oleh pembaca. VaR 99% menyatakan bahawa satu peratus hari yang paling teruk terletak melepasi ambang tersebut, dan ia tidak menyatakan sejauh mana ia melepasi ambang itu. Maximum drawdown menjawab soalan yang berbeza, iaitu kerugian daripada puncak ke palung yang sebenarnya dialami oleh sesuatu buku, dan kedua-duanya boleh menyusun pasangan portfolio yang sama dalam urutan yang bertentangan.

Setiap angka di bawah bersandarkan satu siri: penutup harian SPY dari awal tahun 2010 hingga akhir tahun 2025, yang ditukar kepada perubahan peratusan penutup ke penutup. Tetingkap tersebut ditetapkan dan bukannya bergerak, dan setiap panel membina semula siri daripada tarikh yang sama, jadi angka-angka tersebut tidak berubah antara larian.

PertanyaanSiri pulangan tetap: Pulangan harian SPY mengikut tahun kalendar, 2010 hingga 2025
SQL tepat di sebalik setiap nombor
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

Siri ini merangkumi 16 tahun kalendar, 252 sesi dalam 2010 sahaja. Dua ciri daripadanya penting untuk segala yang menyusul. Sesi purata hampir tidak relevan pada ufuk ini: 0.054% dalam 2010, berbanding sisihan piawai harian, sigma, sebanyak 1.13%. Dan sigma bukanlah pemalar. 2020 berjalan pada 2.11% sehari, 2017 pada 0.43%. Satu sigma tidak dapat menggambarkan kedua-duanya.

Bagaimana value at risk dikira, tiga cara

Historical VaR: baca persentil daripada apa yang telah berlaku

Susun pulangan sebenar dan ambil persentilnya. Tiada taburan diandaikan, itulah tarikannya. Apa yang diandaikan oleh kaedah ini ialah sampel tersebut sudah pun mengandungi jenis hari yang ingin diliputi oleh anggaran itu. Tolak tahap keyakinan cukup jauh dan hanya beberapa sesi terburuk dalam keseluruhan tetingkap yang memberikan jawapannya.

Parametric VaR: min tolak z kali sigma

Ringkaskan siri tersebut dengan min dan sigmanya, kemudian andaikan pulangan mengikut taburan normal. VaR ialah z kali sigma tolak min, dengan z ialah kuantil normal piawai: 1.645 pada 95%, 2.326 pada 99%, 3.090 pada 99.9%. Pengiraan aritmetik adalah serta-merta dan andaian tersebut gagal dalam arah yang khusus. Pulangan ekuiti harian berkumpul lebih rapat daripada lengkung normal di bahagian tengah dan menjangkau lebih jauh pada bahagian ekstrem. Sigma di sini ialah penyebut yang juga membawa Sharpe ratio, dan ia membawa titik buta yang sama kepada data berekor tebal (fat-tailed).

Monte Carlo VaR: simulasi, dengan seed ditetapkan

Ambil sampel sintetik yang besar daripada proses yang diandaikan dan baca persentil daripada hasil cabutan tersebut. Panel di bawah menggunakan 40,000 cabutan normal piawai yang dibina oleh transformasi Box-Muller daripada jujukan seragam yang disemai dengan hash, diskalakan kepada min dan sigma siri tersebut. Seed tersebut terletak dalam SQL, jadi cabutan adalah sama pada setiap kali dijalankan semula. Simulasi memberikan fleksibiliti, kebergantungan laluan dan korelasi berbilang aset, tanpa memberikan realisme: berikan ia taburan normal dan ia akan memberikan semula jawapan parametrik dengan hingar pensampelan di atasnya. Melakukan pensampelan semula terhadap pulangan yang diperhatikan, teknik di sebalik bootstrapped confidence intervals, mengekalkan ekor sebenar dalam permainan.

PertanyaanSatu siri, tiga kaedah: VaR 1 hari pada enam tahap keyakinan
SQL tepat di sebalik setiap nombor
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

Pada tahap 95.0%, ketiga-tiga kaedah berada dalam lingkungan satu mata antara satu sama lain: 1.66% historical, 1.74% parametric, 1.71% simulated. Pada tahap 99.9%, ia mula berbeza: 5.85% historical berbanding 3.31% parametric, jurang sebanyak 2.54 mata peratusan pada data yang sama. Lajur simulated berada di sebelah lajur parametric pada setiap tahap, yang merupakan pengajarannya dan bukannya satu kecacatan. Simulasi menghasilkan semula apa jua taburan yang diberikan kepadanya.

Baca panel ke bawah mengikut lajur dan setiap langkah dalam keyakinan meluaskan ambang. Baca ia merentasi baris dan pilihan kaedah hampir tidak memberi kesan melalui bahagian tengah taburan manakala ia mendominasi bahagian ekor. Had VaR yang disebut tanpa kaedah dan tetingkapnya bukanlah nombor yang boleh dihasilkan semula oleh orang lain.

Perkara yang tidak diberitahu oleh VaR: expected shortfall

Expected shortfall, yang juga dikenali sebagai conditional VaR, mengira purata kerugian pada hari-hari yang melepasi ambang VaR. VaR menandakan titik permulaan ekor taburan. Expected shortfall pula mengukur apa yang terkandung di dalamnya.

PertanyaanVaR berbanding expected shortfall, purata kerugian melepasi ambang
SQL tepat di sebalik setiap nombor
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

Pada 99.0%, VaR bagi siri ini ialah 3.09% dan expected shortfall ialah 4.43%, atau 1.44 kali ganda ambang tersebut. Di bawah taburan normal, nisbah itu akan berada sekitar 1.15 pada tahap yang sama. Walaupun pada 99.9%, di mana ambang telah pun mencecah 5.85%, purata hari pelanggaran berada pada 8.14%. Had yang ditetapkan berdasarkan VaR semata-mata menganggap setiap pelanggaran sebagai peristiwa yang sama, dan lajur nisbah mengukur betapa tidak tepatnya tanggapan tersebut.

Adakah 1-day 99% VaR membawa maksud yang sama bagi institusi dan pedagang?

Tidak, dan perbezaan utamanya adalah pada tempoh masa. Seorang pedagang yang menutup posisi sebelum waktu pasaran tamat (flat overnight) hanya menanggung risiko selama beberapa jam, jadi ambang satu sesi selari dengan tempoh pegangan, walaupun pergerakan intraday boleh melepasi angka close-to-close dengan ketara. Sebuah institusi yang membiayai liabiliti jangka panjang memegang posisi selama bertahun-tahun, pendedahannya merangkumi beberapa suku tahun, dan angka 1-day 99% berfungsi sebagai artifak modal dan pemantauan dan bukannya gambaran risiko sebenar yang ditanggungnya. Peraturan modal bank dibina berasaskan 1-day 99% VaR selama bertahun-tahun, dan rangka kerja risiko pasaran Basel kemudiannya menukar ukuran tersebut kepada 97.5% expected shortfall.

Jambatan standard antara tempoh masa adalah dengan melakukan penskalaan menggunakan punca kuasa dua masa: darabkan angka satu sesi dengan punca kuasa dua tempoh masa dalam sesi. Langkah itu mengandaikan pulangan adalah bebas dengan sigma yang malar, dan lajur sigma tahun demi tahun di atas sudah menunjukkan kegagalan bahagian kedua andaian tersebut.

PertanyaanPenskalaan punca kuasa dua masa berbanding kerugian berbilang sesi yang diukur, tahap 99%
SQL tepat di sebalik setiap nombor
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

Baris pertama ialah semakan identiti: pada 1 session angka yang diskalakan adalah sama dengan angka yang diukur, dengan nisbah 1. Pada 20 sessions kedua-duanya terpisah, dan bukan ke arah yang biasanya diberi amaran tentang jalan pintas tersebut: penskalaan angka satu sesi memberikan 13.8% manakala pulangan yang diukur sepanjang tempoh tersebut mencatatkan 10.7%, dengan nisbah 0.78. Pada tetingkap ini, angka yang diskalakan berada di atas ekor berbilang sesi yang diukur. Dua corak saling bertentangan di sini. Taburan sesi tunggal yang mempunyai ekor tebal (fat-tailed) menjadi nipis apabila pulangan ditambah bersama, dan kuantil 99% agregat kemudiannya melebar dengan lebih perlahan berbanding punca kuasa dua tempoh masa. Volatility clustering pula bertindak sebaliknya, dengan mengumpulkan sesi-sesi yang tidak menentu di dalam satu tetingkap. Dalam siri ini, corak pertama adalah yang lebih besar antara kedua-duanya, dan tiada arah yang dijamin dalam tetingkap lain atau aset lain, itulah intinya: pengganda tersebut adalah satu andaian, bukan ukuran. Clustering tersebut juga merupakan sifat yang disandarkan oleh volatility targeting apabila ia melaraskan saiz posisi.

Satu lagi had, dinyatakan dengan jelas. Segala yang dinyatakan di atas adalah VaR aset tunggal pada dana indeks yang luas. Buku yang mengandungi sepuluh nama yang berkorelasi membawa concentration risk yang dikendalikan oleh VaR portfolio melalui anggaran korelasi, dan korelasi bergerak paling ketara pada saat anggaran tersebut menjadi penting.

Nota kaedah dan konvensyen
  • Persentil diperoleh daripada kuantil tepat dan bukannya anggaran sampel, dan cabutan Monte Carlo diperoleh daripada jujukan seragam yang disemai hash yang ditulis ke dalam SQL, jadi setiap angka di sini dikira semula kepada nilai yang sama.
  • Pulangan adalah perubahan harga close-to-close tanpa pelaburan semula dividen, konvensyen biasa untuk VaR satu sesi.
  • Panel tempoh masa menggunakan tetingkap bertindih: pulangan 20 sesi berturut-turut berkongsi 19 hari, jadi ekornya bergantung pada pemerhatian bebas yang jauh lebih sedikit daripada yang tersirat oleh jumlah baris.

Soalan Lazim

Apakah VaR 1-hari 99%?

Ia merupakan tahap kerugian yang melebihi satu daripada seratus hari dagangan yang paling buruk, diukur sepanjang satu sesi. Pada siri di atas, anggaran sejarah adalah 3.09%. Angka tersebut menamakan satu ambang dan tidak menyatakan apa-apa tentang saiz kerugian yang melebihi tahap itu.

Kaedah pengiraan VaR yang manakah paling tepat?

Tiada satu pun daripada ketiga-tiganya tepat secara abstrak, kerana setiap satunya menjawab soalan di bawah andaian yang berbeza. VaR sejarah adalah setia kepada sampel yang diberikan dan tidak memberikan maklumat tentang apa-apa yang terlepas daripada sampel tersebut. VaR parametrik adalah murah dan meremehkan ekor ekuiti (equity tails). Monte Carlo hanya sebaik taburan yang dimasukkan ke dalamnya.

Apakah perbezaan antara VaR dan expected shortfall?

VaR ialah ambang pada tahap keyakinan yang dipilih. Expected shortfall mengira purata kerugian pada hari-hari yang melepasi ambang tersebut. Pada siri ini, expected shortfall pada tahap 99% berjalan sebanyak 1.44 kali ganda VaR, berbanding kira-kira 1.15 kali ganda di bawah taburan normal.

Bolehkah anda menukarkan VaR 1-hari kepada VaR 10-hari?

Mendarab dengan punca kuasa dua bagi sepuluh adalah jalan pintas standard, dan ia mengandaikan pulangan adalah bebas dengan volatiliti yang malar. Panel ufuk mengukur jurang tersebut: sepanjang dua puluh sesi, angka yang diskalakan berada pada 13.8% berbanding 10.7% yang diukur.


Setiap panel di atas membawa SQL yang menghasilkannya. Untuk menjalankan tiga pengiraan yang sama pada ticker atau tetingkap yang berbeza, mintalah ia dalam bahasa Inggeris yang mudah pada terminal Strasmore.

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