← Makalelere geri dön
July 11, 2026
5 dakikalık okuma

Asimetrik ve Kalın Kuyruklu GARCH: EGARCH, GJR ve Student-t

#volatility
#GARCH
#EGARCH
#risk
#VaR
#crypto
#algorithmic-trading

Bu serinin 1. Bölümünde GARCH(1,1) modelini sıfırdan kurmuştuk: oynaklık kümelenmesi sezgisi, koşullu varyans özyinelemesi, en çok olabilirlik tahmini, öngörü ve arch kütüphanesiyle standart artık teşhisleri. Henüz okumadıysanız oradan başlayın; bu yazı, yalın bir GARCH(1,1) modelini zaten kurabildiğinizi ve yorumlayabildiğinizi varsayar ve temelleri yeniden türetmez.

Yalın GARCH(1,1) iyi bir başlangıç noktası ama kötü bir nihai cevaptır. Bir geriye dönük testte görmezden gelmesi ucuz, gerçek sermayeyle görmezden gelmesi pahalı olan iki yapısal kusuru vardır. Birincisi, model simetriktir: bir +5%+5\% güne tıpkı bir 5%-5\% güne tepki verdiği gibi tepki verir, çünkü şok varyans özyinelemesine yalnızca karesiyle, εt12\varepsilon_{t-1}^2 olarak girer. Kare almak işareti yok eder. Ikincisi, Gauss inovasyonları varsayar: GARCH oynaklık kümelenmesini emdikten sonra bile, BTC ve ETH'nin standartlaştırılmış artıkları gözle görülür biçimde kalın kuyrukludur ve bir Gauss olabilirliği kuyruğu sistematik olarak düşük fiyatlar. Bir GARCH(1,1)-Normal %99 VaR, zamanın %1'inden çok daha fazlasında aşılır.

Bu yazı her iki kusuru da düzeltir. GJR-GARCH ve EGARCH ile asimetri, Student-tt ve Hansen'in çarpık-tt inovasyonlarıyla kalın kuyruklar ekliyoruz. Ardından asıl kira ödeyen işi yapıyoruz: kurulan koşullu dağılımı tek adımlık bir Value-at-Risk ve Expected Shortfall öngörüsüne dönüştürüyor ve bu öngörüyü Kupiec ile Christoffersen testleriyle dürüstçe geriye dönük sınıyoruz. Asla risk testinden geçirmediğiniz bir oynaklık modeli bir süsten ibarettir.

Kaldıraç Etkisi ve Kriptonun Neden Daha Karışık Olduğu

Hisse senetlerinde asimetrinin bir adı ve bir hikayesi vardır. Kaldıraç etkisi (Black, 1976): bir şirketin hissesi düştüğünde, borc/özsermaye oranı yükselir, özsermaye mekanik olarak daha riskli hale gelir ve oynaklık artar. Kötü haber, gelecekteki oynaklığı eşit büyüklükteki iyi haberden daha fazla yükseltir. Ampirik olarak bu, hisse senedi oynaklık literatüründeki en sağlam biçiminde ortaya çıkan olgulardan biridir.

Kriptoda kurumsal anlamda ne özsermaye ne de bilanco kaldıracı vardır; yine de kaldıraç-etkisine benzer bir asimetri çoğu zaman kendini gösterir; bu, muhasebeden değil zorunlu kaldıraç azaltmadan (deleveraging) kaynaklanır. BTC sert düştüğünde, aşırı teminatlandırılmış krediler tasfiye edilir, kalıcı vadeli işlem (perpetual futures) long pozisyonları zorla kapatılır, fonlama yön değiştirir ve kaskad oynaklığı besler. Yani mekanizma farklıdır ama işaret çoğu zaman hisse senetleriyle örtüşür: düşüşler oynaklığı daha fazla sıçratır.

Önemli uyarı: kripto daha karışıktır ve asimetriyi bir yasa değil, ampirik bir soru olarak ele almalısınız. Şiddetli yükseliş hareketleri (short squeeze'ler, kaldıraçla körüklenmiş bir yükseliş dalgası, bir ETF onay boşluğu) da gerçekleşen oynaklığı sıçratabilir. Varlığa ve örneklem penceresine bağlı olarak, tahmin edilen asimetri güçlü, zayıf ya da bazen yanlış işaretli olabilir. Bu yazının ısrar ettiği disiplin şudur: asimetrik modeli kurun, asimetri parametresinin istatistiksel olarak anlamlı ve beklenen yönde olup olmadığına bakın ve ek parametreyi ancak yerini hak ediyorsa saklayın. Hisse senedi hikayesinin aktarıldığını varsaymayın; test edin.

Modellemeden Önce Asimetri Testi

Yukarıdaki özet asimetriyi ampirik olarak ele alın diyor; o halde asimetrik bir modeli kurmadan önce, asimetrinin var olup olmadığına dair ucuz ve biçimsel bir test yapın. Engle-Ng işaret-yanlılık (sign-bias) testleri (1993) tam olarak bunu yapar. Önce simetrik bir GARCH(1,1) kurun, onun standartlaştırılmış artıklarının karesini zt2z_t^2 alın ve bunları önceki şokun işaret ve büyüklük göstergelerine göre regres edin:

zt2=a0+a1St1+a2St1εt1+a3St1+εt1+utz_t^2 = a_0 + a_1 S_{t-1}^- + a_2 S_{t-1}^- \varepsilon_{t-1} + a_3 S_{t-1}^+ \varepsilon_{t-1} + u_t

burada St1=1{εt1<0}S_{t-1}^- = \mathbf{1}\{\varepsilon_{t-1} < 0\} ve St1+=1St1S_{t-1}^+ = 1 - S_{t-1}^-. Mantık şu: eğer simetrik model her şeyi zaten yakalamışsa, dünkü şokun işareti ve büyüklüğü bugünkü artık karesini öngöremez, dolayısıyla a1=a2=a3=0a_1 = a_2 = a_3 = 0 olur. Bireysel tt-testleri sırasıyla işaret-yanlılık (a1a_1), negatif-büyüklük-yanlılık (a2a_2) ve pozitif-büyüklük-yanlılık (a3a_3) testleridir; üçünün tümüne uygulanan ortak bir FF-testi genel (omnibus) testtir. Anlamlı bir a1a_1 ya da a2a_2, negatif şokların simetrik model tarafından sistematik olarak yanlış fiyatlandığını söyler; bu, GJR ya da EGARCH'ın ise yarayacağının işaretidir.

import statsmodels.api as sm

def sign_bias_test(symmetric_res):
    """Engle-Ng sign-bias tests on a fitted symmetric GARCH result."""
    z = symmetric_res.std_resid.dropna()
    z2 = (z ** 2).values[1:]
    eps_lag = z.values[:-1]                      # standardized shock proxy
    neg = (eps_lag < 0).astype(float)
    X = np.column_stack([
        np.ones_like(eps_lag),                   # intercept
        neg,                                     # sign bias
        neg * eps_lag,                           # negative size bias
        (1 - neg) * eps_lag,                     # positive size bias
    ])
    ols = sm.OLS(z2, X).fit()
    names = ["const", "sign_bias", "neg_size_bias", "pos_size_bias"]
    for nm, coef, t, p in zip(names, ols.params, ols.tvalues, ols.pvalues):
        print(f"{nm:16s} coef={coef:+.4f}  t={t:+.2f}  p={p:.3f}")
    print(f"Joint F p-value: {ols.f_pvalue:.4f}")
    return ols

sign_bias_test(models["GARCH-N"])

Ortak FF-testi anlamsızsa, simetrik kalmak ve iki parametreden tasarruf etmek için ampirik izniniz vardır. Anlamlıysa (BTC/ETH için sık görülen sonuç), GJR/EGARCH'a rahat bir vicdanla geçin; gerçek bir özellik modellediğinizi ve gürültünün pesinden koşmadığınızı bilerek. Özetin talep ettiği ampirik disiplin budur: hisse senedi kaldıraç hikayesini varsaymayın, test edin.

GJR-GARCH: Eşik Terimiyle Asimetri

Glosten-Jagannathan-Runkle modeli (1993) (bazen TGARCH ya da eşik (threshold) GARCH olarak da anılır), kötü haber ile iyi haberin farklı etkilere sahip olmasına izin veren, GARCH(1,1) üzerine yapılabilecek en küçük düzenlemedir. 1. Bölümdeki simetrik koşullu varyans özyinelemesini hatırlayın:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

GJR tek bir eşik terimi ekler: yalnızca negatif bir şoktan sonra devreye giren fazladan bir varyans doz.

σt2=ω+αεt12+γIt1εt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \gamma\,I_{t-1}\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

burada It1I_{t-1} şu göstergedir

It1={1if εt1<00if εt10I_{t-1} = \begin{cases} 1 & \text{if } \varepsilon_{t-1} < 0 \\ 0 & \text{if } \varepsilon_{t-1} \geq 0 \end{cases}

Özyinelemeyi durumlara göre okuyun. Pozitif bir şoktan (εt10\varepsilon_{t-1} \geq 0) sonra gösterge sıfırdır ve karesi alınmış şokun bir sonraki dönem varyansına etkisi yalnızca α\alpha'dır. Negatif bir şoktan sonra gösterge birdir ve etki α+γ\alpha + \gamma olur. γ\gamma parametresi, tüm asimetri hikayesini tek bir sayıda özetler:

  • γ>0\gamma > 0: negatif şoklar oynaklığı, aynı büyüklükteki pozitif şoklardan daha fazla yükseltir. Bu kaldıraç etkisidir ve BTC/ETH'de çoğu zaman bulmayı beklediğiniz şeydir.
  • γ=0\gamma = 0: model simetrik GARCH(1,1)'e geri çöker. Dolayısıyla γ\gamma üzerine bir olabilirlik-oranı ya da tt-testi, asimetrinin hiç var olup olmadığının doğrudan bir testidir.
  • γ<0\gamma < 0: pozitif şoklar oynaklığı daha fazla yükseltir; ara sıra görülen kripto yükseliş dalgası rejimi. Nadirdir, ama a priori olarak ihtimal dışı bırakmayın.

Pozitiflik ve Durağanlık

σt2\sigma_t^2 hala toplamsal olarak kurulduğu için, her terimin negatif olmaması gerekir. Yeterli pozitiflik koşulları şunlardır

ω>0,α0,α+γ0,β0.\omega > 0, \quad \alpha \geq 0, \quad \alpha + \gamma \geq 0, \quad \beta \geq 0.

γ\gamma'nın kendisinin, α+γ0\alpha + \gamma \geq 0 olduğu sürece negatif olmasına izin verildiğine dikkat edin; böylece kötü-haber-sonrası etki asla negatife düşmez.

Kovaryans durağanlığı için, inovasyonların zt=εt/σtz_t = \varepsilon_t/\sigma_t sıfır etrafında simetrik bir dağılımla standartlaştırıldığını varsayın; böylece P(εt1<0)=1/2P(\varepsilon_{t-1} < 0) = 1/2 olur ve gösterge ortalamada γ/2\gamma/2 katkı yapar. Durağanlık koşulu şu hale gelir

α+β+12γ<1.\alpha + \beta + \tfrac{1}{2}\gamma < 1.

Koşulsuz (uzun dönem) varyans o zaman şöyledir

σˉ2=ω1αβ12γ.\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta - \tfrac{1}{2}\gamma}.

Bu, 1. Bölümdeki σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta) sonucunun GJR karşılığıdır; ek 12γ\tfrac{1}{2}\gamma terimi kaldıraç yarı-ömrünün ortalama katkısını hesaba katar. Inovasyon dağılımınız çarpıksa (aşağıdaki Hansen çarpık-tt), 1/21/2 yerine gerçek P(zt<0)P(z_t < 0) olasılığı gelir; ancak raporlanan kalıcılık için standart referans 1/21/2'dir.

