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

Cara Menghitung Value at Risk: 3 Metode

Pelajari historical, parametric, dan Monte Carlo VaR pada satu rangkaian return SPY, serta expected shortfall yang tidak tercakup oleh VaR.

Value at risk, atau VaR, dihitung dengan menetapkan horizon, menetapkan tingkat keyakinan, lalu membaca persentil dari rangkaian return. VaR satu hari 99% sebesar 2% berarti kerugian tetap di bawah 2% pada 99 dari setiap 100 sesi dan melampaui 2% pada sesi ke-100. Tiga metode standar menjawab pertanyaan tersebut dengan input yang identik, tetapi hasilnya berbeda lebih besar daripada yang diperkirakan kebanyakan orang.

Apa yang sebenarnya diukur oleh value at risk

VaR adalah kuantil dari distribusi kerugian. Urutkan setiap return harian dalam sampel dari yang terburuk hingga yang terbaik, bergerak sejauh 1% dari sisi terburuk, lalu return yang dicapai, ditulis sebagai kerugian positif, merupakan historical VaR 1 hari 99%. Tidak ada bagian dari konstruksi ini yang menjanjikan skenario terburuk. VaR hanya menandai batas wilayah yang masih dijelaskan oleh estimasi.

Inilah sifat yang paling sering disalahpahami pembaca. VaR 99% menyatakan bahwa 1% hari dengan kinerja terburuk berada di luar ambang tersebut, tetapi tidak menjelaskan seberapa jauh posisinya di luar ambang. Maximum drawdown menjawab pertanyaan yang berbeda, yaitu kerugian dari titik puncak ke titik terendah yang benar-benar dialami suatu portofolio. Keduanya dapat menghasilkan peringkat yang berlawanan untuk pasangan portofolio yang sama.

Setiap angka di bawah ini didasarkan pada satu seri: harga penutupan harian SPY dari awal 2010 hingga akhir 2025, yang dikonversi menjadi persentase perubahan dari penutupan ke penutupan. Periode ini ditetapkan, bukan menggunakan periode bergulir. Setiap panel membangun kembali seri dari tanggal yang sama, sehingga angkanya tidak berubah antar-run.

QuerySeri return yang dipatok: return harian SPY berdasarkan tahun kalender, 2010 hingga 2025
SQL tepat di balik setiap angka
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

Seri ini mencakup 16 tahun kalender, dengan 252 sesi hanya pada 2010. Dua karakteristiknya penting untuk seluruh pembahasan berikutnya. Rata-rata return per sesi hampir tidak relevan pada horizon ini: 0.054% pada 2010, dibandingkan dengan standar deviasi harian, sigma, sebesar 1.13%. Sigma juga bukan konstanta. 2020 mencatat 2.11% per hari, sedangkan 2017 mencatat 0.43%. Satu nilai sigma tidak dapat menggambarkan keduanya.

Cara menghitung value at risk, tiga metode

Historical VaR: membaca persentil dari kejadian aktual

Urutkan return aktual, lalu ambil persentilnya. Tidak ada distribusi yang diasumsikan, dan di situlah daya tarik metode ini. Namun, metode ini mengasumsikan bahwa sampel sudah memuat jenis hari yang hendak dicakup oleh estimasi. Jika tingkat kepercayaan didorong cukup jauh, hanya beberapa sesi terburuk dalam seluruh periode pengamatan yang menentukan hasilnya.

Parametric VaR: mean dikurangi z dikali sigma

Ringkas seri data dengan mean dan sigma, lalu asumsikan bahwa return mengikuti distribusi normal. VaR adalah z dikali sigma dikurangi mean. z adalah kuantil standar normal: 1.645 pada 95%, 2.326 pada 99%, dan 3.090 pada 99,9%. Perhitungannya cepat, tetapi asumsi ini gagal dengan cara tertentu. Return ekuitas harian lebih terkonsentrasi di sekitar bagian tengah dibandingkan kurva normal dan menjangkau jauh lebih lebar di titik ekstrem. Sigma di sini merupakan penyebut yang juga digunakan dalam Sharpe ratio, sehingga membawa titik buta yang sama terhadap data berekor tebal.

Monte Carlo VaR: melakukan simulasi dengan seed yang tetap

