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

Riske Maruz Değer VaR Hesaplama Yöntemleri

Tarihsel, parametrik ve Monte Carlo yöntemleri ile SPY getiri serisi üzerinden VaR hesaplama teknikleri. VaR modelinin göz ardı ettiği beklenen kayıp açığı analizi.

Riske Maruz Değer (VaR) Hesaplaması

Riske maruz değer (VaR), belirli bir zaman ufku ve güven düzeyi sabitlenerek, getiri serisi üzerinden bir yüzdelik dilimin okunmasıyla hesaplanır. Bir günlük yüzde doksan dokuzluk VaR değerinin yüzde iki olması, kayıpların her yüz işlem gününün doksan dokuzunda yüzde ikinin altında kalacağı, yüzüncü günde ise bu seviyeyi aşacağı anlamına gelir. Aynı girdileri kullanan üç standart yöntem bu soruya yanıt arar; ancak bu yöntemler, çoğu kişinin beklediğinden daha farklı sonuçlar verir.

Value at risk (VaR) gerçekte neyi ölçer

VaR, bir kayıp dağılımının yüzdelik dilimidir. Bir örneklemdeki tüm günlük getirileri en kötüden en iyiye doğru sıralayın, kötü uçtan yüzde bir oranında ilerleyin; ulaştığınız getiri, pozitif bir kayıp olarak ifade edildiğinde, bir günlük yüzde doksan dokuzluk tarihsel VaR değerini verir. Bu kurguda hiçbir şey en kötü senaryoyu garanti etmez. Sadece tahminin tanımlamayı bıraktığı bölgenin sınırını işaret eder.

Okuyucuların en sık gözden kaçırdığı özellik budur. Yüzde doksan dokuzluk bir VaR, en kötü yüzde birlik günlerin bu eşiğin ötesinde kaldığını belirtir; ancak bu eşiğin ne kadar ötesine geçildiği konusunda sessiz kalır. Maksimum düşüş (maximum drawdown) ise farklı bir soruyu yanıtlar; bir portföyün fiilen yaşadığı zirveden dibe olan kaybı gösterir ve bu iki metrik, aynı portföy çiftini birbirine zıt sıralamalarla değerlendirebilir.

Aşağıdaki her bir veri, tek bir seriye dayanır: İki bin on yılının başından iki bin yirmi beş yılının sonuna kadar olan SPY günlük kapanış fiyatları, kapanıştan kapanışa yüzde değişimlere dönüştürülmüştür. Pencere yapısı hareketli değil sabittir ve her panel, seriyi aynı tarihler üzerinden yeniden oluşturur; bu nedenle rakamlar çalıştırmalar arasında sapma göstermez.

SorgulaSabit getiri serisi: 2010-2025 takvim yılları arası SPY günlük getirileri
Her verinin arkasındaki tam 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

Seri, 16 takvim yılını ve sadece 2010 yılında 252 işlem seansını kapsamaktadır. Bu serinin iki özelliği, takip eden her analiz için önem taşır. Ortalama seans getirisi bu vadede neredeyse önemsizdir: 2010 içinde 0.054%; buna karşılık günlük standart sapma, yani sigma, 1.13% seviyesindedir. Üstelik sigma sabit bir değer değildir. 2020 döneminde günlük 2.11% seviyesinde seyrederken, 2017 döneminde 0.43% seviyesinde gerçekleşmiştir. Tek bir sigma değeri, her iki dönemi de tanımlayamaz.

Riske maruz değer (VaR) hesaplama yöntemleri

Tarihsel VaR: gerçekleşen verilerden yüzdelik dilimi okuma

Gerçekleşen getirileri sıralayın ve ilgili yüzdelik dilimi alın. Bu yöntemin tercih edilme sebebi, herhangi bir dağılım varsayımına dayanmamasıdır. Yöntemin temel varsayımı, örneklem setinin tahmin edilmek istenen gün türünü halihazırda içerdiğidir. Güven düzeyini yeterince uç noktalara çektiğinizde, sonuç sadece tüm dönem içindeki en kötü birkaç işlem gününe dayanır.

Parametrik VaR: ortalamadan z çarpı sigma çıkarımı

Seriyi ortalaması ve sigması ile özetleyin, ardından getirilerin normal dağılıma uyduğunu varsayın. VaR, z çarpı sigma eksi ortalamadır; burada z, standart normal dağılımın kuantil değeridir: yüzde doksan beş güven düzeyinde bir virgül altı yüz kırk beş, yüzde doksan dokuzda iki virgül üç yüz yirmi altı, yüzde doksan dokuz virgül dokuzda ise üç virgül sıfırdır. Hesaplama anlıktır ancak varsayım belirli bir yönde hatalı sonuç verir. Günlük hisse senedi getirileri, normal dağılım eğrisine kıyasla orta kısımda daha yoğun kümelenir ve uç değerlerde çok daha geniş bir alana yayılır. Buradaki sigma, Sharpe oranı formülünde de paydada yer alan değerdir ve kalın kuyruklu (fat-tailed) verilerde aynı kör noktayı beraberinde getirir.