EGARCH: log-Varyansı Modellemek, Pozitiflik Kısıtı Yok

GJR sizi bir varyans-pozitifliği deli gömleği içinde tutar: her parametre kombinasyonunun eşitsizlik kısıtlarına karşı denetlenmesi gerekir; bu, optimizasyon sırasında can sıkıcı, kayan yeniden-tahmin sırasında ise daha kötüdür, çünkü bir pencere ara sıra olurlu olmayan bir bölgeye kayabilir. Nelson'un Üssel GARCH'ı (Exponential GARCH, 1991) bunu tamamen atlar; koşullu varyansın logaritmasını modelleyerek. logσt2\log \sigma_t^2 herhangi bir gerçek sayı olabildiği için, σt2=exp(logσt2)\sigma_t^2 = \exp(\log \sigma_t^2) parametreler ne olursa olsun otomatik olarak pozitiftir. Dayatılacak bir kısıt yoktur.

Özyinelemeyi standartlaştırılmış inovasyon zt1=εt1/σt1z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1} cinsinden yazın:

logσt2=ω+βlogσt12+α(zt1Ezt1)+γzt1\log \sigma_t^2 = \omega + \beta \log \sigma_{t-1}^2 + \alpha\bigl(|z_{t-1}| - \mathbb{E}|z_{t-1}|\bigr) + \gamma\, z_{t-1}

Şoku iki terim taşır ve bunları ayırmak işin tüm fikridir:

  • Büyüklük terimi α(zt1Ezt1)\alpha(|z_{t-1}| - \mathbb{E}|z_{t-1}|), şokun büyüklüğüne tepki verir, işaret çıkarılmıştır. Ezt1\mathbb{E}|z_{t-1}|'i çıkarmak terimi merkezler, böylece ortalama-büyüklükte bir şok hiçbir katkı yapmaz. Standart normal için Ez=2/π0.7979\mathbb{E}|z| = \sqrt{2/\pi} \approx 0.7979; standartlaştırılmış bir Student-tt için beklenen mutlak değer daha küçüktür ve ν\nu'ye bağlıdır, ama arch bunu içsel olarak halleder.
  • Işaret terimi γzt1\gamma\, z_{t-1} asimetridir. Işaretli inovasyonda doğrusaldır, dolayısıyla negatif bir zt1z_{t-1}, logσt2\log\sigma_t^2'yi pozitif olanın tersi yöne iter.

Işaret uzlaşımı önemlidir ve insanların ayagını kaydırır. Bu parametrelemede kaldıraç etkisi (kötü haber oynaklığı yükseltir) γ<0\gamma < 0'a karşılık gelir: negatif bir şok zt1<0z_{t-1} < 0 o zaman γzt1>0\gamma z_{t-1} > 0 yapar ve log-varyansı artırır. Bu, GJR'nin γ>0\gamma > 0'ından ters işarettir. Uzlaşım için varsayımda bulunmak yerine daima modelin kendi belgelerini okuyun; arch, EGARCH'ı kendi işaretiyle raporlar ve biz bunu, belgemize güvenmek yerine aşağıdaki bir haber etki eğrisiyle karşılaştırarak denetliyoruz.

Loglarda her şey toplamsal olduğu için, bir EGARCH(1,1) modelinin kalıcılığı logσt12\log\sigma_{t-1}^2 üzerindeki tek otoregresif katsayı β\beta tarafından yönetilir; durağanlık yalnızca β<1|\beta| < 1'i gerektirir. Bu, GJR eşitsizliğinden çok daha temiz bir koşuldur ve kayan pencerelerde yeniden kurduğunuzda gerçek bir pratik avantajdır.

Belirtmeye değer bir incelik: EGARCH'ın şoklara tepkisi inovasyonda üsseldir (sonda üstel alırsınız), oysa GJR ikinci derecedir. Bu nedenle EGARCH büyük şoklara daha şiddetli tepki verir; kuyruk olaylarının önemli olduğu kriptoda bu bir özelliktir, ama aynı zamanda EGARCH'ın bir aykırı günden sonra ara sıra inandırıcı olmayacak kadar büyük varyans öngörüleri üretebilmesinin de nedenidir. Ikisinden hiçbiri evrensel olarak daha iyi değildir; seçimi örneklem dışı uyum ve risk geriye dönük testleriyle yaparsınız; ki tüm bu serinin amacı budur.

Haber Etki Eğrisi

Simetrik GARCH, GJR ve EGARCH arasındaki farkı görmenin en temiz yolu haber etki eğrisidir (news impact curve; Engle ve Ng, 1993): σt1\sigma_{t-1}'i uzun dönem düzeyinde sabit tutun ve bir sonraki dönem koşullu varyansı σt2\sigma_t^2'yi son şok εt1\varepsilon_{t-1}'in bir fonksiyonu olarak çizin. Şu soruyu yanıtlar: Bu büyüklük ve işaretteki bir şok verildiğinde, model yarının oynaklığını ne kadar yükseltir?

  • Simetrik GARCH, sıfırda merkezlenmiş simetrik bir parabol üretir. Bir 5%-5\% ve bir +5%+5\% şok aynı yüksekliktedir. Bu, tam olarak düzelttiğimiz kusurdur.
  • GJR, sıfırda bir kırığa sahip bir parabol üretir; γ>0\gamma > 0 olduğunda solda (negatif şoklar) sağdan daha diktir. Iki yarının eğrilikleri sırasıyla α+γ\alpha+\gamma ve α\alpha'dır.
  • EGARCH, asimetrik, üssel bir V şekli üretir: γz\gamma z terimi nedeniyle iki kolun eğimleri farklıdır ve sondaki üstel alma nedeniyle bütün şekil bir paraboldan daha hızlı yukarı kıvrılır.

