← Kembali ke artikel
July 11, 2026
5 menit baca

GARCH Asimetris dan Berekor Tebal: EGARCH, GJR, dan Student-t

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

Pada Bagian 1 dari seri ini kita membangun GARCH(1,1) dari dasar: intuisi volatility clustering, rekursi conditional variance, estimasi maximum likelihood, peramalan, dan diagnostik residual standar dengan pustaka arch. Jika Anda belum membacanya, mulailah dari sana — tulisan ini mengasumsikan Anda sudah bisa mengestimasi dan menginterpretasikan GARCH(1,1) biasa serta tidak akan menurunkan ulang dasar-dasarnya.

GARCH(1,1) biasa adalah baseline yang baik sekaligus jawaban akhir yang buruk. Model ini memiliki dua cacat struktural yang murah untuk diabaikan dalam backtest tetapi mahal untuk diabaikan dengan modal nyata. Pertama, ia simetris: model bereaksi terhadap hari +5%+5\% persis seperti terhadap hari 5%-5\%, karena guncangan masuk ke dalam rekursi varians hanya melalui kuadratnya, εt12\varepsilon_{t-1}^2. Pengkuadratan membuang informasi tanda. Kedua, ia mengasumsikan inovasi Gaussian: bahkan setelah GARCH menyerap volatility clustering, residual terstandarisasi dari BTC dan ETH terlihat jelas berekor tebal, dan likelihood Gaussian secara sistematis menetapkan harga ekor terlalu rendah. VaR 99% dari GARCH(1,1)-Normal akan ditembus jauh lebih sering daripada 1% dari waktu.

Tulisan ini memperbaiki kedua cacat itu. Kita menambahkan asimetri dengan GJR-GARCH dan EGARCH, serta ekor tebal dengan inovasi Student-tt dan skewed-tt dari Hansen. Kemudian kita melakukan hal yang benar-benar membayar sewa: mengubah conditional distribution yang telah diestimasi menjadi ramalan Value-at-Risk dan Expected Shortfall satu langkah, dan mem-backtest ramalan itu secara jujur dengan uji Kupiec dan Christoffersen. Model volatilitas yang tidak pernah diuji risikonya hanyalah hiasan.

Leverage Effect, dan Mengapa Kripto Lebih Berantakan

Pada saham, asimetri ini punya nama dan cerita. Leverage effect (Black, 1976): ketika saham sebuah perusahaan turun, rasio utang terhadap ekuitasnya naik, ekuitas menjadi secara mekanis lebih berisiko, dan volatilitas meningkat. Berita buruk menaikkan volatilitas masa depan lebih besar daripada berita baik dengan ukuran yang sama. Secara empiris ini adalah salah satu stylized facts paling kokoh dalam literatur volatilitas saham.

Kripto tidak punya ekuitas dan tidak punya leverage neraca dalam pengertian korporat, namun asimetri mirip leverage-effect tetap muncul sebagian besar waktu — didorong oleh forced deleveraging, bukan akuntansi. Ketika BTC turun tajam, pinjaman over-collateralized terlikuidasi, posisi long perpetual futures dipaksa tutup, funding berbalik, dan kaskade tersebut memicu volatilitas. Jadi mekanismenya berbeda tetapi tandanya sering sepakat dengan saham: pergerakan turun melonjakkan volatilitas lebih besar.

Peringatan penting: kripto lebih berantakan, dan Anda sebaiknya memperlakukan asimetri sebagai pertanyaan empiris ketimbang sebuah hukum. Pergerakan naik yang keras — short squeeze, melt-up bertenaga leverage, gap persetujuan ETF — juga dapat melonjakkan volatilitas terealisasi. Bergantung pada aset dan jendela sampel, asimetri yang diestimasi bisa kuat, lemah, atau kadang bertanda "salah". Disiplin yang dituntut tulisan ini: estimasi model asimetris, lihat apakah parameter asimetri signifikan secara statistik dan mengarah ke arah yang diharapkan, dan hanya pertahankan parameter tambahan jika ia memang layak. Jangan berasumsi cerita saham langsung berlaku; ujilah.

Menguji Asimetri Sebelum Memodelkannya

Uraian di atas menyatakan "perlakukan asimetri sebagai empiris" — jadi sebelum mengestimasi model asimetris, jalankan uji formal yang murah untuk mengetahui apakah asimetri memang ada. Uji sign-bias Engle-Ng (1993) melakukan tepat hal ini. Estimasikan dahulu GARCH(1,1) simetris, ambil kuadrat residual terstandarisasinya zt2z_t^2, dan regresikan pada indikator tanda dan ukuran guncangan sebelumnya:

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

di mana St1=1{εt1<0}S_{t-1}^- = \mathbf{1}\{\varepsilon_{t-1} < 0\} dan St1+=1St1S_{t-1}^+ = 1 - S_{t-1}^-. Logikanya: jika model simetris sudah menangkap segalanya, tanda dan ukuran guncangan kemarin seharusnya tidak memprediksi kuadrat residual hari ini, sehingga a1=a2=a3=0a_1 = a_2 = a_3 = 0. Uji tt individual adalah uji sign-bias (a1a_1), negative-size-bias (a2a_2), dan positive-size-bias (a3a_3); uji FF gabungan atas ketiganya adalah uji omnibus. Nilai a1a_1 atau a2a_2 yang signifikan menyatakan bahwa guncangan negatif secara sistematis salah dihargai oleh model simetris — isyarat bagi Anda bahwa GJR atau EGARCH akan membantu.

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"])

Jika uji FF gabungan tidak signifikan, Anda memiliki izin empiris untuk tetap simetris dan menghemat dua parameter. Jika signifikan — hasil yang lazim untuk BTC/ETH — lanjutkan ke GJR/EGARCH dengan hati nurani yang bersih, karena Anda tahu Anda sedang memodelkan fitur nyata dan bukan mengejar noise. Inilah disiplin empiris yang dituntut pembuka tulisan ini: jangan berasumsi cerita leverage saham, ujilah.

GJR-GARCH: Asimetri lewat Suku Threshold

