Asimetrik ve Kalın Kuyruklu GARCH: EGARCH, GJR ve Student-t
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 güne tıpkı bir güne tepki verdiği gibi tepki verir, çünkü şok varyans özyinelemesine yalnızca karesiyle, 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- ve Hansen'in çarpık- 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 alın ve bunları önceki şokun işaret ve büyüklük göstergelerine göre regres edin:
burada ve . 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 olur. Bireysel -testleri sırasıyla işaret-yanlılık (), negatif-büyüklük-yanlılık () ve pozitif-büyüklük-yanlılık () testleridir; üçünün tümüne uygulanan ortak bir -testi genel (omnibus) testtir. Anlamlı bir ya da , 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 -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:
GJR tek bir eşik terimi ekler: yalnızca negatif bir şoktan sonra devreye giren fazladan bir varyans doz.
burada şu göstergedir
Özyinelemeyi durumlara göre okuyun. Pozitif bir şoktan () sonra gösterge sıfırdır ve karesi alınmış şokun bir sonraki dönem varyansına etkisi yalnızca 'dır. Negatif bir şoktan sonra gösterge birdir ve etki olur. parametresi, tüm asimetri hikayesini tek bir sayıda özetler:
- : 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.
- : model simetrik GARCH(1,1)'e geri çöker. Dolayısıyla üzerine bir olabilirlik-oranı ya da -testi, asimetrinin hiç var olup olmadığının doğrudan bir testidir.
- : 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
hala toplamsal olarak kurulduğu için, her terimin negatif olmaması gerekir. Yeterli pozitiflik koşulları şunlardır
'nın kendisinin, 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 sıfır etrafında simetrik bir dağılımla standartlaştırıldığını varsayın; böylece olur ve gösterge ortalamada katkı yapar. Durağanlık koşulu şu hale gelir
Koşulsuz (uzun dönem) varyans o zaman şöyledir
Bu, 1. Bölümdeki sonucunun GJR karşılığıdır; ek 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-), yerine gerçek olasılığı gelir; ancak raporlanan kalıcılık için standart referans '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. herhangi bir gerçek sayı olabildiği için, parametreler ne olursa olsun otomatik olarak pozitiftir. Dayatılacak bir kısıt yoktur.
Özyinelemeyi standartlaştırılmış inovasyon cinsinden yazın:
Şoku iki terim taşır ve bunları ayırmak işin tüm fikridir:
- Büyüklük terimi , şokun büyüklüğüne tepki verir, işaret çıkarılmıştır. 'i çıkarmak terimi merkezler, böylece ortalama-büyüklükte bir şok hiçbir katkı yapmaz. Standart normal için ; standartlaştırılmış bir Student- için beklenen mutlak değer daha küçüktür ve 'ye bağlıdır, ama
archbunu içsel olarak halleder. - Işaret terimi asimetridir. Işaretli inovasyonda doğrusaldır, dolayısıyla negatif bir , '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) 'a karşılık gelir: negatif bir şok o zaman yapar ve log-varyansı artırır. Bu, GJR'nin 'ı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ığı üzerindeki tek otoregresif katsayı tarafından yönetilir; durağanlık yalnızca '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): 'i uzun dönem düzeyinde sabit tutun ve bir sonraki dönem koşullu varyansı 'yi son şok '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 ve bir şok aynı yüksekliktedir. Bu, tam olarak düzelttiğimiz kusurdur.
- GJR, sıfırda bir kırığa sahip bir parabol üretir; olduğunda solda (negatif şoklar) sağdan daha diktir. Iki yarının eğrilikleri sırasıyla ve 'dır.
- EGARCH, asimetrik, üssel bir V şekli üretir: 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 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 aşırı basıklığı (excess kurtosis) korur; kalın kuyrukludurlar. Bir Gauss olabilirliği, dağılımın omuzlarına uyum sağlayarak, bir -, - ya da -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, kuantilini kullanır, dolayısıyla öngörür. Gerçek standartlaştırılmış dağılım, diyelim ki serbestlik dereceli bir Student- ise, gerçek %1 kuantili civarındadır; Gauss VaR bu güven düzeyinde kabaca 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) -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- yoğunluğunun, kuyruk kalınlığını kontrol eden bir serbestlik derecesi parametresi vardır: küçük kalın kuyruklar demektir ve oldukça , Gauss'a yakınsar. Puf noktası şu: ham dağılımının varyansı 'dir, dolayısıyla onu bir inovasyon olarak kullanmadan önce birim varyansa standartlaştırmalıyız; aksi halde GARCH özyinelemesindeki "" aslında koşullu standart sapma olmazdı.
Birim varyanslı standartlaştırılmış Student- inovasyonunun yoğunluğu şöyledir
Içerideki 'ye dikkat edin; bu, olacak şekilde yeniden ölçekleyen standartlaştırmadır. GARCH koşullu varyansı ve verildiğinde, bir gözlemin log-olabilirlik katkısı şöyledir
terimi, 'den '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. 'yi GARCH parametreleri ve üzerinde birlikte enbüyüklemek, dist='t' verdiğinizde arch'ın tam olarak yaptığı şeydir.
Tahmin edilen 'nun kendisi bilgilendiricidir. Günlük BTC/ETH getirileri için tipik olarak aralığına düşersiniz; kalın kuyruklar, ama sonlu varyansla ( gerektirir) ve genellikle sonlu basıklıkla ( gerektirir). Kurulan '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- 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-'si (1994), standartlaştırılmış 'yi, 'nun yanında bir çarpıklık parametresi ile genellestirir:
burada , ve sabitleri, geçerli her için 'nin sıfır ortalama ve birim varyansa sahip olması için seçilir. Dağılım '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: , 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. simetrik Student-'yi geri getirir, dolayısıyla testi, çarpıklık teriminin bir şey kazandırıp kazandırmadığını söyler. arch'ta bu dist='skewt''dir ve hem hem de '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: 'lik bir düşüşü telafi etmek '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 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 () 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- 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 -istatistiğiyle
gamma[1] = 0.091, istatistiksel olarak anlamlı bir kaldıraç etkisidir. Negatif bir şoktan sonra karesi alınmış şokun etkisi 'tür; pozitif bir şoktan sonra yalnızca 'dir. Kötü haber, bu modelin oynaklığını aynı büyüklükteki iyi haberin kabaca katı kadar hareket ettirir. nu = 4.3kalın kuyrukları doğrular; Gauss'tan () ç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 '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 satırıdır. -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, '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 ve ş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 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şaretli | eşik |
| Inovasyon kuyruk şekli | Gauss | Student- | Student- | çarpık- |
| Inovasyonda çarpıklık | hayır | hayır | hayır | evet () |
| Pozitiflik kısıtları | evet | evet () | yok (log form) | evet |
| Durağanlık koşulu | ||||
| Başlangıca göre ek param. | 0 | |||
| 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-/çarpık- ö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 ve koşullu standart sapma için tek adımlık bir öngörü verir. Getiri olarak modellenir; kurulan standartlaştırılmış dağılımdan (Gauss, ya da çarpık-) çekilir. Dolayısıyla getirinin -kuantili, standartlaştırılmış dağılımın -kuantilinin yalnızca afin bir dönüşümüdür:
burada 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 'dur ve 'i yerine koyarsınız. /çarpık-'nin tüm faydası burada ortaya çıkar: Gauss '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,
Koşullu-kuyruk-beklentisi terimi , standart dağılımlar için kapalı formlara sahiptir. Gauss için, ile,
burada standart normal yoğunluktur (pdf). serbestlik dereceli ve (standartlaştırılmış ölçekte) ile standartlaştırılmış Student- için, kuyruk beklentisi şöyledir
burada standartlaştırılmış- yoğunluğudur. Expected Shortfall, Gauss olanı VaR'ın aştığından daha fazla aşar, çünkü 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 kullanır; ile , civarında bir şey kullanır; çarpık- sol kuantili daha da dışarı iterken sağ olanı içeri çeker. Aynı , 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 -adım-ileri koşullu varyans, büyüdükçe koşulsuz düzey 'ye yakınsar ve kümülatif -günlük varyans, adım-başına öngörülerin toplamıdır; oynaklık uzun dönem ortalamasında değilse değildir. Naif "zamanın karekoku" ölçeklemesi 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ç -dağılımlı günlük şoku (doğrusal olmayan GARCH özyinelemesi üzerinden) toplamak, -günlük ufukta bir 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, -günlük getirilere toplayın ve ampirik kuantili okuyun. Bu, hiçbir analitik çok-ufuklu kuantilin var olmadığı çarpık- 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 'ı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)?
ihlal dizisi, gün boyunca ihlal sayısı ve gözlenen oran olsun. Hedef oran .
Kupiec'in koşulsuz kapsama testi (1995), bir olabilirlik oranı aracılığıyla 'yi denetler:
Christoffersen'in bağımsızlık testi (1998), bugünkü bir ihlalin dünkü bir ihlalle öngörülmediğini denetler. , ihlal dizisinde durumundan durumuna geçişleri saysın, , ve olsun. O halde
Ikisi, doğru oranı ve bağımsızlığı aynı anda denetleyen koşullu kapsama testi '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- ya da EGARCH- geçer ya da yaklaşır. Bu karşıtlık, bu yazının tüm savının bir hipotez testi olarak ifadesidir. 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:
burada (işaretli) VaR kuantili ve 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 -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, ve ü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- çoğu zaman verinin destekleyebileceği en karmaşık modeldir. 200 güne çarpık- EGARCH kurmak kendinizi kandırmaktır.
- Çarpıklık terimi çoğu zaman maliyetini karşılamaz. Uygulamada Normal → 'ye geçmek büyük, güvenilir bir iyileşmedir (kalın kuyruklar gerçek ve güçlüdür). → çarpık-'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- 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 ö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 ya da çarpık- 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- 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. ~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 olarak girdiği için ve '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 ekler. Anlamlı bir kaldıraç etkisidir: kötü haber oynaklığı daha fazla yükseltir. Pozitiflik 'ı gerektirir; kalıcılık 'dır.
- EGARCH, 'yi modeller, dolayısıyla pozitiflik kısıtı yoktur ve durağanlık yalnızca 'dir. Asimetri, bir büyüklük teriminden ayrılmış işaretli bir terim aracılığıyla girer (bu uzlaşımda kaldıraç '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- inovasyonları (
dist='t'), kuyrukları bir serbestlik derecesi (kripto için tipik olarak 3-6) aracılığıyla düzeltir; Hansen'in çarpık-'si (dist='skewt'), daha ağır bir sol kuyruk için bir çarpıklık ekler. Normal → 'ye geçmek büyük, güvenilir bir kazançtır; → çarpık- çoğu zaman marjinaldir. - VaR ve ES, kurulan koşullu dağılımdan çıkar: ; kalın-kuyruklu kuantil, riski Gauss'a göre dürüstçe daha büyük yapar. ES (tutarlı, 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.
MarketMaker.cc Team
Kantitatif Araştırma & Strateji