Üçünü de kurulan parametrelerden daha sonra, uygulama bölümünde çiziyoruz; asimetrinin size ne kazandırdığını anlatmak için tek başına en kullanışlı teşhistir.

Kalın Kuyruklar: Student-t ve Çarpık-t Inovasyonları

Asimetri, modelin şokların işaretine verdiği tepkiyi düzeltir. Şokların dağılımı hakkında hiçbir şey yapmaz. Yalın GARCH ztN(0,1)z_t \sim \mathcal{N}(0,1) varsayar ve bu varsayım kripto için neredeyse her zaman yanlıştır. GARCH oynaklık kümelenmesini kaldırdıktan sonra bile, standartlaştırılmış artıklar zt=εt/σtz_t = \varepsilon_t / \sigma_t aşırı basıklığı (excess kurtosis) korur; kalın kuyrukludurlar. Bir Gauss olabilirliği, dağılımın omuzlarına uyum sağlayarak, bir 44-, 55- ya da 66-sigmalık standart bir günün gerçekte ne sıklıkta gerçekleştiğini olduğundan az ağırlıklar.

Risk açısından sonuç doğrudandır. Bir Gauss %99 VaR, Φ1(0.01)2.326\Phi^{-1}(0.01) \approx -2.326 kuantilini kullanır, dolayısıyla VaR0.992.326σt\text{VaR}_{0.99} \approx 2.326\,\sigma_t öngörür. Gerçek standartlaştırılmış dağılım, diyelim ki ν=5\nu = 5 serbestlik dereceli bir Student-tt ise, gerçek %1 kuantili 3.36-3.36 civarındadır; Gauss VaR bu güven düzeyinde kabaca %44 iyimserdir. Bunu zamanın %1'inden çok daha fazlasında aşarsınız ve olanaksız günler tarafından sistematik olarak şaşırtılırsınız. Bu bir kripto tuhaflığı değildir; Bollerslev (1987) tt-GARCH'ı tam olarak hisse senedi ve doviz artıkları aynı kalın kuyrukları gösterdiği için ortaya koydu. Kripto, aynı sorunun sadece daha uç bir sürümüdür.

Standartlaştırılmış Student-t

Student-tt yoğunluğunun, kuyruk kalınlığını kontrol eden bir serbestlik derecesi parametresi ν>2\nu > 2 vardır: küçük ν\nu kalın kuyruklar demektir ve ν\nu \to \infty oldukça tt, Gauss'a yakınsar. Puf noktası şu: ham tνt_\nu dağılımının varyansı ν/(ν2)1\nu/(\nu-2) \neq 1'dir, dolayısıyla onu bir inovasyon olarak kullanmadan önce birim varyansa standartlaştırmalıyız; aksi halde GARCH özyinelemesindeki "σt\sigma_t" aslında koşullu standart sapma olmazdı.

Birim varyanslı standartlaştırılmış Student-tt inovasyonunun yoğunluğu şöyledir

f(z;ν)=Γ ⁣(ν+12)π(ν2)  Γ ⁣(ν2)(1+z2ν2)ν+12,ν>2.f(z;\nu) = \frac{\Gamma\!\left(\frac{\nu+1}{2}\right)}{\sqrt{\pi(\nu-2)}\;\Gamma\!\left(\frac{\nu}{2}\right)}\left(1 + \frac{z^2}{\nu-2}\right)^{-\frac{\nu+1}{2}}, \qquad \nu > 2.

Içerideki (ν2)(\nu-2)'ye dikkat edin; bu, Var(z)=1\mathrm{Var}(z)=1 olacak şekilde yeniden ölçekleyen standartlaştırmadır. GARCH koşullu varyansı σt2\sigma_t^2 ve zt=εt/σtz_t = \varepsilon_t/\sigma_t verildiğinde, bir gözlemin log-olabilirlik katkısı şöyledir

t=logΓ ⁣(ν+12)logΓ ⁣(ν2)12log(π(ν2))12logσt2ν+12log ⁣(1+zt2ν2).\ell_t = \log\Gamma\!\left(\tfrac{\nu+1}{2}\right) - \log\Gamma\!\left(\tfrac{\nu}{2}\right) - \tfrac{1}{2}\log\bigl(\pi(\nu-2)\bigr) - \tfrac{1}{2}\log\sigma_t^2 - \frac{\nu+1}{2}\log\!\left(1 + \frac{z_t^2}{\nu-2}\right).

12logσt2-\tfrac{1}{2}\log\sigma_t^2 terimi, εt\varepsilon_t'den ztz_t'ye dönüşümün Jacobian'ıdır; 1. Bölümdeki Gauss GARCH olabilirliğinde gördüğünüz terimin aynısı. Yalnızca şekil değişir. tt\sum_t \ell_t'yi GARCH parametreleri ve ν\nu üzerinde birlikte enbüyüklemek, dist='t' verdiğinizde arch'ın tam olarak yaptığı şeydir.

Tahmin edilen ν\nu'nun kendisi bilgilendiricidir. Günlük BTC/ETH getirileri için tipik olarak ν36\nu \approx 3\text{–}6 aralığına düşersiniz; kalın kuyruklar, ama sonlu varyansla (ν>2\nu > 2 gerektirir) ve genellikle sonlu basıklıkla (ν>4\nu > 4 gerektirir). Kurulan ν\nu'nuz 4'un altına düşerse, şunun farkında olun: örneklem basıklığı modelde teknik olarak sonsuzdur ve bazı tahminciler kararsızlaşır; bu, aykırılara ve veri kalitesine iyice bakmak için bir işarettir.

Hansen'in Çarpık-t Dağılımı

Student-tt kalın kuyrukludur ama yine de simetriktir; sol ve sağ kuyruklar eşit ağırlıktadır. Kripto getiri artıkları çoğu zaman ayrıca çarpıktır: sol kuyruk (çöküşler) sağ kuyruktan daha ağırdır. Hansen'in çarpık-tt'si (1994), standartlaştırılmış tt'yi, ν\nu'nun yanında bir çarpıklık parametresi λ(1,1)\lambda \in (-1, 1) ile genellestirir:

f(z;ν,λ)={bc(1+1ν2(bz+a1λ)2)ν+12z<a/bbc(1+1ν2(bz+a1+λ)2)ν+12za/bf(z;\nu,\lambda) = \begin{cases} b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1-\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z < -a/b \\[2mm] b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1+\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z \geq -a/b \end{cases}

burada a=4λcν2ν1a = 4\lambda c\,\frac{\nu-2}{\nu-1}, b2=1+3λ2a2b^2 = 1 + 3\lambda^2 - a^2 ve c=Γ(ν+12)π(ν2)Γ(ν2)c = \frac{\Gamma(\frac{\nu+1}{2})}{\sqrt{\pi(\nu-2)}\,\Gamma(\frac{\nu}{2})} sabitleri, geçerli her (ν,λ)(\nu,\lambda) için zz'nin sıfır ortalama ve birim varyansa sahip olması için seçilir. Dağılım z=a/bz = -a/b'de ayrılır ve daha fazla kütleyi bir kuyruğa bükmek için her parcada farklı bir ölçekleme kullanır.

Yorum: λ<0\lambda < 0, sola çarpık bir dağılım verir (daha ağır aşağı yön); kripto için olağan bulgu ve bir kaldıraç etkisiyle eşleşmesini bekleyeceğiniz şey. λ=0\lambda = 0 simetrik Student-tt'yi geri getirir, dolayısıyla λ=0\lambda = 0 testi, çarpıklık teriminin bir şey kazandırıp kazandırmadığını söyler. arch'ta bu dist='skewt''dir ve hem ν\nu hem de λ\lambda'yı tahmin eder. Kazanç, sol-kuyruk kuantili sağ-kuyruk kuantilinden dürüstçe daha ağır olan bir VaR'dır; hayatta kalmaya çalıştığınız kayıplar asimetrikken tam da istediğiniz şey. Bu, pozisyon sonuçlarındaki kayıp-kâr asimetrisiyle doğrudan bağlantılıdır: x%x\%'lik bir düşüşü telafi etmek x%x\%'den fazlasını gerektirir, dolayısıyla sol kuyruğu yanlış modellemek sağ kuyruğu yanlış modellemekten daha maliyetlidir.

Python Uygulaması

Şimdi tüm bunları arch kütüphanesiyle kuruyoruz. Kurulum 1. Bölümü yansıtır: günlük getirileri çekin, sayısal koşullama için 100 ile ölçekleyin (getiriler O(0.01)O(0.01) olduğunda GARCH optimizasyoncuları kötü davranır) ve sabit bir ortalamayla kurun. Gün içi ya da farklı bir ortalama modeli istiyorsanız, mekanizma aynıdır.

Kurulum ve Veri

import numpy as np
import pandas as pd
from arch import arch_model
from arch.univariate import GARCH, EGARCH, ConstantMean, StudentsT, SkewStudent
from scipy import stats

def fetch_returns(symbol="BTC-USD", start="2019-01-01", end="2025-12-31"):
    """Daily log returns, in percent (scaled x100 for the optimizer)."""
    import yfinance as yf
    px = yf.download(symbol, start=start, end=end)["Close"].dropna()
    ret = 100.0 * np.log(px / px.shift(1)).dropna()
    ret.name = symbol
    return ret

r = fetch_returns("BTC-USD")
print(f"{len(r)} daily observations, "
      f"annualized vol ~ {r.std() * np.sqrt(365):.0f}%")

Kripto 7/24 işlem gördüğü için 252 ile değil 365 ile yıllıklaştırırız; bir kripto Sharpe ya da oynaklığını bir hisse senedi masasının rakamlarıyla karşılaştırdığınızda küçük ama sık görülen bir kafa karışıklığı kaynağı.

Dört Modeli Kurmak

arch'taki örüntü: p=1, q=1 ile vol='Garch' simetrik GARCH'tır; o=1 eklemek GJR eşik terimini açar; vol='EGARCH' log-varyans modeline geçer. Inovasyon dağılımı dist ile ayarlanır: 'normal', 't', 'skewt'.

def fit(returns, vol="Garch", p=1, o=0, q=1, dist="normal"):
    am = arch_model(returns, mean="Constant",
                    vol=vol, p=p, o=o, q=q, dist=dist)
    res = am.fit(disp="off")
    return res

models = {
    "GARCH-N":    fit(r, vol="Garch",  o=0, dist="normal"),  # Part 1 baseline
    "GJR-t":      fit(r, vol="Garch",  o=1, dist="t"),        # asymmetry + fat tails
    "EGARCH-t":   fit(r, vol="EGARCH", o=1, dist="t"),        # log-variance asymmetry
    "GJR-skewt":  fit(r, vol="Garch",  o=1, dist="skewt"),    # + skew
}

for name, res in models.items():
    print(f"\n===== {name} =====")
    print(res.summary().tables[1])   # parameter table

vol='EGARCH' için o argümanı asimetrik (γz\gamma z) terimini, p/q ise büyüklük ve gecikme terimlerini kontrol eder; o=1, p=1, q=1 standart EGARCH(1,1)'dir. Bir tuzak: arch'ta EGARCH'ın parametre adları aynı harflerdir ama asimetri terimindeki işaret uzlaşımı Nelson'unkidir, dolayısıyla negatif bir tahmin kaldıraç etkisidir. Bunu belgemizden değil haber etki eğrisinden doğrularız.

GJR Uyumunu Okumak

Bir GJR-tt parametre tablosu kabaca şöyle görünür (temsili değerler, raporlanmış bir deney değil; kendi verinizde yeniden kurun):

                  coef    std err       t      P>|t|
omega           0.0480     0.017     2.82     0.005
alpha[1]        0.0620     0.018     3.44     0.001
gamma[1]        0.0910     0.028     3.25     0.001
beta[1]         0.8850     0.021    42.1      0.000
nu              4.30       0.55      7.82     0.000

Nasıl okunur:

  • 3'un üzerinde bir tt-istatistiğiyle gamma[1] = 0.091, istatistiksel olarak anlamlı bir kaldıraç etkisidir. Negatif bir şoktan sonra karesi alınmış şokun etkisi α+γ=0.062+0.091=0.153\alpha + \gamma = 0.062 + 0.091 = 0.153'tür; pozitif bir şoktan sonra yalnızca α=0.062\alpha = 0.062'dir. Kötü haber, bu modelin oynaklığını aynı büyüklükteki iyi haberin kabaca 2.5×2.5\times katı kadar hareket ettirir.
  • nu = 4.3 kalın kuyrukları doğrular; Gauss'tan (ν\nu \to \infty) çok uzak ve dördüncü momentin ancak sonlu olacağı kadar düşük. Bu seri üzerindeki bir Gauss VaR fena halde iyimser olurdu.
  • Kalıcılık α+β+12γ=0.062+0.885+0.04550.993\alpha + \beta + \tfrac{1}{2}\gamma = 0.062 + 0.885 + 0.0455 \approx 0.993'tür; günlük kripto için her zamanki gibi çok yüksek: şoklar yavaş soner ve oynaklık güçlü biçimde kümelenmiştir.

Denetlenecek en önemli tek satır γ\gamma satırıdır. pp-değeri büyükse, asimetrik terim bu varlık ve pencerede yerini hak etmiyordur ve daha basit simetrik modeli tercih etmelisiniz. Bu bir süs değil, model-seçim disiplinidir; aşağıda daha fazlası var.

Modelleri Bilgi Kriterleriyle Karşılaştırmak

Parametre ekledikçe log-olabilirlik her zaman iyileşir, dolayısıyla yalnızca log-olabilirlik üzerinden seçim yapamazsınız. Parametre sayısını cezalandıran (BIC daha agresif biçimde) AIC/BIC kullanın:

def compare(models: dict) -> pd.DataFrame:
    rows = []
    for name, res in models.items():
        rows.append({
            "model": name,
            "n_params": len(res.params),
            "loglik": res.loglikelihood,
            "AIC": res.aic,
            "BIC": res.bic,
        })
    df = pd.DataFrame(rows).set_index("model")
    return df.sort_values("BIC")

print(compare(models))

Genel geçer yorumlama kuralları: başlangıç noktasına göre ~6'dan fazla bir BIC iyileşmesi, ek yapının gerçek olduğunun güçlü kanıtıdır; 1-2'lik bir fark gürültüdür. Eğer GJR-t, GARCH-N'i 30+ BIC puanıyla yeniyor ama GJR-skewt, GJR-t'yi yalnızca 1 ile yeniyorsa, tt'yi tutup çarpıklığı bırakın; çarpıklık parametresi bu veride kendini finanse etmiyordur. AIC/BIC'i örneklem dışı doğrulamanın yerine koymayın; karmaşıklığa göre ayarlanmış örneklem içi uyumu ödüllendirirler, ki bu gereklidir ama yeterli değildir. Asıl test VaR geriye dönük testi ve nihayetinde ileriye dönük (walk-forward) değerlendirmedir.

Haber Etki Eğrisini Çizmek

Bu, kazanç grafiğidir; asimetriyi görünür kılar ve EGARCH işaret uzlaşımını doğrular.

import matplotlib.pyplot as plt

def news_impact_curve(res, shock_grid):
    """
    Next-period conditional variance as a function of the last shock,
    holding sigma_{t-1} at the model's unconditional level.
    Works for symmetric GARCH, GJR (o=1), and EGARCH.
    """
    p = res.params
    vol_name = res.model.volatility.__class__.__name__
    sigma2_bar = np.mean(res.conditional_volatility ** 2)

    omega = p["omega"]
    alpha = p.get("alpha[1]", 0.0)
    gamma = p.get("gamma[1]", 0.0)
    beta  = p.get("beta[1]", 0.0)

    if vol_name == "EGARCH":
        sig_prev = np.sqrt(sigma2_bar)
        z = shock_grid / sig_prev
        E_abs = np.sqrt(2 / np.pi)   # approx; arch uses the fitted dist's E|z|
        log_s2 = (omega + beta * np.log(sigma2_bar)
                  + alpha * (np.abs(z) - E_abs) + gamma * z)
        return np.exp(log_s2)
    else:
        ind = (shock_grid < 0).astype(float)
        return omega + (alpha + gamma * ind) * shock_grid**2 + beta * sigma2_bar

shocks = np.linspace(-8, 8, 401)   # daily % shocks
plt.figure(figsize=(8, 5))
for name in ["GARCH-N", "GJR-t", "EGARCH-t"]:
    nic = news_impact_curve(models[name], shocks)
    plt.plot(shocks, nic, label=name, lw=2)
plt.axvline(0, color="gray", lw=0.8, ls="--")
plt.xlabel("Last shock  $\\varepsilon_{t-1}$  (daily %)")
plt.ylabel("Next-period conditional variance  $\\sigma_t^2$")
plt.title("News impact curve: symmetric vs GJR vs EGARCH (BTC)")
plt.legend()
plt.tight_layout()

Bunu çalıştırdığınızda, simetrik GARCH-N eğrisi sıfırda merkezlenmiş temiz bir paroldur; bir 6%-6\% ve +6%+6\% şok özdeş varyans verir. GJR-t, kökende bir kırığa sahip, sol kolu daha yüksek bir paroldur. EGARCH-t üssel V'dir ve sol kolu sağ kolunun üzerinde oturuyorsa, kaldıraç etkisini ve işaret uzlaşımını tek bakışta doğrulamış olursunuz. EGARCH sol kolu sağ kolun altında oturuyorsa, ya γ\gamma pozitif tahmin edilmiştir (bir yükseliş-oynaklığı rejimi) ya da işareti ters almışsınızdır; grafik hangisi olduğunu hiçbir tahmine gerek kalmadan söyler.

Dört Modelin Yan Yana Karşılaştırması

Riske geçmeden önce, dört modeli yan yana tutmak yardımcı olur. Her satır bir tasarım kararıdır ve sütunlar o kararın ne maliyet çıkardığını ve ne kazandırdığını gösterir.

Özellik GARCH-N GJR-t EGARCH-t GJR-skewt
Asimetri (şok işareti) yok eşik γIε2\gamma I\varepsilon^2 işaretli γz\gamma z eşik γIε2\gamma I\varepsilon^2
Inovasyon kuyruk şekli Gauss Student-tt Student-tt çarpık-tt
Inovasyonda çarpıklık hayır hayır hayır evet (λ\lambda)
Pozitiflik kısıtları evet evet (α+γ0\alpha+\gamma\ge0) yok (log form) evet
Durağanlık koşulu α+β<1\alpha+\beta<1 α+β+12γ<1\alpha+\beta+\tfrac12\gamma<1 β<1\lvert\beta\rvert<1 α+β+P(z<0)γ<1\alpha+\beta+P(z<0)\gamma<1
Başlangıca göre ek param. 0 γ,ν\gamma,\nu γ,ν\gamma,\nu γ,ν,λ\gamma,\nu,\lambda
Tipik kripto verdikti VaR testinde başarısız güçlü, sağlam güçlü, sağlam GJR-t üzerine marjinal

Içselleştirilecek örüntü: 1. sütundan 2. sütuna sıçrama (asimetri ile kalın kuyrukları aynı anda eklemek), risk-kalibrasyonu iyileşmesinin neredeyse tamamının bulunduğu yerdir. Sonraki incelikler (EGARCH'ın işlevsel formu, çarpıklık terimi) gerçektir ama ikinci derecedir ve birçok kripto serisinde gürültünün içindedir. Modelleme bütçenizi ilk sıçramaya harcayın ve gerisine şüphe ile yaklaşın.

Risk Uygulaması: VaR ve Expected Shortfall

Daha süslü bir oynaklık modeli kurmak, ancak bir kararı iyileştiriyorsa değerlidir. Iyileştirilecek en temiz karar, tek adımlık kuyruk-riski öngörüsüdür: yarın ne kadar kötü olabilir? Kurulan GARCH-tt/çarpık-tt öngörüsünden doğrudan bir günlük ileri Value-at-Risk ve Expected Shortfall (namıdiğer Koşullu VaR; HRP/CVaR portfoy hattının amaç fonksiyonu olarak kullandığı) üretiyoruz.

Koşullu Dağılımdan VaR'a

GARCH mekanizması, koşullu ortalama μt+1\mu_{t+1} ve koşullu standart sapma σt+1\sigma_{t+1} için tek adımlık bir öngörü verir. Getiri rt+1=μt+1+σt+1zt+1r_{t+1} = \mu_{t+1} + \sigma_{t+1} z_{t+1} olarak modellenir; zt+1z_{t+1} kurulan standartlaştırılmış dağılımdan (Gauss, tt ya da çarpık-tt) çekilir. Dolayısıyla getirinin α\alpha-kuantili, standartlaştırılmış dağılımın α\alpha-kuantilinin yalnızca afin bir dönüşümüdür:

VaRα(t+1)=(μt+1+σt+1Fz1(1α))\text{VaR}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, F_z^{-1}(1-\alpha)\Bigr)

burada Fz1F_z^{-1} standartlaştırılmış inovasyonun kuantilidir (ters CDF) ve baştaki eksi işareti, VaR'ın pozitif bir kayıp sayısı olduğu uzlaşımını izler. %99 VaR için α=0.99\alpha = 0.99'dur ve Fz1(0.01)F_z^{-1}(0.01)'i yerine koyarsınız. tt/çarpık-tt'nin tüm faydası burada ortaya çıkar: Fz1(0.01)F_z^{-1}(0.01) Gauss 2.326-2.326'dan daha negatiftir, dolayısıyla VaR dürüstçe daha büyüktür.

Expected Shortfall

VaR size eşiği söyler; aşım gerçekleştiğinde bunun ne kadar kötü olduğu hakkında hiçbir şey söylemez. Expected Shortfall (VaR'ı aştığı koşuluyla ortalama kayıp) bunu söyler ve tutarlıdır (alt-toplamsal), dolayısıyla CVaR optimizasyonunun arkasındaki risk ölçüsüdür ve Basel'in ona geçmesinin nedenidir. Bir konum-ölçek modeli için,

ESα(t+1)=(μt+1+σt+1E ⁣[zzFz1(1α)]).\text{ES}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, \mathbb{E}\!\left[z \mid z \leq F_z^{-1}(1-\alpha)\right]\Bigr).

Koşullu-kuyruk-beklentisi terimi E[zzq]\mathbb{E}[z \mid z \le q], standart dağılımlar için kapalı formlara sahiptir. Gauss için, q=Φ1(1α)q = \Phi^{-1}(1-\alpha) ile,

E[zzq]=ϕ(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\phi(q)}{1-\alpha},

burada ϕ\phi standart normal yoğunluktur (pdf). ν\nu serbestlik dereceli ve q=tν1(1α)q = t_\nu^{-1}(1-\alpha) (standartlaştırılmış ölçekte) ile standartlaştırılmış Student-tt için, kuyruk beklentisi şöyledir

E[zzq]=ν+q2ν1gν(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\nu + q^2}{\nu - 1}\cdot\frac{g_\nu(q)}{1-\alpha},

burada gνg_\nu standartlaştırılmış-tt yoğunluğudur. tt Expected Shortfall, Gauss olanı VaR'ın aştığından daha fazla aşar, çünkü tt kuyruğu yalnızca daha uzakta değildir; daha kalındır, dolayısıyla eşiğin ötesindeki ortalama kayıp orantısız büyüktür. O fazladan boşluk, bir Gauss modelinin sizden sakladığı sayıdır.

Kurulan Bir arch Modelinden VaR ve ES Hesaplamak

arch dağılımları bir ppf (kuantil) metodu sunar, dolayısıyla standartlaştırılmış kuantili doğrudan alabilir ve hiçbir şeyi yeniden türetmekten kaçınabiliriz. ES için sayısal olarak integral alırız; bu sağlamdır ve normal/t/skewt boyunca yeknesak biçimde çalışır.

from scipy import integrate

def var_es_forecast(res, alpha=0.99):
    """
    One-step-ahead VaR and ES at level alpha, on the same (x100) scale
    as the returns fed to the model. Divide by 100 for fractional units.
    """
    fc = res.forecast(horizon=1, reindex=False)
    mu = fc.mean.iloc[-1, 0]
    sigma = np.sqrt(fc.variance.iloc[-1, 0])

    dist = res.model.distribution          # StudentsT / SkewStudent / Normal
    dp = [res.params[k] for k in res.params.index
          if k in ("nu", "eta", "lambda", "lam")]

    z_q = dist.ppf(1 - alpha, dp) if dp else dist.ppf(1 - alpha)
    z_q = float(np.atleast_1d(z_q)[0])

    def pdf(z):
        arr = np.atleast_1d(z).astype(float)
        lp = dist.loglikelihood(dp, arr, np.ones_like(arr), individual=True) \
             if dp else dist.loglikelihood([], arr, np.ones_like(arr),
                                           individual=True)
        return np.exp(lp)

    num, _ = integrate.quad(lambda z: z * pdf(z), -30, z_q, limit=200)
    es_z = num / (1 - alpha)               # E[z | z <= z_q]

    var = -(mu + sigma * z_q)
    es  = -(mu + sigma * es_z)
    return {"mu": mu, "sigma": sigma, "z_q": z_q,
            "VaR": var, "ES": es}

for name in ["GARCH-N", "GJR-t", "GJR-skewt"]:
    out = var_es_forecast(models[name], alpha=0.99)
    print(f"{name:11s}  sigma={out['sigma']:.2f}%  "
          f"z_q={out['z_q']:+.2f}  "
          f"VaR99={out['VaR']:.2f}%  ES99={out['ES']:.2f}%")

z_q sütunu tüm hikayeyi tek bir sayıda anlatır. Gauss model zq2.33z_q \approx -2.33 kullanır; ν4.3\nu \approx 4.3 ile tt, 3.3-3.3 civarında bir şey kullanır; çarpık-tt sol kuantili daha da dışarı iterken sağ olanı içeri çeker. Aynı σt+1\sigma_{t+1}, ciddi ölçüde daha büyük VaR. Kriptoda Gauss VaR çalıştırıyorduysanız, bu, sessizce üstlendiğiniz boşluktur.

Tek Adım ve Çok Adım: Bir Uyarı

Yukarıdaki her şey bir günlük ileri bir öngörüdür ve GARCH VaR'ın en temiz olduğu yer burasıdır. Iki şey daha uzun ufukları karmaşıklaştırır ve dısarı ekstrapole etmeden önce bunları bilmelisiniz.

Birincisi, varyans öngörüleri ortalamaya geri döner. Durağan bir GARCH'tan gelen hh-adım-ileri koşullu varyans, hh büyüdükçe koşulsuz düzey σˉ2\bar\sigma^2'ye yakınsar ve kümülatif hh-günlük varyans, adım-başına öngörülerin toplamıdır; oynaklık uzun dönem ortalamasında değilse h×σt+12h\times\sigma_{t+1}^2 değildir. Naif "zamanın karekoku" ölçeklemesi VaR(h)=hVaR(1)\text{VaR}(h) = \sqrt{h}\,\text{VaR}(1) bu ortalamaya dönüşü görmezden gelir ve tam olarak bir şoktan sonra (sayıya en çok ihtiyaç duyduğunuzda) yanlıştır. Modelin kendi çok-adımlı varyans yolunu kullanın.

Ikincisi, çok-günlük bir getirinin dağılımı, bir günlük inovasyonla aynı şekilde değildir. Birkaç tt-dağılımlı günlük şoku (doğrusal olmayan GARCH özyinelemesi üzerinden) toplamak, hh-günlük ufukta bir tt dağılımı vermez; temiz bir kapalı form yoktur. Çok-günlük VaR için dürüst yol simulasyondur: kurulan standartlaştırılmış dağılımdan inovasyon yolları çekin, bunları simule edilmiş getiri yolları elde etmek için GARCH özyinelemesinden geçirin, hh-günlük getirilere toplayın ve ampirik kuantili okuyun. Bu, hiçbir analitik çok-ufuklu kuantilin var olmadığı çarpık-tt durumunu da doğal olarak halleder. Bu yazıdaki tek adımlık analitik formuller kesindir; herhangi bir çok-adımlı kestirmeyi doğrulanacak bir yaklaşım olarak ele alın.

VaR'ı Geriye Dönük Sınamak: Kupiec ve Christoffersen

Bir VaR öngörüsü olasılıksal bir iddiadır: kayıp bu eşiği yalnızca günlerin (1α)(1-\alpha)'ında aşacak. Bunu, ileriye dönük bir değerlendirme boyunca ihlalleri (gerçekleşen kaybın öngörülen VaR'ı aştığı günler) sayarak ve iki şeyi denetleyerek test edersiniz. Birincisi, ihlal oranı doğru mu? Ikincisi, ihlaller bağımsız mı, yoksa kümeleniyorlar mı (bu, modelin tam da önemli olduğu anda, oynaklık sıçramaları sırasında başarısız olması demektir)?