Model Glosten-Jagannathan-Runkle (1993) — kadang disebut TGARCH atau threshold GARCH — adalah pengeditan sekecil mungkin terhadap GARCH(1,1) yang memungkinkan berita buruk dan berita baik memiliki efek berbeda. Ingat kembali rekursi conditional variance simetris dari Bagian 1:

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

GJR menambahkan satu suku threshold: dosis varians ekstra yang aktif hanya setelah guncangan negatif.

σ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

di mana It1I_{t-1} adalah indikator

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}

Bacalah rekursi ini per kasus. Setelah guncangan positif (εt10\varepsilon_{t-1} \geq 0), indikator bernilai nol dan dampak kuadrat guncangan terhadap varians periode berikutnya hanyalah α\alpha. Setelah guncangan negatif, indikator bernilai satu dan dampaknya adalah α+γ\alpha + \gamma. Parameter γ\gamma adalah keseluruhan cerita asimetri dalam satu angka:

  • γ>0\gamma > 0: guncangan negatif menaikkan volatilitas lebih besar daripada guncangan positif dengan magnitudo sama. Inilah leverage effect, dan inilah yang Anda harapkan ditemukan pada BTC/ETH sebagian besar waktu.
  • γ=0\gamma = 0: model runtuh kembali menjadi GARCH(1,1) simetris. Uji likelihood-ratio atau uji tt atas γ\gamma karenanya merupakan uji langsung tentang apakah asimetri memang ada.
  • γ<0\gamma < 0: guncangan positif menaikkan volatilitas lebih besar — rezim melt-up kripto yang sesekali muncul. Jarang, tetapi jangan disingkirkan secara apriori.

Positivitas dan Stasioneritas

Karena σt2\sigma_t^2 tetap dibangun secara aditif, kita membutuhkan setiap suku tetap non-negatif. Kondisi positivitas yang cukup adalah

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

Perhatikan bahwa γ\gamma sendiri boleh negatif selama α+γ0\alpha + \gamma \geq 0, sehingga dampak pasca-berita-buruk tidak pernah menjadi negatif.

Untuk stasioneritas kovarians, asumsikan inovasi zt=εt/σtz_t = \varepsilon_t/\sigma_t terstandarisasi dengan distribusi yang simetris di sekitar nol, sehingga P(εt1<0)=1/2P(\varepsilon_{t-1} < 0) = 1/2 dan indikator menyumbang γ/2\gamma/2 secara rata-rata. Kondisi stasioneritas menjadi

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

Varians tak bersyarat (jangka panjang) kemudian adalah

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

Ini adalah analog GJR dari hasil Bagian 1 σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta), dengan suku tambahan 12γ\tfrac{1}{2}\gamma memperhitungkan kontribusi rata-rata dari paruh leverage. Jika distribusi inovasi Anda skewed (skew-tt Hansen, di bawah), angka 1/21/2 digantikan oleh probabilitas aktual bahwa zt<0z_t < 0, tetapi 1/21/2 adalah acuan standar yang dipakai untuk persistensi yang dilaporkan.

EGARCH: Memodelkan log-Varians, Tanpa Kendala Positivitas

GJR menjaga Anda tetap di dalam jaket pengekang positivitas varians: setiap kombinasi parameter harus diperiksa terhadap kendala ketaksamaan, yang mengganggu selama optimisasi dan lebih buruk lagi selama re-estimasi bergulir ketika sebuah jendela sesekali menyimpang ke wilayah yang tak layak. Exponential GARCH (1991) dari Nelson mengelak dari ini sepenuhnya dengan memodelkan logaritma dari conditional variance. Karena logσt2\log \sigma_t^2 bisa bernilai bilangan riil apa pun, σt2=exp(logσt2)\sigma_t^2 = \exp(\log \sigma_t^2) secara otomatis positif apa pun parameternya. Tidak ada kendala yang perlu dipaksakan.

Tulis rekursi dalam bentuk inovasi terstandarisasi zt1=εt1/σt1z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1}:

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}

Dua suku membawa guncangan, dan memisahkan keduanya adalah inti idenya:

  • Suku magnitudo α(zt1Ezt1)\alpha(|z_{t-1}| - \mathbb{E}|z_{t-1}|) merespons ukuran guncangan, dengan tanda dibuang. Mengurangkan Ezt1\mathbb{E}|z_{t-1}| memusatkannya sehingga guncangan bermagnitudo rata-rata tidak menyumbang apa pun. Untuk normal baku, Ez=2/π0.7979\mathbb{E}|z| = \sqrt{2/\pi} \approx 0.7979; untuk Student-tt terstandarisasi nilai absolut ekspektasinya lebih kecil dan bergantung pada ν\nu, tetapi arch menanganinya secara internal.
  • Suku tanda γzt1\gamma\, z_{t-1} adalah asimetrinya. Ia linear dalam inovasi bertanda, sehingga zt1z_{t-1} negatif mendorong logσt2\log\sigma_t^2 ke arah yang berlawanan dengan yang positif.

Konvensi tanda ini penting dan sering menjebak orang. Dalam parameterisasi ini, leverage effect (berita buruk menaikkan volatilitas) berpadanan dengan γ<0\gamma < 0: guncangan negatif zt1<0z_{t-1} < 0 kemudian membuat γzt1>0\gamma z_{t-1} > 0, menaikkan log-varians. Ini kebalikan tanda dari γ>0\gamma > 0 pada GJR. Selalu baca dokumentasi model itu sendiri untuk konvensinya ketimbang berasumsi; arch melaporkan EGARCH dengan tandanya sendiri, dan kita memeriksanya terhadap news impact curve di bawah alih-alih memercayai ingatan.

Karena segalanya aditif dalam logaritma, persistensi dari EGARCH(1,1) diatur oleh satu koefisien autoregresif β\beta pada logσt12\log\sigma_{t-1}^2; stasioneritas hanya membutuhkan β<1|\beta| < 1. Itu adalah kondisi yang jauh lebih bersih daripada ketaksamaan GJR, dan merupakan keunggulan praktis nyata ketika Anda mengestimasi ulang pada jendela bergulir.