Bangkitkan sampel sintetis berukuran besar dari proses yang diasumsikan, lalu ambil persentil dari hasil simulasi tersebut. Panel di bawah menggunakan 40.000 angka acak standar normal yang dibentuk melalui transformasi Box-Muller dari urutan uniform yang di-seed menggunakan hash, kemudian diskalakan berdasarkan mean dan sigma seri data. Seed disimpan di dalam SQL, sehingga hasil pengundian identik setiap kali kueri dijalankan ulang. Simulasi memberikan fleksibilitas, ketergantungan jalur, dan korelasi multi-aset, tetapi tidak otomatis memberikan realisme. Jika diberi distribusi normal, simulasi akan menghasilkan jawaban parametric dengan tambahan noise akibat sampling. Sebaliknya, melakukan resampling atas return aktual—teknik di balik interval kepercayaan bootstrap—tetap mempertahankan tail aktual.

QuerySatu seri, tiga metode: VaR 1 hari pada enam tingkat kepercayaan
SQL tepat di balik setiap angka
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 level 95.0%, ketiga metode menghasilkan angka yang selisihnya kurang dari satu poin: 1.66% historis, 1.74% parametric, dan 1.71% simulasi. Pada 99.9%, hasilnya mulai berbeda: 5.85% historis dibandingkan dengan 3.31% parametric, dengan selisih 2.54 poin persentase berdasarkan data yang sama. Kolom simulasi berada di samping kolom parametric pada setiap level. Itulah pelajarannya, bukan kekurangannya. Simulasi mereproduksi distribusi yang diberikan kepadanya.

Baca panel secara vertikal dalam satu kolom, dan setiap kenaikan tingkat kepercayaan akan memperlebar ambang batas. Baca secara horizontal dalam satu baris, dan pilihan metode hampir tidak berpengaruh di bagian tengah distribusi, tetapi sangat menentukan di tail. Batas VaR yang dikutip tanpa metode dan periode pengamatannya bukan angka yang dapat direproduksi oleh pihak lain.

Hal yang tidak diberitahukan VaR: expected shortfall

Expected shortfall, yang juga disebut conditional VaR, menghitung rata-rata kerugian pada hari-hari ketika kerugian melampaui VaR. VaR menunjukkan titik awal tail risk. Expected shortfall mengukur kerugian di dalamnya.

QueryVaR dibandingkan expected shortfall, rata-rata kerugian setelah ambang batas
SQL tepat di balik setiap angka
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 untuk seri ini adalah 3.09% dan expected shortfall adalah 4.43%, atau 1.44 kali ambang batas tersebut. Dalam distribusi normal, rasio itu akan berada di sekitar 1,15 pada tingkat yang sama. Bahkan pada 99.9%, ketika ambang batas sudah mencapai 5.85%, rata-rata kerugian pada hari pelampauan mencapai 8.14%. Limit yang hanya ditetapkan berdasarkan VaR memperlakukan setiap pelampauan sebagai peristiwa yang sama, sedangkan kolom rasio mengukur seberapa tidak benarnya asumsi tersebut.

Apakah VaR 99% satu hari memiliki arti yang sama bagi institusi dan trader?

Tidak. Perbedaan utamanya terletak pada horizon. Trader yang tidak memiliki posisi terbuka semalam menanggung risiko selama beberapa jam. Karena itu, ambang batas satu sesi cukup selaras dengan holding period, meski pergerakan intraday dapat melampaui angka dari penutupan ke penutupan. Institusi yang mendanai liabilitas berjangka panjang memegang posisi selama bertahun-tahun. Eksposurnya berlangsung selama beberapa kuartal. Bagi institusi tersebut, angka 1-day 99% lebih berfungsi sebagai alat permodalan dan pemantauan daripada sebagai gambaran risiko yang ditanggung. Selama bertahun-tahun, aturan permodalan bank menggunakan VaR 1-day 99%. Kerangka market risk Basel kemudian mengubah ukuran tersebut menjadi expected shortfall 97,5%.

Jembatan standar antarhorizon adalah penskalaan berdasarkan akar kuadrat waktu: kalikan angka satu sesi dengan akar kuadrat dari horizon dalam jumlah sesi. Langkah ini mengasumsikan return bersifat independen dengan sigma konstan. Kolom sigma dari tahun ke tahun di atas sudah menunjukkan bahwa asumsi kedua tidak sepenuhnya berlaku.