It=1{losst>VaRt}I_t = \mathbf{1}\{\text{loss}_t > \text{VaR}_t\} ihlal dizisi, N=ItN = \sum I_t TT gün boyunca ihlal sayısı ve π^=N/T\hat{\pi} = N/T gözlenen oran olsun. Hedef oran p=1αp = 1-\alpha.

Kupiec'in koşulsuz kapsama testi (1995), bir olabilirlik oranı aracılığıyla π^p\hat\pi \approx p'yi denetler:

LRuc=2log ⁣[pN(1p)TNπ^N(1π^)TN]    χ12.LR_{uc} = -2\log\!\left[\frac{p^{N}(1-p)^{T-N}}{\hat\pi^{N}(1-\hat\pi)^{T-N}}\right] \;\sim\; \chi^2_1.

Christoffersen'in bağımsızlık testi (1998), bugünkü bir ihlalin dünkü bir ihlalle öngörülmediğini denetler. nijn_{ij}, ihlal dizisinde ii durumundan jj durumuna geçişleri saysın, π01=n01/(n00+n01)\pi_{01} = n_{01}/(n_{00}+n_{01}), π11=n11/(n10+n11)\pi_{11} = n_{11}/(n_{10}+n_{11}) ve π=(n01+n11)/T\pi = (n_{01}+n_{11})/T olsun. O halde