Satu kehalusan yang layak disebut: respons EGARCH terhadap guncangan bersifat eksponensial dalam inovasi (Anda mengeksponenkan di akhir), sedangkan GJR bersifat kuadratik. Karena itu EGARCH bereaksi lebih hebat terhadap guncangan besar — sebuah fitur pada kripto, di mana peristiwa ekor adalah yang paling penting, tetapi juga alasan mengapa EGARCH sesekali bisa menghasilkan ramalan varians yang besarnya tak masuk akal setelah hari outlier. Tidak satu pun yang secara universal lebih baik; Anda memilih berdasarkan kecocokan out-of-sample dan uji backtest risiko, yang menjadi inti dari seluruh seri ini.

News Impact Curve

Cara terbersih untuk melihat perbedaan antara GARCH simetris, GJR, dan EGARCH adalah news impact curve (Engle dan Ng, 1993): tahan σt1\sigma_{t-1} tetap pada tingkat jangka panjangnya dan plot conditional variance periode berikutnya σt2\sigma_t^2 sebagai fungsi dari guncangan terakhir εt1\varepsilon_{t-1}. Ia menjawab "diberikan guncangan berukuran dan bertanda ini, seberapa besar model menaikkan volatilitas besok?"

  • GARCH simetris menghasilkan parabola simetris berpusat di nol. Guncangan 5%-5\% dan +5%+5\% mendarat pada ketinggian yang sama. Inilah persis cacat yang sedang kita perbaiki.
  • GJR menghasilkan parabola dengan tekukan di nol — lebih curam di sisi kiri (guncangan negatif) daripada di kanan ketika γ>0\gamma > 0. Kedua paruhnya memiliki kelengkungan α+γ\alpha+\gamma dan α\alpha secara berurutan.
  • EGARCH menghasilkan bentuk-V eksponensial yang asimetris: kedua lengannya memiliki kemiringan berbeda karena suku γz\gamma z, dan keseluruhannya melengkung ke atas lebih cepat daripada parabola karena eksponensiasi akhir.

Kita akan memplot ketiganya dari parameter yang telah diestimasi nanti, di bagian implementasi — inilah diagnostik tunggal paling berguna untuk mengomunikasikan apa yang dibeli oleh asimetri.

Ekor Tebal: Inovasi Student-t dan Skewed-t

Asimetri memperbaiki respons model terhadap tanda guncangan. Ia tidak berbuat apa pun terhadap distribusi guncangan itu sendiri. GARCH biasa mengasumsikan ztN(0,1)z_t \sim \mathcal{N}(0,1), dan asumsi itu hampir selalu salah untuk kripto. Bahkan setelah GARCH menghilangkan volatility clustering, residual terstandarisasi zt=εt/σtz_t = \varepsilon_t / \sigma_t mempertahankan excess kurtosis — mereka berekor tebal. Likelihood Gaussian, yang mencocokkan bahu distribusi, memberi bobot terlalu rendah pada seberapa sering hari terstandarisasi 44-, 55-, atau 66-sigma benar-benar terjadi.

Konsekuensinya bagi risiko bersifat langsung. VaR 99% Gaussian menggunakan kuantil Φ1(0.01)2.326\Phi^{-1}(0.01) \approx -2.326, sehingga ia memprediksi VaR0.992.326σt\text{VaR}_{0.99} \approx 2.326\,\sigma_t. Jika distribusi terstandarisasi yang sebenarnya adalah Student-tt dengan, katakanlah, ν=5\nu = 5 derajat kebebasan, kuantil 1% yang sebenarnya mendekati 3.36-3.36 — VaR Gaussian terlalu optimistis kira-kira 44%44\% pada tingkat keyakinan tersebut. Anda akan menembusnya jauh lebih sering daripada 1% dari waktu dan secara sistematis dikejutkan oleh hari-hari "mustahil". Ini bukan keanehan khas kripto; Bollerslev (1987) memperkenalkan tt-GARCH justru karena residual saham dan FX menunjukkan ekor tebal yang sama. Kripto sekadar versi yang lebih ekstrem dari masalah yang sama.

Student-t Terstandarisasi

Densitas Student-tt memiliki parameter derajat kebebasan ν>2\nu > 2 yang mengendalikan ketebalan ekor: ν\nu kecil berarti ekor tebal, dan ketika ν\nu \to \infty distribusi tt konvergen ke Gaussian. Persoalannya, distribusi tνt_\nu mentah memiliki varians ν/(ν2)1\nu/(\nu-2) \neq 1, sehingga kita harus menstandarisasikannya menjadi varians satuan sebelum memakainya sebagai inovasi — jika tidak, "σt\sigma_t" dalam rekursi GARCH sebenarnya bukanlah conditional standard deviation.

Inovasi Student-tt terstandarisasi dengan varians satuan memiliki densitas

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.

Perhatikan (ν2)(\nu-2) di dalamnya — itulah standarisasi, penskalaan ulang sehingga Var(z)=1\mathrm{Var}(z)=1. Kontribusi log-likelihood dari satu observasi, diberikan conditional variance GARCH σt2\sigma_t^2 dan zt=εt/σtz_t = \varepsilon_t/\sigma_t, adalah

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).

Suku 12logσt2-\tfrac{1}{2}\log\sigma_t^2 adalah Jacobian dari transformasi dari εt\varepsilon_t ke ztz_t — suku yang sama yang Anda lihat dalam likelihood GARCH Gaussian di Bagian 1. Hanya bentuknya yang berubah. Memaksimalkan tt\sum_t \ell_t secara bersama atas parameter GARCH dan ν\nu adalah persis apa yang dilakukan arch ketika Anda memberikan dist='t'.

Nilai ν\nu yang diestimasi sendiri bersifat informatif. Untuk return harian BTC/ETH Anda biasanya berada di kisaran ν36\nu \approx 3\text{–}6 — ekor tebal, tetapi dengan varians hingga (yang membutuhkan ν>2\nu > 2) dan biasanya kurtosis hingga (yang membutuhkan ν>4\nu > 4). Jika ν\nu estimasi Anda jatuh di bawah 4, sadarilah bahwa sample kurtosis secara teknis tak hingga dalam model dan sebagian estimator menjadi tidak stabil; ini adalah sinyal untuk mencermati outlier dan kualitas data.