Monte Carlo VaR: sabitlenmiş bir başlangıç değeri ile simülasyon

Varsayılan bir süreçten büyük bir sentetik örneklem çekin ve çekilen değerler üzerinden yüzdelik dilimi okuyun. Aşağıdaki panel, karma bir diziden Box-Muller dönüşümü ile elde edilen ve serinin ortalaması ile sigmasına göre ölçeklenen kırk bin adet standart normal dağılımlı veri kullanır. Başlangıç değeri (seed) SQL içinde sabitlendiğinden, her yeniden çalıştırmada aynı değerler elde edilir. Simülasyon; esneklik, yol bağımlılığı ve çoklu varlık korelasyonu sağlar ancak gerçekçilik sunmaz: Sisteme normal dağılım verirseniz, örnekleme gürültüsü eklenmiş parametrik sonucu geri alırsınız. Bunun yerine, bootstrapped güven aralıkları yönteminin temelini oluşturan gözlemlenen getirilerin yeniden örneklenmesi, gerçek kuyruk riskini korur.

SorgulaTek seri, üç yöntem: Altı güven düzeyinde 1 günlük VaR
Her verinin arkasındaki tam 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% düzeyinde üç yöntem birbirine bir puan yakınlıkta sonuç verir: 1.66% tarihsel, 1.74% parametrik, 1.71% simüle edilmiş. 99.9% düzeyinde ise yollar ayrılır: Aynı veri üzerinde 5.85% tarihsel yönteme karşı 3.31% parametrik yöntem, 2.54 yüzde puanlık bir fark yaratır. Simüle edilmiş sütun, her düzeyde parametrik sütunun yanında yer alır; bu bir kusur değil, yöntemin doğasıdır. Bir simülasyon, kendisine verilen dağılımı yeniden üretir.

Paneli bir sütun boyunca aşağı doğru okuduğunuzda, güven düzeyindeki her adım eşiği genişletir. Bir satır boyunca okuduğunuzda ise yöntem tercihi, dağılımın orta kısımlarında neredeyse hiç fark yaratmazken uç değerlerde belirleyici olur. Yöntemi ve zaman aralığı belirtilmeyen bir VaR limiti, başka kimse tarafından yeniden üretilemeyecek bir sayıdır.

VaR'ın açıklamadığı durum: beklenen kayıp (expected shortfall)

Koşullu VaR olarak da adlandırılan beklenen kayıp, VaR sınırının aşıldığı günlerdeki zararların ortalamasını alır. VaR, kuyruk dağılımının başladığı noktayı işaret eder. Beklenen kayıp ise bu kuyruğun içinde ne olduğunu ölçer.

SorgulaVaR ve beklenen kayıp karşılaştırması: Eşik değerin ötesindeki ortalama kayıp
Her verinin arkasındaki tam 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% seviyesinde, bu serideki VaR 3.09%, beklenen kayıp ise 4.43% veya eşik değerin 1.44 katıdır. Normal dağılım varsayımı altında bu oran aynı seviyede 1,15 civarında gerçekleşirdi. Eşik değerin zaten 5.85% seviyesine ulaştığı 99.9% noktasında dahi, ortalama aşım günü 8.14% olarak gerçekleşmektedir. Yalnızca VaR üzerinden yazılan bir limit, her aşımı aynı olay olarak değerlendirir; oran sütunu ise bu varsayımın ne kadar gerçeğe aykırı olduğunu ölçer.

1 günlük %99 VaR, bir kurum ve bir trader için aynı anlama mı gelir?

Hayır, aradaki fark büyük ölçüde vade ufkundan kaynaklanır. Gecelik pozisyon taşımayan bir trader, riski sadece saatler boyunca taşır; dolayısıyla tek seanslık bir eşik, elde tutma süresiyle örtüşür. Ancak gün içi fiyat hareketleri, kapanıştan kapanışa hesaplanan bir değerin çok ötesine geçebilir. Uzun vadeli yükümlülükleri finanse eden bir kurum ise pozisyonlarını yıllarca tutar; maruz kaldığı risk çeyrek dönemler boyunca devam eder. Bu kurum için 1 günlük %99 VaR değeri, taşıdığı riskin bir tanımından ziyade, sermaye yeterliliği ve izleme aracı işlevi görür. Banka sermaye kuralları yıllarca 1 günlük %99 VaR üzerine inşa edilmiş, Basel piyasa riski çerçevesi ise daha sonra bu ölçümü %97,5 beklenen kayıp (expected shortfall) değerine taşımıştır.

Vade ufukları arasındaki standart köprü, zamanın karekökü ile ölçeklendirmedir: Tek seanslık rakamı, seans cinsinden vade ufkunun karekökü ile çarpın. Bu adım, getirilerin sabit bir sigma ile birbirinden bağımsız olduğunu varsayar; yukarıdaki yıllık sigma sütunu ise bu varsayımın ikinci kısmının geçersiz olduğunu zaten göstermektedir.