LRind=2log ⁣[(1π)n00+n10πn01+n11(1π01)n00π01n01(1π11)n10π11n11]    χ12.LR_{ind} = -2\log\!\left[\frac{(1-\pi)^{n_{00}+n_{10}}\,\pi^{\,n_{01}+n_{11}}}{(1-\pi_{01})^{n_{00}}\pi_{01}^{n_{01}}(1-\pi_{11})^{n_{10}}\pi_{11}^{n_{11}}}\right] \;\sim\; \chi^2_1.

Ikisi, doğru oranı ve bağımsızlığı aynı anda denetleyen koşullu kapsama testi LRcc=LRuc+LRindχ22LR_{cc} = LR_{uc} + LR_{ind} \sim \chi^2_2'de birleşir. Bir model Kupiec'i (doğru sayıda ihlal) geçip yine de Christoffersen'i (hepsi tek bir çöküş haftasında yığılmış) geçemeyebilir; en çok yakalamak isteyeceğiniz başarısızlık modu budur, çünkü kümelenmiş ihlaller bir hesabı patlatanlardır.

from scipy.stats import chi2

def var_backtest(losses, var, p):
    """
    losses, var: 1D arrays, same length; loss>0 is a loss, var>0 threshold.
    p = 1 - alpha (target violation rate, e.g. 0.01 for 99% VaR).
    Returns Kupiec, Christoffersen-independence, and conditional-coverage LR.
    """
    losses = np.asarray(losses)
    var = np.asarray(var)
    I = (losses > var).astype(int)          # violation indicators
    T = len(I)
    N = int(I.sum())
    pi_hat = N / T

    eps = 1e-12
    ll_null = N * np.log(p + eps) + (T - N) * np.log(1 - p + eps)
    ll_alt  = N * np.log(pi_hat + eps) + (T - N) * np.log(1 - pi_hat + eps)
    LR_uc = -2 * (ll_null - ll_alt)
    p_uc = 1 - chi2.cdf(LR_uc, df=1)

    n00 = np.sum((I[:-1] == 0) & (I[1:] == 0))
    n01 = np.sum((I[:-1] == 0) & (I[1:] == 1))
    n10 = np.sum((I[:-1] == 1) & (I[1:] == 0))
    n11 = np.sum((I[:-1] == 1) & (I[1:] == 1))
    pi01 = n01 / (n00 + n01) if (n00 + n01) else 0.0
    pi11 = n11 / (n10 + n11) if (n10 + n11) else 0.0
    pi   = (n01 + n11) / (n00 + n01 + n10 + n11)

    def _ll(pi01, pi11, pi_pooled, use_pooled):
        if use_pooled:
            a = (n00 + n10) * np.log(1 - pi_pooled + eps)
            b = (n01 + n11) * np.log(pi_pooled + eps)
            return a + b
        return (n00 * np.log(1 - pi01 + eps) + n01 * np.log(pi01 + eps)
                + n10 * np.log(1 - pi11 + eps) + n11 * np.log(pi11 + eps))

    LR_ind = -2 * (_ll(pi01, pi11, pi, True) - _ll(pi01, pi11, pi, False))
    p_ind = 1 - chi2.cdf(LR_ind, df=1)

    LR_cc = LR_uc + LR_ind
    p_cc = 1 - chi2.cdf(LR_cc, df=2)

    return {
        "T": T, "violations": N,
        "obs_rate": pi_hat, "target_rate": p,
        "LR_uc": LR_uc, "p_uc": p_uc,
        "LR_ind": LR_ind, "p_ind": p_ind,
        "LR_cc": LR_cc, "p_cc": p_cc,
    }