Skewed-t Hansen

Student-tt berekor tebal tetapi masih simetris — ekor kiri dan kanan sama tebalnya. Residual return kripto sering kali juga skewed: ekor kiri (crash) lebih tebal daripada ekor kanan. Skewed-tt Hansen (1994) menggeneralisasikan tt terstandarisasi dengan parameter skewness λ(1,1)\lambda \in (-1, 1) di samping ν\nu:

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}

di mana konstanta a=4λcν2ν1a = 4\lambda c\,\frac{\nu-2}{\nu-1}, b2=1+3λ2a2b^2 = 1 + 3\lambda^2 - a^2, dan c=Γ(ν+12)π(ν2)Γ(ν2)c = \frac{\Gamma(\frac{\nu+1}{2})}{\sqrt{\pi(\nu-2)}\,\Gamma(\frac{\nu}{2})} dipilih sedemikian sehingga zz memiliki mean nol dan varians satuan untuk setiap (ν,λ)(\nu,\lambda) yang valid. Distribusi terbelah pada z=a/bz = -a/b, memakai penskalaan berbeda pada tiap potongan untuk membelokkan lebih banyak massa ke salah satu ekor.

Interpretasi: λ<0\lambda < 0 memberikan distribusi skewed ke kiri (sisi bawah lebih tebal), yang merupakan temuan lazim untuk kripto dan yang Anda harapkan berpasangan dengan leverage effect. λ=0\lambda = 0 memulihkan Student-tt simetris, sehingga uji λ=0\lambda = 0 memberi tahu Anda apakah suku skew memang berguna. Dalam arch ini adalah dist='skewt', yang mengestimasi baik ν\nu maupun λ\lambda. Imbalannya adalah VaR yang kuantil ekor-kirinya secara jujur lebih tebal daripada kuantil ekor-kanannya — persis yang Anda inginkan ketika kerugian yang berusaha Anda selamati bersifat asimetris. Ini terhubung langsung dengan asimetri kerugian versus keuntungan dalam hasil posisi: penurunan sebesar x%x\% membutuhkan lebih dari x%x\% untuk pulih, sehingga salah memodelkan ekor kiri lebih mahal daripada salah memodelkan ekor kanan.

Implementasi Python

Kini kita mengestimasi semua ini dengan pustaka arch. Penyiapannya mencerminkan Bagian 1: ambil return harian, skalakan dengan 100 untuk pengkondisian numerik (optimizer GARCH berperilaku buruk ketika return berorde O(0.01)O(0.01)), dan estimasikan dengan mean konstan. Jika Anda menginginkan data intraday atau model mean berbeda, mesinnya identik.

Penyiapan dan Data

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 diperdagangkan 24/7, jadi kita menyetahunkan dengan 365, bukan 252 — sumber kebingungan kecil tetapi berulang ketika Anda membandingkan Sharpe atau volatilitas kripto terhadap angka dari desk saham.

Mengestimasi Empat Model

Pola dalam arch: vol='Garch' dengan p=1, q=1 adalah GARCH simetris; menambahkan o=1 mengaktifkan suku threshold GJR; vol='EGARCH' beralih ke model log-varians. Distribusi inovasi diatur dengan dist: '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

Untuk vol='EGARCH', argumen o mengendalikan suku asimetris (γz\gamma z) dan p/q mengendalikan suku magnitudo dan lag; o=1, p=1, q=1 adalah EGARCH(1,1) standar. Satu jebakan: nama parameter EGARCH dalam arch adalah huruf yang sama tetapi konvensi tanda pada suku asimetri adalah konvensi Nelson, sehingga estimasi negatif adalah leverage effect. Kita memverifikasi ini dari news impact curve, bukan dari ingatan.

Membaca Hasil Estimasi GJR

Tabel parameter GJR-tt kira-kira tampak seperti ini (nilai ilustratif, bukan eksperimen yang dilaporkan — estimasikan ulang pada data Anda sendiri):

                  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

Cara membacanya:

  • gamma[1] = 0.091 dengan statistik tt di atas 3 adalah leverage effect yang signifikan secara statistik. Setelah guncangan negatif, dampak kuadrat guncangan adalah α+γ=0.062+0.091=0.153\alpha + \gamma = 0.062 + 0.091 = 0.153; setelah guncangan positif hanya α=0.062\alpha = 0.062. Berita buruk menggerakkan volatilitas model ini kira-kira 2.5×2.5\times lebih besar daripada berita baik dengan ukuran sama.
  • nu = 4.3 mengonfirmasi ekor tebal — jauh dari Gaussian (ν\nu \to \infty), dan cukup rendah sehingga momen keempat nyaris hingga. VaR Gaussian pada deret ini akan sangat optimistis.
  • Persistensi adalah α+β+12γ=0.062+0.885+0.04550.993\alpha + \beta + \tfrac{1}{2}\gamma = 0.062 + 0.885 + 0.0455 \approx 0.993 — sangat tinggi, seperti biasa untuk kripto harian: guncangan meluruh perlahan dan volatilitas sangat berkelompok.

Baris tunggal terpenting untuk diperiksa adalah baris γ\gamma. Jika nilai pp-nya besar, suku asimetris tidak layak pada aset dan jendela ini, dan Anda sebaiknya lebih memilih model simetris yang lebih sederhana. Ini adalah disiplin pemilihan model, bukan hiasan — lebih lanjut di bawah.

Membandingkan Model dengan Kriteria Informasi

Log-likelihood selalu membaik ketika Anda menambahkan parameter, jadi Anda tidak bisa memilih berdasarkan log-likelihood saja. Gunakan AIC/BIC, yang memberi penalti terhadap jumlah parameter (BIC lebih agresif):

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))