SorgulaZamanın karekökü ölçeklemesi ve ölçülen çoklu seans kayıpları karşılaştırması, %99 düzeyinde
Her verinin arkasındaki tam 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

İlk satır bir özdeşlik kontrolüdür: 1 session seviyesinde ölçeklendirilmiş rakam, ölçülen rakama eşittir ve oran 1'dır. 20 sessions seviyesine gelindiğinde ikisi birbirinden ayrılır; ancak bu ayrılma, kısayolun genellikle uyarıldığı yönde değildir: Tek seanslık sayının ölçeklendirilmesi 13.8% sonucunu verirken, o vade boyunca ölçülen getiriler 10.7% olarak gerçekleşir ve oran 0.78 olur. Bu pencerede ölçeklendirilmiş rakam, ölçülen çok seanslı kuyruk değerinin üzerinde kalır. Burada iki model birbirine zıt yönde etki eder. Şişman kuyruklu tek seanslık dağılım, getiriler toplandıkça incelir ve birleştirilmiş %99'luk kuantil, vade ufkunun karekökünden daha yavaş genişler. Volatilite kümelenmesi ise tam tersi yönde işleyerek, şiddetli seansları tek bir pencere içine yığar. Bu seride ilk model daha baskındır; ancak hiçbir yönde garanti yoktur ve başka bir pencerede veya başka bir varlıkta sonuç değişebilir. Önemli olan nokta şudur: Çarpan bir ölçüm değil, bir varsayımdır. Bu kümelenme, volatilite hedeflemesi stratejisinin pozisyon boyutlarını ayarlarken dayandığı özelliktir.

Açıkça belirtilmesi gereken bir diğer sınırlama da şudur: Yukarıdaki her şey, geniş bir endeks fonu üzerindeki tek varlık VaR değeridir. Birbiriyle ilişkili on hisseden oluşan bir portföy, yoğunlaşma riski taşır. Portföy VaR, bu riski bir korelasyon tahmini yoluyla yönetir; ancak korelasyonlar, tahminin en çok önem kazandığı anda en yüksek hareketliliği gösterir.

Yöntem notları ve kurallar
  • Yüzdelik dilimler, örneklenmiş bir tahmin yerine kesin kuantilden alınmıştır. Monte Carlo çekimleri, SQL içine yazılmış sabit bir tohum (seed) değerine sahip tekdüze dizilerden elde edilmiştir; bu sayede buradaki her rakam yeniden hesaplandığında aynı değeri verir.
  • Getiriler, temettü yeniden yatırımı olmaksızın kapanıştan kapanışa fiyat değişimleridir; bu, tek seanslık VaR için genel kabul gören yöntemdir.
  • Vade ufku paneli, örtüşen pencereler kullanır: Ardışık 20 seanslık getiriler 19 günü paylaşır; bu nedenle kuyruk değeri, satır sayısının ima ettiğinden çok daha az bağımsız gözleme dayanır.

Sıkça Sorulan Sorular

1 günlük %99 VaR nedir?

Tek bir işlem seansı üzerinden ölçülen, en kötü yüz işlem gününden birinin aşacağı zarar seviyesidir. Yukarıdaki seride tarihsel tahmin 3.09% seviyesindedir. Bu rakam bir eşik değerini ifade eder ve bu eşiğin ötesindeki zararların büyüklüğü hakkında bilgi vermez.

Hangi VaR hesaplama yöntemi en doğrudur?

Üç yöntemin hiçbiri soyut anlamda tam olarak doğru değildir, çünkü her biri soruyu farklı varsayımlar altında yanıtlar. Tarihsel VaR, kendisine verilen örneğe sadıktır ancak örneklemde yer almayan durumlar hakkında sessiz kalır. Parametrik VaR maliyet açısından uygundur ancak hisse senedi kuyruk risklerini olduğundan düşük gösterir. Monte Carlo ise yalnızca içine beslenen dağılım kadar başarılıdır.

VaR ile beklenen zarar (expected shortfall) arasındaki fark nedir?

VaR, seçilen güven düzeyindeki eşik değeridir. Beklenen zarar ise bu eşiği aşan günlerdeki zararların ortalamasını alır. Bu seride %99 düzeyindeki beklenen zarar, normal dağılım altındaki yaklaşık 1,15 katına kıyasla VaR'ın 1.44 katı seviyesinde seyretmektedir.

1 günlük VaR değerini 10 günlük VaR değerine dönüştürebilir miyim?

10'un karekökü ile çarpmak standart kısa yoldur; bu yöntem getirilerin sabit volatilite ile bağımsız olduğunu varsayar. Horizon paneli bu farkı ölçer: yirmi seanslık dönemde ölçeklendirilmiş rakam 13.8% olarak gerçekleşirken, ölçülen değer 10.7% olmuştur.


Yukarıdaki her panel, kendisini üreten SQL kodunu içerir. Aynı üç hesaplamayı farklı bir ticker veya zaman aralığı için çalıştırmak isterseniz, Strasmore terminali üzerinden yalın bir dille talep edebilirsiniz.

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