losses/var girdilerini dürüstçe üretmek için, genişleyen ya da kayan bir pencerede yeniden kurar (ya da en azından yeniden öngörür) ve her örneklem-dışı gün için bir adımlık ileri VaR'ı kaydeder, ardından onu o günün gerçekleşen kaybıyla karşılaştırırsınız. VaR'ı asla örneklem içi geriye dönük sınamayın; öngörmesi istenen çöküşün aynısı üzerinde kurulan bir model, olduğundan çok daha iyi görünür. Bu, geriye dönük test-canlı eşliği (backtest-live parity) ile aynı disiplindir: değerlendirme yalnızca karar anında mevcut bilgiyi kullanmalıdır.

def walk_forward_var(returns, alpha=0.99, start=750, refit_every=25,
                     vol="Garch", o=1, dist="t"):
    """
    Expanding-window one-step VaR. Refit every `refit_every` days
    (refitting daily is correct but slow; every ~25 days is a common
    compromise -- validate the shortcut on your data).
    """
    losses, vars_ = [], []
    res = None
    for t in range(start, len(returns)):
        if res is None or (t - start) % refit_every == 0:
            am = arch_model(returns.iloc[:t], mean="Constant",
                            vol=vol, p=1, o=o, q=1, dist=dist)
            res = am.fit(disp="off")
        fc = res.forecast(horizon=1, reindex=False)
        mu = fc.mean.iloc[-1, 0]
        sig = np.sqrt(fc.variance.iloc[-1, 0])
        dp = [res.params[k] for k in res.params.index
              if k in ("nu", "eta", "lambda", "lam")]
        z_q = float(np.atleast_1d(
            res.model.distribution.ppf(1 - alpha, dp) if dp
            else res.model.distribution.ppf(1 - alpha))[0])
        var_t = -(mu + sig * z_q)
        vars_.append(var_t)
        losses.append(-returns.iloc[t])     # realized loss for that day
    return np.array(losses), np.array(vars_)

losses, vars_ = walk_forward_var(r, alpha=0.99, dist="t")
print(var_backtest(losses, vars_, p=0.01))

Yorum: iyi kalibre edilmiş bir %99 VaR, %1'e yakın bir gözlenen oran, anlamsız bir Kupiec (büyük p_uc) ve anlamsız bir Christoffersen (büyük p_ind; kümelenme yok) gösterir. Uygulamada kriptodaki dürüst sonuç şudur: GARCH-Normal Kupiec'te başarısız olur (çok fazla ihlal, küçücük p_uc) ama GJR-tt ya da EGARCH-tt geçer ya da yaklaşır. Bu karşıtlık, bu yazının tüm savının bir hipotez testi olarak ifadesidir. tt modeli bile kümelenmiş ihlaller gösteriyorsa (küçük p_ind), oynaklık dinamikleriniz hala yanlış belirtilmiştir; çoğu zaman daha uzun bir bellek (bilesen/FIGARCH) ya da bir rejim katmanına ihtiyacınız olduğunun işaretidir; ki bu HMM'lerle rejim tespitiyle bağlantılıdır.

Modelleri Yalnızca Geçti/Kaldı Değil, Kuyruk Kaybına Göre Sıralamak

Kupiec ve Christoffersen size ikili bir verdikt verir; model ya reddedilir ya da edilmez. Bu gereklidir ama kabadır: iki model de "geçebilir" ama biri anlamlı ölçüde daha keskin olabilir. Rakip VaR öngörülerini sıralamak için, onları kuantil için kesinlikle tutarlı bir kayıp fonksiyonuyla, pinball (kuantil) kaybıyla puanlayın:

Lτ(r,q)=(τ1{r<q})(rq),τ=1α,L_\tau(r, q) = \bigl(\tau - \mathbf{1}\{r < q\}\bigr)\,(r - q), \qquad \tau = 1-\alpha,

burada qq (işaretli) VaR kuantili ve rr gerçekleşen getiridir. Örneklem-dışı günler üzerinde ortalanmış, daha düşük bir ortalama pinball kaybı, daha iyi kalibre edilmiş ve daha keskin bir kuantil demektir; kayıp τ\tau-kuantili için tutarlı olduğundan, onu enküçültmek bir modeli tembelce geniş olması için ödüllendirmez. Iki modeli biçimsel olarak karşılaştırmak için, gün-başına kayıp farklarını bir Diebold-Mariano testine verin.

def pinball_loss(returns, var, alpha=0.99):
    tau = 1 - alpha
    q = -np.asarray(var)               # VaR is a positive loss; quantile is negative
    r = np.asarray(returns)
    hit = (r < q).astype(float)
    return np.mean((tau - hit) * (r - q))

Özellikle Expected Shortfall için şunu not edin: ES tek başına ortaya çıkarılabilir (elicitable) değildir (enküçülteni yalnızca ES olan bir kayıp fonksiyonu yoktur); bu, gerçek bir kuramsal kırışıklıktır: ES'yi VaR ile birlikte Fissler-Ziggel puanlama kurallarını kullanarak değerlendirir ya da ortalama aşım büyüklüğünün modelin öngördüğü ES ile eşleştiğini denetleyen daha basit uygulamaya geri dönersiniz. Kaba ama kullanışlı bir ES denetimi: VaR-ihlali günleri arasında, ortalama gerçekleşen kaybı o günlerdeki ortalama öngörü ES ile karşılaştırın; yakın olmalıdırlar.

Düzenleyici çerçeveleme Basel trafik-ışığı yaklaşımıdır: 250 işlem günü boyunca, bir %99 VaR'ın 0-4 ihlali "yeşil" (kabul edilebilir), 5-9 "sarı" (inceleme) ve 10+ "kırmızı" (model reddedilir ve sermaye çarpanları yükselir) olur. Kupiec'in daha kaba bir kuzenidir, ama risk komitelerinin gerçekten konuştuğu dildir ve LR istatistikleriyle birlikte raporlamaya değer.

Pratik Değerlendirmeler

Ek Parametreler Kendini Ödemediğinde

Dürüst varsayılan, karmaşıklığa karşı şüphedir. Eklediğniz her parametre, optimizasyoncunun aşırı uydurabileceği bir düğmedir ve asimetrik kalın-kuyruklu GARCH'ın birkaç tanesi vardır. Somut yol gösterme:

  • Likit olmayan ya da kısa örneklemler. Birkaç yüz günlük gözlemle, γ\gamma ve λ\lambda üzerindeki standart hata büyük olur ve örneklem gürültüsü olan asimetriler tespit edersiniz. Yeni ya da ince bir altcoin'de, simetrik bir GARCH-tt çoğu zaman verinin destekleyebileceği en karmaşık modeldir. 200 güne çarpık-tt EGARCH kurmak kendinizi kandırmaktır.
  • Çarpıklık terimi çoğu zaman maliyetini karşılamaz. Uygulamada Normal → tt'ye geçmek büyük, güvenilir bir iyileşmedir (kalın kuyruklar gerçek ve güçlüdür). tt → çarpık-tt'ye geçmek çoğu zaman marjinaldir; 1 ya da 2'lik bir BIC kazancı, bazen negatif. Çarpıklığı yalnızca veri açıkça istediğinde ekleyin.
  • EGARCH ve GJR, günlük veride genellikle başa baştır. Aynı niteliksel hikayeyi farklı işlevsel formlarla kodlarlar. Örneklem-dışı VaR geriye dönük testiyle seçin, örneklem içi hangisinin daha güzel log-olabilirliğe sahip olduğuyla değil.
  • Daha yüksek frekans cevabı değiştirir. Saatlik ya da dakikalık çubuklarda, gün içi mevsimsellik ve mikroyapı hakimdir ve yalın günlük-tarzı bir GARCH, asimetriden bağımsız olarak yanlış belirtilmiştir. Farklı sorun, farklı arac takımı.

Bu, sağlam bir kenar olmadan dürüst değerlendirme ile aynı derstir: örneklem-dışı testi geçemeyen daha karmaşık bir model, yerine geçtiği basit olandan daha kötüdür, çünkü kesinlik yanılsaması taşır. Negatif sonucu ("çarpıklık ETH'de yardımcı olmadı") gerçek bir bulgu olarak raporlayın ve örneklem içi AIC'yi değil, ileriye dönük (walk-forward) optimizasyonu hakem olarak kullanın.

Bunlar, Herkesin Üzerine Inşa Ettiği Marjinallerdir