Aturan praktis interpretasi: perbaikan BIC lebih dari ~6 dibanding baseline adalah bukti kuat bahwa struktur tambahan itu nyata; selisih 1–2 adalah noise. Jika GJR-t mengalahkan GARCH-N sebesar 30+ poin BIC tetapi GJR-skewt mengalahkan GJR-t hanya sebesar 1, pertahankan tt dan buang skew — parameter skew tidak membayar dirinya sendiri pada data ini. Jangan membaca AIC/BIC sebagai pengganti validasi out-of-sample; keduanya memberi imbalan pada kecocokan in-sample yang disesuaikan dengan kompleksitas, yang perlu tetapi tidak cukup. Uji sesungguhnya adalah backtest VaR dan, pada akhirnya, evaluasi walk-forward.

Memplot News Impact Curve

Inilah plot imbalan — ia membuat asimetri terlihat dan memverifikasi konvensi tanda EGARCH.

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()

Saat Anda menjalankan ini, kurva GARCH-N simetris adalah parabola bersih berpusat di nol — guncangan 6%-6\% dan +6%+6\% memberi varians identik. GJR-t adalah parabola dengan tekukan di titik asal, lebih tinggi pada lengan kiri. EGARCH-t adalah V eksponensial, dan jika lengan kirinya berada di atas lengan kanannya berarti Anda telah mengonfirmasi leverage effect dan konvensi tanda dalam sekali pandang. Jika lengan kiri EGARCH berada di bawah lengan kanan, entah γ\gamma terestimasi positif (rezim volatilitas-naik) atau tanda Anda terbalik — plot itu memberi tahu Anda yang mana tanpa perlu menebak.

Perbandingan Berdampingan Keempat Model

Sebelum kita beralih ke risiko, ada gunanya menempatkan keempat model bersebelahan. Tiap baris adalah keputusan desain, dan kolom-kolom menunjukkan apa yang keputusan itu korbankan dan beli.

Properti GARCH-N GJR-t EGARCH-t GJR-skewt
Asimetri (tanda guncangan) tidak ada threshold γIε2\gamma I\varepsilon^2 bertanda γz\gamma z threshold γIε2\gamma I\varepsilon^2
Bentuk ekor inovasi Gaussian Student-tt Student-tt skewed-tt
Skew dalam inovasi tidak tidak tidak ya (λ\lambda)
Kendala positivitas ya ya (α+γ0\alpha+\gamma\ge0) tidak ada (bentuk log) ya
Kondisi stasioneritas α+β<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
Parameter ekstra vs baseline 0 γ,ν\gamma,\nu γ,ν\gamma,\nu γ,ν,λ\gamma,\nu,\lambda
Vonis kripto tipikal gagal backtest VaR kuat, kokoh kuat, kokoh marjinal atas GJR-t

Pola yang perlu diresapi: lompatan dari kolom 1 ke kolom 2 — menambahkan asimetri dan ekor tebal sekaligus — adalah tempat hampir seluruh perbaikan kalibrasi risiko berada. Penyempurnaan berikutnya (bentuk fungsional EGARCH, suku skew) memang nyata tetapi berorde kedua, dan pada banyak deret kripto keduanya berada di dalam noise. Belanjakan anggaran pemodelan Anda pada lompatan pertama dan bersikaplah skeptis terhadap sisanya.

Penerapan Risiko: VaR dan Expected Shortfall

Mengestimasi model volatilitas yang lebih canggih hanya berharga jika ia memperbaiki sebuah keputusan. Keputusan terbersih untuk diperbaiki adalah ramalan tail-risk satu langkah: seburuk apa besok bisa jadi? Kita menghasilkan Value-at-Risk dan Expected Shortfall satu hari ke depan (alias Conditional VaR, yang dipakai pipeline portofolio HRP/CVaR sebagai fungsi objektifnya) langsung dari ramalan GARCH-tt/skew-tt yang telah diestimasi.

Dari Conditional Distribution ke VaR

Mesin GARCH memberikan ramalan satu langkah dari conditional mean μt+1\mu_{t+1} dan conditional standard deviation σt+1\sigma_{t+1}. Return dimodelkan sebagai rt+1=μt+1+σt+1zt+1r_{t+1} = \mu_{t+1} + \sigma_{t+1} z_{t+1} dengan zt+1z_{t+1} ditarik dari distribusi terstandarisasi yang telah diestimasi (Gaussian, tt, atau skew-tt). Jadi kuantil-α\alpha dari return hanyalah transformasi afin dari kuantil-α\alpha distribusi terstandarisasi:

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)

di mana Fz1F_z^{-1} adalah kuantil (invers CDF) dari inovasi terstandarisasi dan tanda minus di depan mengikuti konvensi bahwa VaR adalah angka kerugian positif. Untuk VaR 99%, α=0.99\alpha = 0.99 dan Anda memasukkan Fz1(0.01)F_z^{-1}(0.01). Seluruh manfaat tt/skew-tt tampak di sini: Fz1(0.01)F_z^{-1}(0.01) lebih negatif daripada 2.326-2.326 Gaussian, sehingga VaR-nya secara jujur lebih besar.

Expected Shortfall

VaR memberi tahu Anda ambangnya; ia tidak berkata apa pun tentang seberapa buruk penembusan itu ketika terjadi. Expected Shortfall — rata-rata kerugian dengan syarat melampaui VaR — melakukannya, dan ia koheren (subaditif), itulah sebabnya ia menjadi ukuran risiko di balik optimisasi CVaR dan mengapa Basel beralih kepadanya. Untuk model location-scale,

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).

Suku conditional-tail-expectation E[zzq]\mathbb{E}[z \mid z \le q] memiliki bentuk tertutup untuk distribusi standar. Untuk Gaussian, dengan q=Φ1(1α)q = \Phi^{-1}(1-\alpha),

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

di mana ϕ\phi adalah pdf normal baku. Untuk Student-tt terstandarisasi dengan ν\nu derajat kebebasan dan q=tν1(1α)q = t_\nu^{-1}(1-\alpha) (pada skala terstandarisasi), ekspektasi ekornya adalah

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},

di mana gνg_\nu adalah pdf tt terstandarisasi. Expected Shortfall dari tt melampaui yang Gaussian lebih besar daripada selisih pada VaR-nya, karena ekor tt bukan sekadar lebih jauh — ia lebih tebal, sehingga rata-rata kerugian di luar ambang menjadi besar secara tidak proporsional. Selisih ekstra itu adalah angka yang disembunyikan model Gaussian dari Anda.