QueryPenskalaan akar waktu dibandingkan kerugian multi-sesi yang diukur, tingkat 99%
SQL tepat di balik setiap angka
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 merupakan pemeriksaan identitas: pada 1 session, angka hasil penskalaan sama dengan angka terukur, dengan rasio 1. Pada 20 sessions, keduanya mulai berbeda. Arahnya juga berlawanan dengan peringatan umum mengenai pendekatan sederhana tersebut: penskalaan angka satu sesi menghasilkan 13.8%, sedangkan return yang diukur selama horizon itu menghasilkan 10.7%, dengan rasio 0.78. Dalam periode ini, angka hasil penskalaan berada di atas tail terukur untuk beberapa sesi. Dua pola saling berlawanan di sini. Distribusi satu sesi yang berekor tebal menjadi lebih tipis ketika return dijumlahkan. Akibatnya, kuantil 99% agregat melebar lebih lambat daripada akar kuadrat horizon. Volatility clustering bergerak ke arah sebaliknya dengan menumpuk sesi-sesi yang sangat bergejolak dalam satu periode. Pada seri ini, pola pertama lebih kuat. Namun, arah tersebut tidak dijamin berlaku pada periode atau aset lain. Inilah intinya: multiplier merupakan asumsi, bukan hasil pengukuran. Clustering tersebut juga menjadi dasar yang dimanfaatkan oleh volatility targeting ketika menyesuaikan kembali ukuran posisi.

Ada satu batasan lain yang perlu dinyatakan dengan jelas. Seluruh analisis di atas adalah VaR single asset pada broad index fund. Portofolio yang berisi sepuluh nama berkorelasi memiliki risiko konsentrasi yang ditangani oleh portfolio VaR melalui estimasi korelasi. Korelasi biasanya bergerak paling besar tepat ketika estimasi tersebut paling dibutuhkan.

Catatan metode dan konvensi
  • Persentil dihitung menggunakan kuantil eksak, bukan estimasi berbasis sampel. Pengambilan sampel Monte Carlo berasal dari urutan uniform yang di-seed dengan hash dan ditulis ke dalam SQL. Karena itu, setiap angka di sini dapat dihitung ulang dan menghasilkan nilai yang sama.
  • Return adalah perubahan harga dari penutupan ke penutupan tanpa reinvestasi dividen, sesuai konvensi umum untuk VaR satu sesi.
  • Panel horizon menggunakan window yang saling tumpang tindih: return 20 sesi yang berurutan memiliki 19 hari yang sama. Karena itu, tail-nya bertumpu pada jauh lebih sedikit observasi independen daripada yang tersirat dari jumlah baris.

FAQ

Apa yang dimaksud dengan VaR 1 hari pada tingkat 99%?

Ini adalah tingkat kerugian yang dilampaui oleh satu dari setiap 100 hari perdagangan terburuk, yang diukur selama satu sesi. Pada rangkaian data di atas, estimasi historisnya adalah 3.09%. Angka tersebut menunjukkan ambang batas dan tidak menjelaskan besarnya kerugian yang melampaui ambang itu.

Metode penghitungan VaR mana yang paling akurat?

Tidak ada satu pun dari ketiganya yang secara abstrak paling akurat, karena masing-masing menjawab pertanyaan dengan asumsi yang berbeda. Historical VaR mengikuti sampel yang digunakan dan tidak memberikan informasi tentang hal-hal yang tidak tercakup dalam sampel. Parametric VaR lebih murah, tetapi cenderung meremehkan tail risk saham. Monte Carlo hanya sebaik distribusi yang dimasukkan ke dalam model.

Apa perbedaan antara VaR dan expected shortfall?

VaR adalah ambang batas pada tingkat keyakinan tertentu. Expected shortfall menghitung rata-rata kerugian pada hari-hari ketika kerugian melampaui ambang tersebut. Pada rangkaian data ini, expected shortfall pada tingkat 99% mencapai 1.44 kali VaR, dibandingkan sekitar 1,15 kali dalam distribusi normal.

Apakah VaR 1 hari dapat dikonversi menjadi VaR 10 hari?

Mengalikan VaR dengan akar kuadrat dari 10 adalah pendekatan standar. Pendekatan ini mengasumsikan return bersifat independen dan volatilitas konstan. Panel horizon mengukur selisihnya: selama 20 sesi, angka hasil penskalaan mencapai 13.8%, sedangkan angka yang diukur adalah 10.7%.


Setiap panel di atas memuat SQL yang menghasilkan perhitungannya. Untuk menjalankan tiga perhitungan yang sama pada ticker atau periode yang berbeda, sampaikan permintaannya dalam bahasa biasa di terminal Strasmore.

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