Buradaki modeller bir varış noktası değildir; ortak-risk mekanizması için tek-değişkenli yapı taşlarıdır. Ortak kripto riski için kopula modelleri yazısı, bir asma (vine) kopula kurmadan önce GARCH-EVT marjinalleri olarak tam olarak EGARCH/GJR-tt kullanır; her varlık için asimetrik kalın-kuyruklu bir GARCH kurar, standartlaştırılmış artıkları çıkarır ve ancak o zaman varlıklar-arası bağımlılığı modellersiniz. Marjinaliniz simetrik bir Gauss GARCH ise, bağımlılık modeli ne kadar iyi olursa olsun kopula onun kuyruk hatalarını miras alır. Çöplük marjinaller, çöplük ortak VaR.

Çok-değişkenli oynaklık sorunu için (varlık-başına varyanslar yerine zamanla değişen korelasyonlar) bkz. 3. Bölüm, DCC-GARCH; bu, bu tek-değişkenli uyumların üzerine dinamik-korelasyon bir model katmanlar. Ve bir oynaklık öngörüsünü pozisyon boyutlandırmasına ve bir işlem geriye dönük testine dönüştürmek için, oynaklık hedefleme üzerine 4. Bölüm, maruziyeti öngörülen riskin tersiyle ölçeklemek için tam olarak bu modellerin σt+1\sigma_{t+1} öngörülerini kullanır.

Dağılımdan Bağımsız Bir Alternatif

Risk bölümündeki her şey parametrik bir varsayıma dayanır: standartlaştırılmış artıkların bir tt ya da çarpık-tt izlediği. Bu varsayım test edilebilir ve genellikle makuldur, ama başarısız olabilir. Bir kuyruk şekline hiç bağlanmak istemiyorsanız, konformal öngörü (conformal prediction), sonlu-örneklem kapsama garantileriyle dağılımdan bağımsız öngörü aralıkları verir; inovasyon dağılımı hakkında hiçbir iddiada bulunmayan gerçekten farklı bir felsefe. Iki yaklaşım tamamlayıcıdır: parametrik GARCH-tt size tam bir koşullu yoğunluk verir (ve böylece konformal aralıkların doğrudan sağlamadığı ES'yi), oysa konformal, yoğunluğunuz yanlış olduğunda bile geçerli kapsama verir. Üretimde ikisini bir çapraz-denetim olarak kullanmak ucuz sigortadır.

Sayısal ve Is Akışı Hijyeni

  • Getirileri 100 ile ölçekleyin. GARCH optimizasyoncuları, yüzde getirilerde ham kesirli getirilere göre çok daha güvenilir biçimde yakınsar. Kesirli birimlerle raporluyorsanız VaR/ES'yi geri ölçeklemeyi unutmayın.
  • Kalıcılığa dikkat edin. α+β+12γ\alpha + \beta + \tfrac12\gamma ~0.999'un üzerinde tahmin edilirse, model neredeyse bütünleşiktir (IGARCH-benzeri); öngörüler çok yavaş ortalamaya döner ve uzun-ufuklu varyans öngörüleri güvenilmez olur. Zorunlu olarak yanlış değil, ama işaretleyin.
  • Kayan pencerelerde yakınsama başarısızlıkları. EGARCH'ın log formu pozitiflik kısıtlarından kaçınır ama yine de patolojik bir pencerede yakınsamayabilir. fit()'i bir try/except içine sarın ve canlı bir geriye dönük testi çökertmek yerine önceki pencerenin parametrelerine geri dönün.
  • Ortalama modeli. Baştan sona sabit bir ortalama kullandık. Çoğu günlük kripto için koşullu ortalama sıfıra yakındır ve oynaklık tarafından boğulur; gerçek bir nedeniniz olmadıkça onu öngörmeye çalışarak model karmaşıklığı harcamayın.

Özet

  • Yalın GARCH(1,1)'in iki yapısal kusuru vardır: simetriktir (şoklar ε2\varepsilon^2 olarak girdiği için +x%+x\% ve x%-x\%'e özdeş tepki verir) ve Gauss inovasyonları varsayar (kriptonun kalın kuyruklarını düşük fiyatlar). Ikisi de iyimser VaR yoluyla gerçek para maliyeti çıkarır.
  • GJR-GARCH, bir eşik terimi γI(εt1<0)εt12\gamma\,I(\varepsilon_{t-1}<0)\,\varepsilon_{t-1}^2 ekler. Anlamlı bir γ>0\gamma > 0 kaldıraç etkisidir: kötü haber oynaklığı daha fazla yükseltir. Pozitiflik α+γ0\alpha+\gamma\ge0'ı gerektirir; kalıcılık α+β+12γ\alpha+\beta+\tfrac12\gamma'dır.
  • EGARCH, logσt2\log\sigma_t^2'yi modeller, dolayısıyla pozitiflik kısıtı yoktur ve durağanlık yalnızca β<1|\beta|<1'dir. Asimetri, bir büyüklük teriminden zt1|z_{t-1}| ayrılmış işaretli bir terim γzt1\gamma z_{t-1} aracılığıyla girer (bu uzlaşımda kaldıraç γ<0\gamma<0'dır).
  • Haber etki eğrisi (bir sonraki dönem varyansına karşı son şok) asimetriyi görünür kılar ve EGARCH işaret uzlaşımını tek bakışta doğrular.
  • Student-tt inovasyonları (dist='t'), kuyrukları bir serbestlik derecesi ν\nu (kripto için tipik olarak 3-6) aracılığıyla düzeltir; Hansen'in çarpık-tt'si (dist='skewt'), daha ağır bir sol kuyruk için bir çarpıklık λ\lambda ekler. Normal → tt'ye geçmek büyük, güvenilir bir kazançtır; tt → çarpık-tt çoğu zaman marjinaldir.
  • VaR ve ES, kurulan koşullu dağılımdan çıkar: VaRα=(μt+1+σt+1Fz1(1α))\text{VaR}_\alpha = -(\mu_{t+1} + \sigma_{t+1}F_z^{-1}(1-\alpha)); kalın-kuyruklu kuantil, riski Gauss'a göre dürüstçe daha büyük yapar. ES (tutarlı, \approx CVaR) VaR'ın ötesindeki ortalama kaybı yakalar.
  • Kupiec ve Christoffersen ile geriye dönük sınayın. Kupiec ihlal oranını denetler; Christoffersen ihlallerin kümelenmediğini denetler. Bir model birini geçip diğerinde kalabilir; kümelenmiş ihlaller tehlikeli başarısızlık modudur. Kesinlikle örneklem dışı geriye dönük sınayın.
  • Karmaşıklık üzerine disiplin. Asimetri/çarpıklığı yalnızca hem BIC'i hem de bir örneklem-dışı VaR geriye dönük testini geçtiğinde ekleyin. Kısa ya da likit olmayan serilerde daha basit model genellikle kazanır.

References:

  • Nelson, D. B. (1991). Conditional heteroskedasticity in asset returns: A new approach. Econometrica, 59(2), 347-370. DOI
  • Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
  • Bollerslev, T. (1987). A conditionally heteroskedastic time series model for speculative prices and rates of return. Review of Economics and Statistics, 69(3), 542-547. DOI
  • Hansen, B. E. (1994). Autoregressive conditional density estimation. International Economic Review, 35(3), 705-730. DOI
  • Engle, R. F., & Ng, V. K. (1993). Measuring and testing the impact of news on volatility. Journal of Finance, 48(5), 1749-1778. DOI
  • Christoffersen, P. F. (1998). Evaluating interval forecasts. International Economic Review, 39(4), 841-862. DOI
  • Kupiec, P. H. (1995). Techniques for verifying the accuracy of risk measurement models. Journal of Derivatives, 3(2), 73-84. DOI
  • Black, F. (1976). Studies of stock price volatility changes. Proceedings of the American Statistical Association, Business and Economic Statistics Section, 177-181.
  • McNeil, A. J., Frey, R., & Embrechts, P. (2015). Quantitative Risk Management: Concepts, Techniques and Tools (2nd ed.). Princeton University Press.
  • Sheppard, K. (2023). arch: Autoregressive conditional heteroskedasticity models in Python. GitHub.
Sorumluluk Reddi: Bu makalede sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır ve finansal, yatırım veya ticaret tavsiyesi niteliği taşımaz. Kripto para ticareti önemli bir kayıp riski içerir.

MarketMaker.cc Team

Kantitatif Araştırma & Strateji

Telegram'da tartışın
Newsletter

Piyasanın Önünde Olun

Özel yapay zeka ticaret içgörüleri, piyasa analizi ve platform güncellemeleri için bültenimize abone olun.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.