Menghitung VaR dan ES dari Model arch yang Telah Diestimasi

Distribusi arch mengekspos metode ppf (kuantil), sehingga kita bisa memperoleh kuantil terstandarisasi secara langsung dan menghindari penurunan ulang apa pun. Untuk ES kita mengintegralkan secara numerik, yang kokoh dan bekerja seragam di seluruh normal/t/skewt.

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}%")

Kolom z_q adalah keseluruhan cerita dalam satu angka. Model Gaussian memakai zq2.33z_q \approx -2.33; tt dengan ν4.3\nu \approx 4.3 memakai sesuatu di dekat 3.3-3.3; skew-tt mendorong kuantil kiri lebih jauh lagi sambil menarik masuk yang kanan. Dengan σt+1\sigma_{t+1} yang sama, VaR jauh lebih besar. Jika Anda selama ini menjalankan VaR Gaussian pada kripto, inilah selisih yang diam-diam Anda serap.

Satu Langkah vs Banyak Langkah: Sebuah Peringatan

Semua di atas adalah ramalan satu hari ke depan, dan di situlah VaR GARCH paling bersih. Dua hal memperumit horizon yang lebih panjang dan Anda perlu mengetahuinya sebelum mengekstrapolasi.

Pertama, ramalan varians mean-revert. Conditional variance hh-langkah ke depan dari GARCH yang stasioner konvergen menuju tingkat tak bersyarat σˉ2\bar\sigma^2 seiring hh membesar, dan varians kumulatif hh-hari adalah jumlah dari ramalan per langkah — bukan h×σt+12h\times\sigma_{t+1}^2 kecuali volatilitas berada pada mean jangka panjangnya. Penskalaan naif "akar-kuadrat-waktu" VaR(h)=hVaR(1)\text{VaR}(h) = \sqrt{h}\,\text{VaR}(1) mengabaikan mean reversion ini dan keliru justru setelah guncangan, ketika Anda paling membutuhkan angka itu. Gunakan jalur varians multi-langkah model itu sendiri.

Kedua, distribusi return multi-hari tidak berbentuk sama dengan inovasi satu-hari. Menjumlahkan beberapa guncangan harian berdistribusi tt (melalui rekursi GARCH yang nonlinear) tidak menghasilkan distribusi tt pada horizon hh-hari; tidak ada bentuk tertutup yang rapi. Untuk VaR multi-hari, rute yang jujur adalah simulasi: tarik jalur inovasi dari distribusi terstandarisasi yang telah diestimasi, jalankan melalui rekursi GARCH untuk memperoleh jalur return tersimulasi, agregasikan ke return hh-hari, dan baca kuantil empirisnya. Itu juga secara alami menangani kasus skew-tt, di mana tidak ada kuantil multi-horizon analitik sama sekali. Rumus analitik satu-langkah dalam tulisan ini bersifat eksak; perlakukan setiap jalan pintas multi-langkah sebagai aproksimasi yang harus divalidasi.

Mem-backtest VaR: Kupiec dan Christoffersen

Ramalan VaR adalah klaim probabilistik: "kerugian akan melampaui ambang ini hanya pada (1α)(1-\alpha) dari hari." Anda mengujinya dengan menghitung pelanggaran (hari-hari ketika kerugian terealisasi melampaui VaR yang diramalkan) sepanjang evaluasi walk-forward dan memeriksa dua hal. Pertama, apakah laju pelanggarannya benar? Kedua, apakah pelanggaran itu independen, atau berkelompok (yang berarti model gagal justru ketika hal itu penting, selama lonjakan volatilitas)?

Misalkan It=1{losst>VaRt}I_t = \mathbf{1}\{\text{loss}_t > \text{VaR}_t\} adalah barisan pelanggaran, N=ItN = \sum I_t jumlah pelanggaran sepanjang TT hari, dan π^=N/T\hat{\pi} = N/T laju teramati. Laju target p=1αp = 1-\alpha.

Uji unconditional coverage Kupiec (1995) memeriksa π^p\hat\pi \approx p lewat likelihood ratio:

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.

Uji independensi Christoffersen (1998) memeriksa bahwa pelanggaran hari ini tidak diprediksi oleh pelanggaran kemarin. Misalkan nijn_{ij} menghitung transisi dari keadaan ii ke keadaan jj dalam barisan pelanggaran, π01=n01/(n00+n01)\pi_{01} = n_{01}/(n_{00}+n_{01}), π11=n11/(n10+n11)\pi_{11} = n_{11}/(n_{10}+n_{11}), dan π=(n01+n11)/T\pi = (n_{01}+n_{11})/T. Maka

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.

Keduanya bergabung menjadi uji conditional coverage LRcc=LRuc+LRindχ22LR_{cc} = LR_{uc} + LR_{ind} \sim \chi^2_2, yang secara bersamaan memeriksa laju yang benar dan independensi. Sebuah model bisa lolos Kupiec (jumlah pelanggaran benar) namun gagal Christoffersen (semuanya menumpuk dalam satu pekan crash) — itulah mode kegagalan yang paling ingin Anda tangkap, karena pelanggaran berkelompok adalah yang meledakkan sebuah akun.

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,
    }

Untuk menghasilkan input losses/var secara jujur, Anda mengestimasi ulang (atau setidaknya meramalkan ulang) pada jendela mengembang atau bergulir dan mencatat VaR satu langkah ke depan untuk setiap hari out-of-sample, lalu membandingkannya dengan kerugian terealisasi untuk hari itu. Jangan pernah mem-backtest VaR secara in-sample — model yang diestimasi pada crash yang sama dengan yang diminta untuk diprediksi akan tampak jauh lebih baik daripada kenyataannya. Ini adalah disiplin yang sama dengan paritas backtest-live: evaluasi hanya boleh memakai informasi yang tersedia pada saat keputusan diambil.

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))

Cara membacanya: VaR 99% yang terkalibrasi baik menunjukkan laju teramati mendekati 1%, Kupiec yang tidak signifikan (p_uc besar), dan Christoffersen yang tidak signifikan (p_ind besar) — tanpa pengelompokan. Dalam praktik, hasil jujur pada kripto adalah bahwa GARCH-Normal gagal Kupiec (terlalu banyak pelanggaran, p_uc sangat kecil) sementara GJR-tt atau EGARCH-tt lolos atau nyaris lolos. Kontras itu adalah keseluruhan argumen tulisan ini yang dituangkan sebagai uji hipotesis. Jika bahkan model tt menunjukkan pelanggaran berkelompok (p_ind kecil), dinamika volatilitas Anda masih salah spesifikasi — sering kali pertanda Anda membutuhkan memori yang lebih panjang (component/FIGARCH) atau lapisan rezim, yang terhubung dengan deteksi rezim dengan HMM.

Memeringkat Model dengan Tail Loss, Bukan Sekadar Lolos/Gagal

Kupiec dan Christoffersen memberi Anda vonis biner — model itu ditolak atau tidak. Itu perlu tetapi kasar: dua model bisa sama-sama "lolos" sementara salah satunya jauh lebih tajam. Untuk memeringkat ramalan VaR yang bersaing, nilailah mereka dengan fungsi kerugian yang konsisten secara ketat untuk kuantil, yaitu pinball (quantile) loss:

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,

di mana qq adalah kuantil VaR (bertanda) dan rr return terealisasi. Dirata-ratakan sepanjang hari-hari out-of-sample, pinball loss rata-rata yang lebih rendah berarti kuantil yang lebih terkalibrasi dan lebih tajam; karena kerugian itu konsisten untuk kuantil-τ\tau, meminimalkannya tidak memberi imbalan pada model karena menjadi lebar secara malas. Untuk membandingkan dua model secara formal, umpankan selisih kerugian per-harinya ke uji Diebold-Mariano.

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))

Khusus untuk Expected Shortfall, perhatikan bahwa ES tidak elicitable secara mandiri (tidak ada fungsi kerugian yang minimizernya adalah ES saja), yang merupakan kerumitan teoretis sejati: Anda mengevaluasi ES secara bersama dengan VaR menggunakan aturan penilaian Fissler-Ziggel, atau Anda kembali ke praktik yang lebih sederhana berupa memeriksa bahwa magnitudo pelanggaran rata-rata cocok dengan ES yang diprediksi model. Pemeriksaan ES yang kasar tetapi berguna: di antara hari-hari pelanggaran VaR, bandingkan rata-rata kerugian terealisasi dengan rata-rata ES yang diramalkan pada hari-hari itu — keduanya seharusnya berdekatan.

Pembingkaian regulatornya adalah pendekatan traffic-light Basel: sepanjang 250 hari perdagangan, 0-4 pelanggaran VaR 99% adalah "hijau" (dapat diterima), 5-9 adalah "kuning" (perlu diteliti), 10+ adalah "merah" (model ditolak dan pengganda modal naik). Ini adalah sepupu Kupiec yang lebih kasar, tetapi inilah bahasa yang benar-benar dipakai komite risiko, dan layak dilaporkan bersama statistik LR.

Pertimbangan Praktis

Ketika Parameter Ekstra Tidak Terbayar

Default yang jujur adalah skeptisisme terhadap kompleksitas. Setiap parameter yang Anda tambahkan adalah kenop yang bisa di-overfit optimizer, dan GARCH asimetris berekor tebal punya beberapa. Panduan konkret:

  • Sampel tidak likuid atau pendek. Dengan beberapa ratus observasi harian, standard error pada γ\gamma dan λ\lambda akan besar, dan Anda akan "mendeteksi" asimetri yang sebenarnya noise pengambilan sampel. Pada altcoin baru atau tipis, GARCH-tt simetris sering kali adalah model paling kompleks yang mampu didukung data. Mengestimasi skew-tt EGARCH pada 200 hari adalah menipu diri sendiri.
  • Suku skew sering tidak menutupi biayanya. Dalam praktik, berpindah dari Normal → tt adalah perbaikan besar dan andal (ekor tebal itu nyata dan kuat). Berpindah dari tt → skew-tt sering kali marjinal — perolehan BIC sebesar 1 atau 2, kadang negatif. Tambahkan skew hanya ketika data jelas memintanya.
  • EGARCH vs GJR biasanya seri pada data harian. Keduanya menyandikan cerita kualitatif yang sama dengan bentuk fungsional berbeda. Pilih berdasarkan backtest VaR out-of-sample, bukan berdasarkan mana yang punya log-likelihood in-sample lebih bagus.
  • Frekuensi lebih tinggi menggeser jawabannya. Pada bar jam-jaman atau menit, musiman intraday dan mikrostruktur mendominasi, dan GARCH bergaya harian biasa salah spesifikasi terlepas dari asimetri. Masalah berbeda, perkakas berbeda.

Ini adalah pelajaran yang sama dengan evaluasi jujur tanpa edge yang kokoh: model yang lebih kompleks yang tidak bertahan dalam pengujian out-of-sample lebih buruk daripada model sederhana yang digantikannya, karena ia membawa ilusi ketepatan. Laporkan hasil negatif — "skew tidak membantu pada ETH" — sebagai temuan nyata, dan gunakan walk-forward optimization sebagai penengah, bukan AIC in-sample.

Inilah Marginal yang Dibangun Semua Orang di Atasnya

Model-model di sini bukanlah titik akhir; mereka adalah blok bangunan univariat untuk mesin joint-risk. Tulisan model copula untuk joint crypto risk memakai persis EGARCH/GJR-tt sebagai marginal GARCH-EVT sebelum mengestimasi vine copula — Anda mengestimasi GARCH asimetris berekor tebal per aset, mengekstrak residual terstandarisasi, dan baru setelah itu memodelkan dependensi antar-aset. Jika marginal Anda adalah GARCH Gaussian simetris, copula mewarisi galat ekornya sebaik apa pun model dependensinya. Marginal sampah, joint VaR sampah.

Untuk masalah volatilitas multivariat — korelasi yang berubah terhadap waktu ketimbang varians per-aset — lihat Bagian 3, DCC-GARCH, yang melapiskan model dynamic-correlation di atas estimasi univariat ini. Dan untuk mengubah ramalan volatilitas menjadi position sizing dan backtest perdagangan, Bagian 4 tentang volatility targeting memakai ramalan σt+1\sigma_{t+1} dari model-model persis ini untuk menskalakan eksposur berbanding terbalik dengan risiko yang diprediksi.

Alternatif Bebas-Distribusi

Segala hal di bagian risiko bertumpu pada asumsi parametrik: bahwa residual terstandarisasi mengikuti tt atau skew-tt. Asumsi itu bisa diuji dan biasanya masuk akal, tetapi bisa gagal. Jika Anda lebih suka tidak berkomitmen pada bentuk ekor sama sekali, conformal prediction memberikan prediction interval bebas-distribusi dengan jaminan cakupan finite-sample — filosofi yang benar-benar berbeda yang tidak membuat klaim apa pun tentang distribusi inovasi. Kedua pendekatan itu saling melengkapi: GARCH-tt parametrik memberi Anda densitas kondisional penuh (dan karenanya ES, yang tidak langsung disediakan conformal interval), sementara conformal memberi Anda cakupan yang berlaku bahkan ketika densitas Anda salah. Di produksi, memakai keduanya sebagai pemeriksaan silang adalah asuransi murah.

Higiene Numerik dan Alur Kerja

  • Skalakan return dengan 100. Optimizer GARCH konvergen jauh lebih andal pada return persen ketimbang pada return fraksional mentah. Ingatlah untuk membatalkan skala VaR/ES jika Anda melapor dalam satuan fraksional.
  • Perhatikan persistensi. Jika α+β+12γ\alpha + \beta + \tfrac12\gamma terestimasi di atas ~0.999, model nyaris terintegrasi (mirip IGARCH); ramalan mean-revert sangat lambat dan ramalan varians horizon panjang menjadi tidak andal. Belum tentu salah, tetapi tandai itu.
  • Kegagalan konvergensi pada jendela bergulir. Bentuk log EGARCH menghindari kendala positivitas tetapi masih bisa gagal konvergen pada jendela yang patologis. Bungkus fit() dalam try/except dan mundur ke parameter jendela sebelumnya ketimbang membuat backtest live macet.
  • Model mean. Kita memakai mean konstan sepanjang tulisan. Untuk kebanyakan kripto harian, conditional mean mendekati nol dan tenggelam oleh volatilitas; jangan menghabiskan kompleksitas model untuk mencoba meramalkannya kecuali Anda punya alasan nyata.

Ringkasan

  • GARCH(1,1) biasa memiliki dua cacat struktural: ia simetris (bereaksi terhadap +x%+x\% dan x%-x\% secara identik karena guncangan masuk sebagai ε2\varepsilon^2) dan ia mengasumsikan inovasi Gaussian (menetapkan harga terlalu rendah pada ekor tebal kripto). Keduanya menelan uang nyata melalui VaR yang optimistis.
  • GJR-GARCH menambahkan suku threshold γI(εt1<0)εt12\gamma\,I(\varepsilon_{t-1}<0)\,\varepsilon_{t-1}^2. Nilai γ>0\gamma > 0 yang signifikan adalah leverage effect: berita buruk menaikkan volatilitas lebih besar. Positivitas membutuhkan α+γ0\alpha+\gamma\ge0; persistensi adalah α+β+12γ\alpha+\beta+\tfrac12\gamma.
  • EGARCH memodelkan logσt2\log\sigma_t^2, sehingga tanpa kendala positivitas dan stasioneritas hanya β<1|\beta|<1. Asimetri masuk melalui suku bertanda γzt1\gamma z_{t-1} (leverage adalah γ<0\gamma<0 dalam konvensi ini) yang dipisahkan dari suku magnitudo zt1|z_{t-1}|.
  • News impact curve — varians periode berikutnya vs guncangan terakhir — membuat asimetri terlihat dan memverifikasi konvensi tanda EGARCH dalam sekejap.
  • Inovasi Student-tt (dist='t') memperbaiki ekor lewat derajat kebebasan ν\nu (tipikal 3–6 untuk kripto); skew-tt Hansen (dist='skewt') menambahkan skewness λ\lambda untuk ekor kiri yang lebih tebal. Berpindah dari Normal → tt adalah perolehan besar dan andal; tt → skew-tt sering kali marjinal.
  • VaR dan ES mengikuti dari conditional distribution yang telah diestimasi: VaRα=(μt+1+σt+1Fz1(1α))\text{VaR}_\alpha = -(\mu_{t+1} + \sigma_{t+1}F_z^{-1}(1-\alpha)), dengan kuantil berekor tebal membuat risiko secara jujur lebih besar daripada Gaussian. ES (koheren, \approx CVaR) menangkap rata-rata kerugian di luar VaR.
  • Backtest dengan Kupiec dan Christoffersen. Kupiec memeriksa laju pelanggaran; Christoffersen memeriksa bahwa pelanggaran tidak berkelompok. Sebuah model bisa lolos satu dan gagal yang lain — pelanggaran berkelompok adalah mode kegagalan yang berbahaya. Backtest secara ketat out-of-sample.
  • Disiplin di atas kompleksitas. Tambahkan asimetri/skew hanya ketika ia bertahan terhadap BIC dan backtest VaR out-of-sample. Pada deret yang pendek atau tidak likuid, model yang lebih sederhana biasanya menang.

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.
Penafian: Informasi yang disediakan dalam artikel ini hanya untuk tujuan edukasi dan informasi serta tidak merupakan nasihat keuangan, investasi, atau trading. Trading mata uang kripto mengandung risiko kerugian yang signifikan.

MarketMaker.cc Team

Riset & Strategi Kuantitatif

Diskusikan di Telegram
Newsletter

Selangkah Lebih Maju dari Pasar

Berlangganan newsletter kami untuk wawasan AI trading eksklusif, analisis pasar, dan pembaruan platform.

Kami menghormati privasi Anda. Berhenti berlangganan kapan saja.