← Kembali ke artikel
July 13, 2026
5 menit baca

Volatility Targeting dan Trading dengan Prakiraan GARCH

#volatility
#GARCH
#volatility-targeting
#backtesting
#risk
#crypto
#algorithmic-trading

Tiga bagian pertama dari seri ini mengajarkan Anda cara memprakirakan volatilitas. Kami membangun GARCH(1,1) univariat di Bagian 1, menambahkan leverage dan fat tail dengan inovasi GJR dan Student-t di Bagian 2, dan memodelkan seluruh matriks kovarians sepanjang waktu dengan DCC-GARCH di Bagian 3. Di akhir masing-masing, kami mencetak sebuah angka: volatilitas yang diharapkan untuk esok hari. Dan kemudian, jujur saja, kami berhenti — seolah menghasilkan prakiraan itu sendiri adalah tujuannya.

Bukan. Prakiraan volatilitas bukanlah P&L. Tidak ada yang pernah dibayar karena skor QLIKE yang rendah. Sebuah prakiraan baru bernilai tepat pada saat ia mengubah keputusan yang seharusnya Anda ambil secara berbeda — berapa banyak yang dibeli, kapan memangkas, berapa banyak modal yang dialokasikan. Jika prakiraan Anda tidak menggerakkan posisi, akurasi statistiknya hanyalah hobi pribadi.

Bagian terakhir ini adalah tentang menutup putaran itu. Kami mengambil prakiraan dari Bagian 1-3 dan menempatkannya untuk bekerja dalam keputusan yang sebersih mungkin: volatility targeting — menentukan ukuran posisi sehingga volatilitas realized portofolio mencapai target yang konstan. Kemudian kami melakukan hal yang lebih dipedulikan blog ini daripada model tunggal mana pun: kami mengevaluasi secara jujur. Kami membenchmark GARCH terhadap baseline yang bodoh-tapi-kuat (rolling realized vol, EWMA), kami menggunakan fungsi loss yang robust terhadap fakta bahwa kita tidak akan pernah bisa mengamati volatilitas sejati, kami menjalankan backtest walk-forward dengan biaya dan tanpa look-ahead, dan kami menyatakan dengan jelas apa yang diberikan dan tidak diberikan oleh vol targeting. Spoiler: ia memperbaiki return yang disesuaikan risiko dan menjinakkan drawdown jauh lebih andal daripada menghasilkan alpha.

Mengapa Volatility Targeting Adalah Uji yang Tepat

Ada cara yang lebih rumit untuk menggunakan prakiraan volatilitas — penetapan harga opsi, batas VaR, hedging dinamis — tetapi volatility targeting adalah satu-satunya yang mengisolasi nilai prakiraan dengan kontaminasi paling sedikit dari taruhan lainnya. Idenya adalah satu persamaan.

Pegang aset berisiko dengan arah yang tersirat dari sinyal (untuk sekarang, hanya "long"). Alih-alih posisi tetap, skalakan eksposur secara terbalik terhadap volatilitas prakiraan:

wt=σtargetσ^t(then capped)w_t = \frac{\sigma_{\text{target}}}{\hat{\sigma}_{t}} \quad \text{(then capped)}

di mana σ^t\hat{\sigma}_t adalah prakiraan Anda tentang volatilitas periode berikutnya (dibuat hanya menggunakan data hingga tt), dan σtarget\sigma_{\text{target}} adalah volatilitas tahunan yang Anda inginkan untuk strategi berjalan — katakanlah 15% atau 20%. Ketika model memprakirakan pasar yang tenang, Anda meningkatkan leverage menuju (atau melampaui) 1.0; ketika ia memprakirakan badai, Anda menyusut. Volatilitas realized dari posisi yang diskalakan adalah, pada orde pertama,

Vol(wtrt+1)=wtσt+1=σtargetσ^tσt+1σtarget\text{Vol}(w_t r_{t+1}) = w_t \, \sigma_{t+1} = \frac{\sigma_{\text{target}}}{\hat\sigma_t}\, \sigma_{t+1} \approx \sigma_{\text{target}}

kapan pun σ^tσt+1\hat\sigma_t \approx \sigma_{t+1}. Jadi seluruh kualitas latihan ini bertumpu pada satu hal: seberapa dekat prakiraan Anda σ^t\hat\sigma_t dengan volatilitas aktual periode berikutnya σt+1\sigma_{t+1}. Prakiraan yang lebih baik menghasilkan profil volatilitas realized yang lebih datar dan — seperti yang akan kita lihat — rasio Sharpe yang lebih baik. Itulah mengapa ini adalah uji yang tepat. Prakiraan bukanlah hiasan; ia adalah penyebut.

Mengapa ini menaikkan Sharpe dan mengendalikan drawdown

Dua fakta empiris melakukan pekerjaannya di sini.

Volatilitas jauh lebih dapat diprakirakan daripada return. Arah return BTC esok hari mendekati lemparan koin pada frekuensi harian; besarnya tidak. Volatilitas mengelompok — pergerakan besar mengikuti pergerakan besar — yang merupakan seluruh alasan GARCH ada (Bagian 1 menurunkan struktur AR(1)-in-variance yang mengkodekan ini). R2R^2 sebesar 0.4-0.6 untuk varians satu hari ke depan adalah hal biasa; angka yang sama untuk return akan menjadi sinyal setingkat Renaissance. Vol targeting mengeksploitasi kuantitas yang dapat diprakirakan dan tetap agnostik terhadap yang tidak dapat diprakirakan.

Rasio Sharpe tidak konstan sepanjang waktu; mereka turun ketika volatilitas melonjak. Rezim volatilitas tinggi dalam kripto — kaskade deleveraging, kegagalan bursa, hari-hari ketika semuanya gap 30% — cenderung memiliki return-per-unit-risiko yang lebih buruk, bukan lebih baik. Dengan secara mekanis memangkas eksposur tepat ketika vol prakiraan tinggi, Anda memberi bobot rendah pada periode-periode yang paling berkontribusi pada drawdown dan paling sedikit pada return majemuk. Moreira dan Muir (2017) menunjukkan untuk ekuitas bahwa portofolio yang dikelola volatilitasnya — persis penskalaan 1/σ21/\sigma^2 ini — menaikkan rasio Sharpe dan menghasilkan alpha positif terhadap faktor yang tidak dikelola. Mekanismenya bukan sihir; ia adalah menolak memegang posisi dolar yang konstan ke dalam jendela yang dapat diprediksi bergejolak.

Manfaat drawdown bahkan lebih langsung. Drawdown maksimum didominasi oleh ekor dari distribusi posisi-return. Karena wtrt+1w_t r_{t+1} memiliki volatilitas yang disematkan mendekati σtarget\sigma_{\text{target}}, ekor kiri yang tebal yang diderita strategi notional-tetap selama ledakan vol menjadi terkompresi: Anda sudah kecil sejak awal. Vol targeting tidak memprediksi crash, tetapi ia secara sistematis kurang tereksposur ketika pasar bergejolak, dan gejolak adalah saat crash terjadi.

Hubungan dengan Kelly dan penentuan ukuran fraksional

Volatility targeting adalah sepupu dekat dari kriteria Kelly. Untuk satu aset dengan return berlebih yang diharapkan μ\mu dan varians σ2\sigma^2, fraksi optimal-pertumbuhan (full-Kelly) adalah

f=μσ2.f^\star = \frac{\mu}{\sigma^2}.

Jika Anda mengasumsikan rasio Sharpe μ/σ\mu/\sigma kurang lebih konstan — asumsi yang kuat, tetapi yang tersirat dalam "pasar membayar harga yang stabil untuk risiko" — maka μ=Sσ\mu = S\sigma dan f=S/σf^\star = S/\sigma, yang persis merupakan volatility targeting dengan σtarget=S(Kelly fraction)\sigma_{\text{target}} = S \cdot (\text{Kelly fraction}). Dengan kata lain, volatility targeting adalah penentuan ukuran Kelly di bawah asumsi bahwa return yang diharapkan berskala dengan volatilitas. Kami membahas full dan fractional Kelly, dan mengapa tidak ada orang waras yang bertrading full Kelly, di kriteria Kelly dan penentuan ukuran strategi. Pelajaran praktis dari sana berlaku juga: gunakan sebagian dari ukuran teoretis, karena kesalahan estimasi pada penyebut (prakiraan vol Anda) dan terutama pembilang (return yang diharapkan) membuat penentuan ukuran penuh menjadi agresif secara berbahaya.

Dua koneksi lagi yang perlu diingat. Pertama, vol targeting menentukan ukuran pada dispersi return yang simetris, tetapi payoff kripto tidak simetris — biaya hari turun 20% bukanlah cermin dari hari naik 20% begitu leverage dan likuidasi terlibat. Kami memperlakukan asimetri itu secara langsung di asimetri rugi-laba, dan prakiraan GJR/EGARCH (Bagian 2) sudah memanggang sebagian darinya ke dalam σ^t\hat\sigma_t dengan bereaksi lebih terhadap guncangan negatif. Kedua, prakiraan vol adalah estimasi titik; pandangan risiko yang lebih lengkap melampirkan interval padanya. Prediksi konformal untuk trading menunjukkan cara mengubah output model menjadi interval bebas-distribusi yang dapat Anda gunakan untuk penentuan ukuran, yang cocok secara alami dengan tema evaluasi-jujur dari artikel ini.

Para Pesaing: Apa yang Harus Dikalahkan GARCH

Inilah disiplin yang memisahkan evaluasi nyata dari demo. Sebelum Anda menobatkan GARCH, Anda harus memberinya lawan yang murah, jelas, dan secara mengejutkan sulit dikalahkan. Jika model GJR-t rumit Anda tidak dapat mengungguli EWMA lima baris, Anda telah belajar sesuatu yang berharga dan menyelamatkan diri Anda dari banyak kompleksitas produksi.

Kami membenchmark empat pemrakira volatilitas periode berikutnya.

(a) Volatilitas realized tertinggal (deviasi standar rolling)

Prakiraan yang paling naif: volatilitas esok hari sama dengan deviasi standar sampel dari nn return harian terakhir.

σ^tRV=1n1i=1n(rti+1rˉ)2\hat\sigma_{t}^{\text{RV}} = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}\bigl(r_{t-i+1}-\bar r\bigr)^2}

Ia memiliki satu hiperparameter (jendela nn, biasanya 20-60 hari) dan tidak ada model. Kelemahannya adalah setiap observasi dalam jendela mendapat bobot yang sama dan kemudian tiba-tiba jatuh dari tebing ketika keluar — efek "ghosting" atau "echo", di mana satu hari crash menggelembungkan prakiraan selama tepat nn hari lalu lenyap dalam semalam, terlepas apakah pasar sebenarnya sudah tenang atau belum.

(b) EWMA / RiskMetrics (λ=0.94\lambda = 0.94)

Rata-rata bergerak berbobot eksponensial memperbaiki masalah echo dengan memberikan bobot yang meluruh secara geometris pada return kuadrat yang lebih lama:

σ^t2=λσ^t12+(1λ)rt2\hat\sigma_{t}^{2} = \lambda\,\hat\sigma_{t-1}^{2} + (1-\lambda)\,r_{t}^{2}

Ini adalah estimator RiskMetrics (J.P. Morgan, 1996). Dengan λ=0.94\lambda = 0.94 kanonik untuk data harian, memori efektifnya kurang lebih 1/(1λ)171/(1-\lambda) \approx 17 hari, tetapi peluruhannya mulus — tidak ada tebing. Perhatikan apa sebenarnya EWMA itu: ia adalah GARCH(1,1) terintegrasi dengan ω=0\omega = 0 dan α+β=1\alpha + \beta = 1, yaitu GARCH tanpa mean reversion dan tanpa varians jangka panjang. Ia memiliki nol parameter bebas jika Anda menerima λ=0.94\lambda = 0.94, dan ia adalah baseline paling tangguh dalam seluruh artikel ini. Sebagian besar makalah "GARCH mengalahkan X" diam-diam gagal mengalahkan EWMA out of sample.

import numpy as np
import pandas as pd

def ewma_vol(returns: pd.Series, lam: float = 0.94, sigma0: float | None = None) -> pd.Series:
    """RiskMetrics EWMA conditional volatility (returns in decimal, e.g. 0.03).

    sigma2_t = lam * sigma2_{t-1} + (1 - lam) * r_t^2
    Returns a series aligned to `returns` where value at t uses info up to t.
    """
    r2 = np.square(returns.values)
    var = np.empty_like(r2)
    var[0] = sigma0**2 if sigma0 is not None else r2[0]
    for t in range(1, len(r2)):
        var[t] = lam * var[t - 1] + (1.0 - lam) * r2[t - 1]  # note: r_{t-1}, no look-ahead
    return pd.Series(np.sqrt(var), index=returns.index, name="ewma_vol")

Satu kehalusan yang menjebak orang: prakiraan untuk periode tt (yang dapat digunakan untuk menentukan ukuran posisi yang dipegang selama tt) harus dibangun dari return yang diamati sebelum tt. Dalam rekursi di atas, var[t] menggunakan r2[t-1], sehingga seri tersebut adalah prakiraan satu langkah ke depan yang sejati. Membuat indeks ini benar adalah perbedaan antara backtest dan fantasi — lebih lanjut tentang itu di bagian walk-forward.

(c) GARCH(1,1) dan GJR-t (Bagian 1-2)

Protagonis kita. GARCH(1,1) standar:

σt2=ω+αϵt12+βσt12,ω>0, α,β0, α+β<1\sigma_t^2 = \omega + \alpha\, \epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2, \qquad \omega>0,\ \alpha,\beta\ge0,\ \alpha+\beta<1

dengan varians jangka panjang σˉ2=ω/(1αβ)\bar\sigma^2 = \omega/(1-\alpha-\beta) dan prakiraan satu langkah yang langsung keluar dari rekursi (Bagian 1). Ekstensi GJR-GARCH menambahkan suku leverage sehingga guncangan negatif menaikkan varians lebih dari guncangan positif:

σt2=ω+(α+γ1[ϵt1<0])ϵt12+βσt12\sigma_t^2 = \omega + (\alpha + \gamma\, \mathbb{1}[\epsilon_{t-1}<0])\,\epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

dan dipasangkan dengan inovasi Student-t untuk menangani fat tail kripto, inilah GJR-t dari Bagian 2. Alasan GARCH bisa mengalahkan EWMA adalah mean reversion: setelah guncangan, GARCH menarik prakiraan kembali menuju σˉ2\bar\sigma^2 dengan laju yang diatur oleh α+β\alpha+\beta, sedangkan EWMA (yang terintegrasi) tidak pernah kembali. Ketika volatilitas melonjak lalu menormal — kasus yang umum — prakiraan GARCH meluruh kembali lebih cepat dan lebih akurat. Ketika volatilitas benar-benar persisten, keduanya nyaris tidak dapat dibedakan.

(d) HAR-RV pada realized variance (jika Anda memiliki data intraday)

Jika Anda memiliki bar intraday — dan di pasar kripto 24/7 Anda hampir selalu memilikinya — Anda dapat membangun proksi volatilitas yang jauh kurang noisy daripada return kuadrat harian: realized variance, jumlah return kuadrat intraday sepanjang hari.

RVt=i=1Mrt,i2(e.g. M=288 five-minute bars)RV_t = \sum_{i=1}^{M} r_{t,i}^2 \qquad (\text{e.g. } M = 288 \text{ five-minute bars})

Model Heterogeneous Autoregressive dari Corsi (2009) memprakirakan realized variance esok hari dari rata-rata harian, mingguan, dan bulanan RVRV masa lalu — cara yang kasar tetapi sangat efektif untuk menangkap persistensi memori panjang dengan tiga regresor:

RVt+1=β0+βdRVt+βwRVt(5)+βmRVt(22)+ut+1RV_{t+1} = \beta_0 + \beta_d\, RV_t + \beta_w\, \overline{RV}_t^{(5)} + \beta_m\, \overline{RV}_t^{(22)} + u_{t+1}

di mana RVt(5)\overline{RV}_t^{(5)} dan RVt(22)\overline{RV}_t^{(22)} adalah rata-rata 5 hari dan 22 hari tertinggal dari RVRV harian. Ia adalah regresi OLS biasa, ia mengeksploitasi proksi intraday berkualitas lebih tinggi, dan ia sering menjadi pemrakira vol-harian terbaik dari keempatnya — sering mengalahkan GARCH justru karena RVRV adalah target yang lebih bersih daripada r2r^2.

import numpy as np
import pandas as pd

def realized_variance(intraday_returns: pd.Series, day_index) -> pd.Series:
    """Daily realized variance = sum of squared intraday (log) returns per day.
    `intraday_returns` indexed by timestamp; `day_index` maps to calendar day.
    """
    return intraday_returns.pow(2).groupby(day_index).sum()

def har_features(rv: pd.Series) -> pd.DataFrame:
    """Build HAR regressors from a daily realized-variance series."""
    df = pd.DataFrame({"rv": rv})
    df["rv_d"] = df["rv"].shift(1)                          # yesterday
    df["rv_w"] = df["rv"].shift(1).rolling(5).mean()        # trailing week
    df["rv_m"] = df["rv"].shift(1).rolling(22).mean()       # trailing month
    df["target"] = df["rv"]                                 # predict today's RV
    return df.dropna()

def fit_har(rv: pd.Series):
    """Fit HAR-RV by OLS. Returns (coef_dict, predict_fn)."""
    df = har_features(rv)
    X = np.column_stack([np.ones(len(df)), df["rv_d"], df["rv_w"], df["rv_m"]])
    y = df["target"].values
    beta, *_ = np.linalg.lstsq(X, y, rcond=None)
    names = ["const", "rv_d", "rv_w", "rv_m"]

    def predict(rv_d, rv_w, rv_m):
        return float(beta @ np.array([1.0, rv_d, rv_w, rv_m]))

    return dict(zip(names, beta)), predict

Catatan tentang log-HAR: karena RVRV miring ke kanan dan positif tegas, banyak praktisi meregresikan logRVt+1\log RV_{t+1} pada fitur log HAR, yang memperbaiki kecocokan dan menjamin prakiraan positif. Ketika Anda mengeksponensiasi kembali, Anda harus menambahkan koreksi Jensen setengah-varians, RV^=exp(y^+12σ^u2)\widehat{RV} = \exp(\hat{y} + \tfrac{1}{2}\hat\sigma_u^2), atau Anda akan secara sistematis kurang-memprakirakan.

Dengan empat pemrakira di tangan — RV, EWMA, GARCH/GJR-t, HAR — pertanyaannya menjadi: bagaimana kita memutuskan mana yang terbaik, ketika kita tidak pernah bisa melihat hal yang mereka semua coba prediksi?

Mengevaluasi Prakiraan Volatilitas Secara Jujur

Ini adalah inti pengajaran artikel ini, jadi pelankan di sini.

Anda ingin membandingkan prakiraan σ^t2\hat\sigma_t^2 terhadap varians kondisional sejati σt2\sigma_t^2. Tetapi σt2\sigma_t^2 adalah kuantitas laten — ia adalah parameter dari proses penghasil data, tidak pernah diamati secara langsung. Yang Anda dapatkan hanyalah satu return realized per hari. Jadi setiap evaluasi volatilitas sebenarnya adalah perbandingan prakiraan Anda terhadap proksi yang noisy untuk kebenaran. Dua proksi standar:

  • Return kuadrat rt2r_t^2. Tak bias untuk σt2\sigma_t^2 di bawah model rata-rata-nol (E[rt2Ft1]=σt2\mathbb{E}[r_t^2 \mid \mathcal{F}_{t-1}] = \sigma_t^2), tetapi sangat noisy: satu return harian adalah estimasi satu-observasi dari deviasi standar. Proksi rt2r_t^2 bisa 0 (hari datar) bahkan ketika vol sejati tinggi, atau sangat besar pada hari ekor yang beruntung.
  • Realized variance RVtRV_t dari data intraday. Jauh kurang noisy — pengambilan sampel intraday merata-ratakan noise return-tunggal idiosinkratik — yang justru mengapa HAR-RV bekerja dan mengapa Anda harus menggunakan RVRV sebagai proksi Anda jika Anda memiliki data intraday sama sekali.

Kehalusan yang menjebak hampir semua orang: karena proksi noisy, pilihan fungsi loss tidaklah tak berdosa. Peringkatkan dua prakiraan dengan loss yang salah dan proksi yang noisy dapat membalikkan peringkat, memberitahu Anda bahwa prakiraan yang lebih buruk lebih baik. Patton (2011) menghitung dengan tepat fungsi loss mana yang "robust" dalam arti bahwa memeringkat prakiraan berdasarkan expected loss pada proksi yang noisy memberikan peringkat yang sama yang akan Anda dapatkan pada varians sejati (yang tak teramati). Hanya keluarga tertentu yang memenuhi syarat. Dua anggota penting dalam praktik.

MSE vs QLIKE

Mean squared error pada varians:

LMSE(σ2,h)=(σ2h)2L_{\text{MSE}}(\sigma^2, h) = (\sigma^2 - h)^2

di mana h=σ^2h = \hat\sigma^2 adalah prakiraan dan σ2\sigma^2 diproksikan oleh r2r^2 atau RVRV. MSE robust dalam arti Patton (peringkatnya konsisten-proksi), tetapi ia simetris dan bergantung-skala: ia menghukum over-forecast dan under-forecast dengan besar absolut yang sama secara setara, dan ia memberi bobot pada kesalahan selama periode volatilitas tinggi jauh lebih besar daripada kesalahan selama periode tenang. Model yang menyempurnakan 95% hari tenang tetapi meledakkan prakiraan varians pada tiga hari krisis akan terlihat mengerikan di bawah MSE, bahkan jika perilaku krisisnya adalah persis yang Anda inginkan.

Loss QLIKE (quasi-likelihood) adalah kuda pekerjanya:

LQLIKE(σ2,h)=σ2hlogσ2h1L_{\text{QLIKE}}(\sigma^2, h) = \frac{\sigma^2}{h} - \log\frac{\sigma^2}{h} - 1

Ia adalah loss yang tersirat oleh likelihood Gaussian pada varians, ia juga robust dalam arti Patton, dan ia memiliki dua sifat yang menjadikannya pilihan yang lebih disukai untuk volatilitas. Pertama, ia asimetris ke arah yang benar: ia menghukum under-prediksi varians lebih dari over-prediksi. Bagi manajer risiko atau vol-targeter, itu adalah asimetri yang benar — under-forecast vol berarti Anda mengambil terlalu banyak ukuran tepat sebelum itu penting, yang merupakan kesalahan yang mahal. Kedua, ia (kurang lebih) invarian-skala: karena ia bergantung pada rasio σ2/h\sigma^2/h, kesalahan prakiraan 10% biaya kira-kira sama apakah itu terjadi pada hari tenang atau hari krisis, sehingga evaluasi tidak dibajak oleh segelintir observasi varians-tinggi seperti yang dilakukan MSE. Robustness terhadap heteroskedastisitas proksi itu justru yang Anda inginkan ketika seluruh intinya adalah bahwa volatilitas bervariasi secara liar.

Perhatikan LQLIKE0L_{\text{QLIKE}} \ge 0, dengan kesetaraan iff h=σ2h = \sigma^2. Lebih rendah lebih baik, sama seperti MSE.

import numpy as np

def qlike(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation QLIKE loss. `proxy` is r^2 or RV (a variance proxy),
    `forecast_var` is h = sigma_hat^2. Both strictly positive, same units.
    """
    ratio = proxy / forecast_var
    return ratio - np.log(ratio) - 1.0

def mse_var(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation MSE on the variance scale."""
    return np.square(proxy - forecast_var)

Dua peringatan operasional. Jaga proksi dan prakiraan dalam unit yang identik (keduanya varians harian, atau keduanya tahunan) atau rasionya tak berarti. Dan jangan pernah biarkan forecast_var mencapai nol — potong ke lantai kecil, karena log0\log 0 akan meracuni seluruh rata-rata.

Regresi Mincer-Zarnowitz

Satu angka loss memberitahu Anda mana prakiraan yang lebih baik; ia tidak memberitahu Anda bagaimana sebuah prakiraan salah. Regresi Mincer-Zarnowitz (1969) melakukannya. Regresikan proksi pada prakiraan:

rt2  =  a+bσ^t2+ut.r_t^2 \;=\; a + b\,\hat\sigma_t^2 + u_t.

Di bawah prakiraan yang optimal dan tak bias, a=0a = 0 dan b=1b = 1: rata-rata realized variance sama dengan prakiraan. Penyimpangan mendiagnosis patologi:

  • b<1b < 1 dengan a>0a > 0: tanda klasik dari prakiraan yang terlalu volatil — ia bereaksi berlebihan, memprediksi ekstrem yang tidak sepenuhnya terwujud. Sangat umum untuk model yang digerakkan return-kuadrat mentah.
  • b>1b > 1: prakiraan kurang bereaksi, berskala terlalu sedikit dengan varians sejati.
  • R2R^2 regresi rendah: bahkan jika a,ba,b terlihat baik rata-rata, prakiraan melacak varians dengan buruk dari hari ke hari. Karena proksi begitu noisy, jangan khawatir bahwa MZ R2R^2 terhadap r2r^2 sering hanya 0.05-0.20; terhadap RVRV ia akan jauh lebih tinggi. R2R^2 terhadap r2r^2 dibatasi jauh di bawah 1 tidak peduli seberapa bagus prakiraan, murni karena noise proksi.

Uji-FF gabungan dari H0:(a,b)=(0,1)H_0: (a,b) = (0,1) memberikan pemeriksaan kalibrasi formal. Dalam praktik, gunakan MZ sebagai diagnostik untuk memahami sebuah prakiraan, dan QLIKE untuk memeringkat prakiraan.

Diebold-Mariano: apakah perbedaannya nyata?

Misalkan QLIKE rata-rata GARCH adalah 0.183 dan EWMA adalah 0.191. GARCH "menang". Tetapi apakah 0.008 adalah keunggulan nyata atau noise sampling? Uji Diebold-Mariano (1995) menjawab persis ini. Definisikan diferensial loss per-periode

dt=L(proxyt,htA)L(proxyt,htB)d_t = L(\text{proxy}_t, h^A_t) - L(\text{proxy}_t, h^B_t)

untuk dua prakiraan AA dan BB (di sini LL = QLIKE). Hipotesis nol adalah akurasi prediktif yang setara, H0:E[dt]=0H_0: \mathbb{E}[d_t] = 0. Statistiknya adalah diferensial rata-rata yang distandarisasi oleh error standar jangka panjang (HAC), karena dtd_t berkorelasi serial:

DM=dˉLRV^(dt)/T  d  N(0,1)\text{DM} = \frac{\bar d}{\sqrt{\widehat{\mathrm{LRV}}(d_t)/T}} \;\xrightarrow{d}\; \mathcal{N}(0,1)

di mana LRV^\widehat{\mathrm{LRV}} adalah estimasi varians jangka panjang tipe Newey-West. Statistik DM di luar ±1.96\pm 1.96 menolak akurasi yang setara pada 5%. Yang penting, DM adalah uji tentang prakiraan, bukan model bersarang, dan ia menangani ketergantungan serial dalam seri loss yang akan diabaikan oleh uji-tt naif pada dtd_t.

import numpy as np
from scipy import stats

def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1):
    """Diebold-Mariano test of equal predictive accuracy.
    loss_a, loss_b: per-period losses (e.g. QLIKE) for forecasts A and B.
    h: forecast horizon; Newey-West lag = h - 1 (>=0), plus a small-sample buffer.
    Returns (DM_stat, p_value). Negative DM => A has lower loss (A better).
    """
    d = np.asarray(loss_a) - np.asarray(loss_b)
    T = len(d)
    d_bar = d.mean()

    lag = max(h - 1, 0)
    gamma0 = np.mean((d - d_bar) ** 2)
    lrv = gamma0
    for k in range(1, lag + 1):
        w = 1.0 - k / (lag + 1)
        cov = np.mean((d[k:] - d_bar) * (d[:-k] - d_bar))
        lrv += 2.0 * w * cov

    dm = d_bar / np.sqrt(lrv / T)

    adj = np.sqrt((T + 1 - 2 * h + h * (h - 1) / T) / T)
    dm *= adj
    p = 2.0 * (1.0 - stats.t.cdf(abs(dm), df=T - 1))
    return float(dm), float(p)

Hasil ilustratif dalam komentar itu adalah hasil yang jujur dan umum, dan itu adalah seluruh alasan bagian ini ada: GARCH sering memposting loss rata-rata yang sedikit lebih rendah daripada EWMA, dan sama seringnya keunggulan itu gagal melewati batas signifikansi DM. Jika Anda hanya pernah melaporkan QLIKE rata-rata, Anda akan meyakinkan diri sendiri tentang keunggulan yang akan diveto oleh uji DM. Laporkan statistik DM. Ini adalah disiplin yang sama yang kami terapkan pada return strategi di evaluasi jujur tanpa keunggulan yang robust — estimasi titik yang mengalahkan benchmark bukanlah keunggulan sampai Anda menyingkirkan kemungkinan bahwa itu adalah noise.

Backtest: Strategi Vol-Targeted Walk-Forward

Sekarang kami menggabungkan dua paruh — pemrakira dan aturan penentuan ukuran — menjadi sebuah strategi dan mengevaluasinya dengan satu-satunya cara yang berarti: walk-forward, out of sample, dengan biaya.

Strategi ini sengaja sederhana, karena kesederhanaan adalah yang memungkinkan kita mengatribusikan hasil pada prakiraan vol alih-alih pada sinyal yang cerdik. Long-only, vol-targeted BTC. Setiap hari, prakirakan volatilitas hari berikutnya, tetapkan posisi ke wt=min(σtarget/σ^t, wmax)w_t = \min(\sigma_{\text{target}}/\hat\sigma_t,\ w_{\max}), pegang semalam, dan ulangi. Varian long/flat mematikan posisi ketika filter tren negatif; varian portofolio-kecil menentukan ukuran pada matriks kovarians DCC dari Bagian 3 alih-alih varians aset tunggal. Kami mendeskripsikan kasus long-only secara penuh dan mencatat ekstensinya.

Mekanika walk-forward dan kontrak no-look-ahead

Properti paling penting dari backtest ini adalah bahwa setiap kuantitas yang digunakan untuk menentukan ukuran posisi pada hari t+1t+1 dapat dihitung hanya menggunakan data yang tersedia pada penutupan hari tt. Parameter GARCH diestimasi ulang pada jendela rolling yang berakhir di tt; prakiraannya adalah σ^t+1\hat\sigma_{t+1} satu langkah ke depan dari fit itu; posisi ditetapkan dari prakiraan itu; dan return yang diperoleh adalah wt+1rt+1w_{t+1} r_{t+1}, di mana rt+1r_{t+1} adalah return hari berikutnya, yang tidak pernah dilihat model. Melakukan refit GARCH pada seluruh sampel lalu "memprakirakan" masa lalu adalah cara paling umum orang secara tidak sengaja membuat backtest yang hebat. Kami memperlakukan jebakan look-ahead ini dan metodologi umumnya di optimasi walk-forward.

import numpy as np
import pandas as pd
from arch import arch_model

def walk_forward_voltarget(
    returns: pd.Series,          # daily log returns in decimal (e.g. 0.021)
    proxy_var: pd.Series,        # variance proxy aligned to returns (RV or r^2)
    target_vol_annual: float = 0.20,
    window: int = 750,           # rolling estimation window (days)
    refit_every: int = 5,        # refit GARCH weekly, forecast daily (cost saver)
    w_max: float = 3.0,          # leverage cap
    cost_bps: float = 5.0,       # per-unit-turnover cost in basis points
    ann: int = 365,              # crypto trades 365 days/yr
):
    """Long-only vol-targeted BTC, GARCH(1,1)-t forecasts, strictly walk-forward.
    Returns a DataFrame with position, forecast vol, net returns, and turnover.
    """
    idx = returns.index
    target_daily = target_vol_annual / np.sqrt(ann)

    fcast_vol = pd.Series(index=idx, dtype=float, name="fcast_vol")
    last_res = None

    for i in range(window, len(returns) - 1):
        if (i - window) % refit_every == 0 or last_res is None:
            train = returns.iloc[i - window:i + 1] * 100.0   # scale for the optimizer
            am = arch_model(train, mean="Constant", vol="GARCH",
                            p=1, o=1, q=1, dist="t")           # GJR-t, Part 2
            last_res = am.fit(disp="off")

        f = last_res.forecast(horizon=1, reindex=False)
        var_next = f.variance.values[-1, 0] / (100.0 ** 2)    # unscale
        fcast_vol.iloc[i + 1] = np.sqrt(var_next)

    raw_w = (target_daily / fcast_vol).clip(upper=w_max)
    position = raw_w.shift(0)                                  # w_{i+1} known at close i
    gross_ret = position * returns                            # earned on day i+1

    turnover = position.diff().abs().fillna(0.0)
    cost = turnover * (cost_bps / 1e4)
    net_ret = (gross_ret - cost).dropna()

    out = pd.DataFrame({
        "position": position,
        "fcast_vol": fcast_vol,
        "gross_ret": gross_ret,
        "turnover": turnover,
        "net_ret": net_ret,
    }).dropna()
    return out

def performance_stats(net_ret: pd.Series, ann: int = 365) -> dict:
    """Sharpe, realized vol, max drawdown, CAGR, annual turnover."""
    mu = net_ret.mean() * ann
    sigma = net_ret.std() * np.sqrt(ann)
    sharpe = mu / sigma if sigma > 0 else np.nan
    equity = (1.0 + net_ret).cumprod()
    peak = equity.cummax()
    max_dd = (equity / peak - 1.0).min()
    cagr = equity.iloc[-1] ** (ann / len(net_ret)) - 1.0
    return {
        "sharpe": round(sharpe, 2),
        "realized_vol": round(sigma, 3),
        "max_drawdown": round(max_dd, 3),
        "cagr": round(cagr, 3),
    }

Beberapa catatan implementasi yang lebih penting daripada kelihatannya:

  • Penskalaan untuk optimizer. Fit arch lebih bahagia secara numerik ketika return dalam persen, karena itulah * 100 dan / 100**2 yang cocok saat membatalkan penskalaan varians. Lupakan pembatalan penskalaan dan target vol Anda meleset 10.000x.
  • Kadensi refit. Mengestimasi ulang parameter GARCH setiap hari itu mahal dan hampir tidak menambah apa pun — parameternya stabil dari minggu ke minggu. Refit mingguan (refit_every=5) sambil memprakirakan harian (rekursi memperbarui σt2\sigma_t^2 dari return baru bahkan tanpa refit) adalah kompromi standar. Ini mencerminkan saran caching dari pipeline copula di model copula untuk risiko gabungan.
  • Cap wmaxw_{\max} bukan kosmetik. Ketika vol prakiraan runtuh dalam rezim yang sangat tenang, σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t bisa meledak ke leverage 5x, 10x. Vol targeting tanpa cap akan dengan senang hati memberi Anda leverage bencana tepat sebelum perubahan rezim volatilitas — saat persis ketika prakiraan akan paling salah. Batasi (3x di sini) dan sadari bahwa cap akan mengikat justru dalam periode yang paling tenang, paling berbahaya-dalam-kilas-balik.
  • Biaya berskala dengan turnover, dan vol targeting adalah mesin turnover. Setiap goyangan dalam prakiraan menentukan ulang ukuran posisi. Pada aset vol-rendah dengan prakiraan yang meloncat-loncat Anda bisa mengaduk buku setiap hari. Suku cost_bps bukanlah detail pembulatan; untuk vol-target turnover-tinggi ia bisa memakan fraksi yang berarti dari perbaikan Sharpe kotor.

Seperti apa output-nya (ilustratif)

Menjalankan ini pada data harian BTC selama jendela multi-tahun, membandingkan keempat pemrakira sebagai penyebut penentuan ukuran, cenderung menghasilkan tabel dengan bentuk berikut. Angka-angka di bawah adalah ilustratif — dipilih secara manual untuk menunjukkan pola tipikal, bukan output backtest nyata — tetapi urutan dan besarannya representatif dari apa yang dilaporkan praktisi.

Prakiraan penentuan ukuran Sharpe Realized vol Target vol Max drawdown Turnover thn.
Notional tetap (tanpa targeting) 0.71 0.68 -0.78 0.1x
Rolling RV (60d) 0.94 0.24 0.20 -0.41 12x
EWMA (λ=0.94\lambda=0.94) 1.02 0.21 0.20 -0.35 19x
GARCH(1,1)-t 1.05 0.21 0.20 -0.33 22x
HAR-RV (proksi intraday) 1.09 0.20 0.20 -0.31 20x

Dua varian yang layak dibangun

Kasus long-only mengisolasi prakiraan, tetapi dua ekstensi cukup umum untuk ditunjukkan secara eksplisit.

Long/flat dengan gerbang tren. Vol targeting menentukan ukuran posisi tetapi tidak mengambil pandangan arah — ia selalu long. Perbaikan yang murah dan jujur adalah menutup posisi ketika filter tren lambat berbalik negatif, sehingga Anda memegang long vol-targeted hanya dalam tren naik dan duduk flat sebaliknya. Ini menjaga logika penentuan ukuran tetap identik dan melapisi filter rezim kasar di atasnya; ia tidak berpura-pura menetapkan waktu entri, hanya menghindari memegang melalui tren turun yang jelas.

def apply_trend_gate(position: pd.Series, price: pd.Series, fast: int = 20, slow: int = 100):
    """Zero out the (already vol-targeted) position when the fast SMA is below
    the slow SMA. Both SMAs use only past prices, so no look-ahead is introduced.
    """
    fast_ma = price.rolling(fast).mean().shift(1)   # shift: known at prior close
    slow_ma = price.rolling(slow).mean().shift(1)
    gate = (fast_ma > slow_ma).astype(float)        # 1.0 in uptrend, 0.0 otherwise
    return position * gate.reindex(position.index).fillna(0.0)

Gerbang tren memangkas turnover di sisi bawah (Anda berhenti mengaduk posisi yang menyusut di pasar bearish) tetapi menambahkan risiko rezimnya sendiri — ia whipsaw dalam pasar menyamping yang bergolak dan tertinggal pada titik balik. Apakah ia membantu adalah pertanyaan empiris yang harus Anda jawab dengan kerigidan walk-forward, teruji-DM yang sama seperti aturan penentuan ukuran itu sendiri; filter tren adalah persis jenis add-on yang terlihat hebat in-sample dan menguap out of sample.

Vol targeting portofolio pada kovarians DCC. Untuk buku beberapa aset, prakiraan skalar σ^t\hat\sigma_t menjadi volatilitas portofolio wΣtw\sqrt{w^\top \Sigma_t w}, di mana Σt\Sigma_t adalah matriks kovarians yang bervariasi-waktu dari DCC-GARCH Bagian 3. Anda memilih bobot dasar w0w_0 (bobot setara, kapitalisasi pasar, atau kemiringan mean-variance), menghitung vol prakiraan portofolio di bawah Σt\Sigma_t, dan menskalakan seluruh vektor bobot untuk mencapai target portofolio.

def portfolio_voltarget_weights(base_w, cov_forecast, target_vol_daily, w_gross_max=3.0):
    """Scale a base weight vector so forecast portfolio vol hits the target.
    base_w:        (n,) base allocation (need not sum to 1).
    cov_forecast:  (n, n) one-step-ahead covariance from DCC-GARCH (daily units).
    """
    base_w = np.asarray(base_w, dtype=float)
    port_var = float(base_w @ cov_forecast @ base_w)
    port_vol = np.sqrt(max(port_var, 1e-12))
    scale = min(target_vol_daily / port_vol, w_gross_max / np.abs(base_w).sum())
    return scale * base_w

Ini adalah jembatan alami ke literatur konstruksi-portofolio: bobot dasar w0w_0 dapat berasal dari mean-variance Markowitz atau metode berbasis-risiko seperti HRP/CVaR, dan vol targeting kemudian duduk di atas sebagai overlay yang menskalakan risiko agregat menjadi konstan. Matriks DCC penting karena korelasi melonjak dalam crash (Bagian 3) — portofolio yang terlihat terdiversifikasi di pasar tenang bisa memiliki vol prakiraan yang jauh lebih tinggi daripada yang tersirat oleh kovarians statis justru ketika itu penting, dan overlay memangkas eksposur kotor sebagai respons.

Diagnostik yang harus selalu Anda plot

Jangan pernah percaya tabel ringkasan sendirian. Untuk vol-target apa pun, plot tiga hal dan periksa dengan mata sebelum Anda percaya angka Sharpe apa pun. Pertama, vol rolling realized dari strategi terhadap garis target — ia harus memeluk target; drift sistematis di atasnya berarti prakiraan Anda bias rendah (arah yang mahal). Kedua, seri posisi/leverage — cari cap yang mengikat dan lonjakan leverage tepat sebelum drawdown, tanda tangan dari prakiraan yang tertangkap basah oleh perubahan rezim. Ketiga, scatter prakiraan-vs-proksi (gambar Mincer-Zarnowitz) — awan dengan kemiringan jauh dari 1 memberitahu Anda bahwa prakiraan salah-skala dengan cara yang dapat disembunyikan oleh rata-rata QLIKE. Ketiga plot ini menangkap lebih banyak bug dan lebih banyak penipuan-diri daripada statistik tunggal mana pun.

Baca tabel ini dengan cara Anda harus membaca setiap tabel backtest: lihat apa yang robust dan apa yang marginal. Fakta yang robust melompat keluar. Setiap varian vol-targeted menghancurkan notional tetap pada Sharpe dan, lebih dramatis, pada drawdown dan stabilitas realized-vol — strategi notional-tetap berjalan pada vol tahunan 68% dengan drawdown 78%, yang sederhananya tidak-dapat-diinvestasikan. Dan setiap metode targeting memberikan realized vol yang dekat dengan target 20%, yang merupakan seluruh janji dari mekanik yang bekerja. Fakta marginalnya adalah perbedaan di antara para pemrakira: HAR mengungguli GARCH mengungguli EWMA mengungguli rolling RV, tetapi celahnya kecil — sepersepuluh poin Sharpe — dan, diuji dengan Diebold-Mariano pada prakiraan atau bootstrap pada return, sering gagal melewati signifikansi. Celah kecil, rapuh, bergantung-rezim antara pemrakira canggih dan naif itu adalah headline jujur dari seluruh seri ini.

Bersikap Jujur Tentang Apa yang Ini Berikan

Blog ini memiliki seluruh koleksi tentang backtesting tanpa membodohi diri sendiri, jadi mari kita terapkan pada hasil kita sendiri alih-alih diam-diam berharap Anda tidak.

Volatility targeting memperbaiki return yang disesuaikan risiko dan drawdown. Ia tidak menghasilkan alpha dari ketiadaan. Lihat lagi tabelnya. Perbaikan Sharpe dari targeting itu nyata dan layak dimiliki — tetapi dekomposisikan dan sebagian besarnya berasal dari tidak memegang posisi konstan ke dalam rezim vol-tinggi, yang secara mekanis menghindari drawdown terburuk dan menstabilkan jalur majemuk. Strategi tetap long BTC; ia tidak memiliki pandangan yang tidak diberikan pasar. Jika BTC memiliki Sharpe negatif selama sampel Anda, vol targeting akan memberi Anda Sharpe negatif yang kurang buruk, bukan yang positif. Ia membentuk ulang distribusi return — ekor lebih tipis, vol lebih stabil, pemajemukan geometris lebih baik — tetapi keunggulan arah mentah adalah apa pun yang long yang mendasarinya. Jangan biarkan kurva ekuitas yang indah menipu Anda untuk percaya Anda telah menemukan alpha ketika Anda menemukan manajemen risiko. Moreira-Muir menemukan alpha sejati dalam faktor ekuitas dari manajemen vol, tetapi hasil itu adalah tentang tradeoff risiko-return yang bervariasi-waktu dari faktor tersebut, dan ia tidak otomatis berpindah ke satu aset kripto atas sampel yang berbeda.

Keunggulan kualitas-prakiraan GARCH atas EWMA sering kecil dan bergantung-rezim. Ini adalah imbalan yang tidak nyaman dari Bagian 1-3. Anda membangun model yang semakin canggih — suku leverage, ekor Student-t, korelasi dinamis — dan kontribusi marginal masing-masing pada P&L vol-targeting, atas EWMA naif, sering berada dalam pita noise. Keunggulan GARCH (mean reversion setelah guncangan) muncul terutama dalam rezim tertentu: lonjakan tajam yang kemudian menormal. Dalam tren yang menggerus atau rezim vol-tinggi yang persisten ia nyaris tidak berbeda dari EWMA. Ini tidak membuat GARCH tidak berguna — struktur mean-reversion, parameter yang dapat diinterpretasi, kemampuan untuk mensimulasikan jalur ke depan dan menetapkan harga opsi terhadap prakiraan semuanya memiliki nilai yang tidak dimiliki EWMA — tetapi jika penggunaan satu-satunya Anda adalah penentuan ukuran, jalankan uji DM sebelum Anda membayar biaya kompleksitas, dan ketahui bahwa deteksi rezim memberitahu Anda hal yang sama dari sudut yang berbeda: model pemenang bergantung pada rezim.

Sharpe backtest adalah batas atas Sharpe live, dan vol targeting memperlebar celahnya. Karena strategi ini berat-turnover dan berskala-leverage, ia luar biasa sensitif terhadap friksi yang dihilangkan backtest naif: fill Anda lebih buruk daripada penutupan yang Anda gunakan untuk penentuan ukuran, biaya funding pada posisi perp yang di-leverage terus bertambah, dan cap leverage berinteraksi dengan mekanika margin dan likuidasi yang diabaikan oleh w * return sederhana. Setiap satu dari ini membuat live lebih buruk daripada backtest. Kami memperlakukan celah ini secara sistematis di paritas backtest-live; untuk vol targeting secara khusus, anggarkan untuknya dengan menggunakan biaya konservatif, cap leverage yang realistis (rendah), dan dengan mengeksekusi pada pembukaan bar berikutnya alih-alih penutupan tempat Anda menghitung sinyal.

Sebuah selingan tentang premium risiko volatilitas. Segala sesuatu di atas memprakirakan volatilitas realized. Ada objek paralel yang dapat ditradingkan: volatilitas implied, yang dihargakan ke dalam opsi, yang rata-rata berada di atas realized vol berikutnya — premium risiko volatilitas, kompensasi untuk menanggung risiko lonjakan vol. Celah itu sendiri adalah sumber return (menjual varians memanennya, membelinya melindungi risiko ekor), dan ia adalah permainan yang benar-benar berbeda dari vol targeting: ia adalah taruhan pada harga volatilitas alih-alih penggunaan prakiraan volatilitas. Kami tidak mengejarnya di sini, tetapi mesinnya dimulai dengan model penetapan harga di penetapan harga opsi Black-Scholes, dan prakiraan realized-vol yang baik (Bagian 1-2) adalah persis input yang Anda perlukan untuk menilai apakah implied vol mahal atau murah. Membandingkan prakiraan GARCH Anda dengan implied vol pasar opsi adalah salah satu penggunaan yang lebih jujur dari segala sesuatu yang Anda bangun dalam seri ini.

Pertimbangan Praktis

Kumpulan hal-hal yang memisahkan vol-target yang berfungsi dari yang rapuh.

  • Estimasi pada horizon yang tepat. Jika Anda menentukan ukuran posisi yang dipegang selama satu hari, prakirakan vol satu hari. Jika Anda menyeimbangkan ulang mingguan, prakirakan (dan targetkan) vol mingguan, atau agregat prakiraan GARCH harian sepanjang horizon — prakiraan GARCH multi-langkah kembali ke rata-rata menuju σˉ2\bar\sigma^2, yang diabaikan oleh penskalaan naif "hdaily\sqrt{h}\cdot\text{daily}". Bagian 1 mencakup prakiraan GARCH multi-langkah.
  • Anualisasi di pasar 24/7. Kripto ditradingkan 365 hari setahun tanpa akhir pekan atau hari libur, jadi anualisasikan vol harian dengan 365\sqrt{365}, bukan 252\sqrt{252} dari ekuitas. Salah dalam hal ini diam-diam salah-menskalakan target Anda sekitar ~20%.
  • Penyebut bisa berupa matriks kovarians. Untuk buku multi-aset, ganti skalar σ^t\hat\sigma_t dengan vol portofolio wΣtw\sqrt{w^\top \Sigma_t w} dari DCC-GARCH Bagian 3, dan skalakan seluruh vektor bobot untuk mencapai target vol portofolio. Ini menghubungkan vol targeting ke penentuan ukuran mean-variance (Markowitz untuk kripto) dan alokasi berbasis-risiko (pipeline HRP dan CVaR) — vol targeting adalah kasus khusus aset-tunggal dari penskalaan ke anggaran risiko portofolio.
  • Vol targeting bersifat prosiklik dengan cara yang halus. Ketika semua orang menjalankan aturan 1/σ1/\sigma yang sama, lonjakan vol memaksa deleveraging tersinkronisasi, yang mendorong harga turun, yang menaikkan realized vol, yang memaksa lebih banyak deleveraging. Umpan balik ini (terdokumentasi dengan baik dalam "volmageddon" 2018 dan berbagai kaskade deleveraging kripto) berarti aturan bekerja kurang baik justru ketika banyak pemain menggunakannya. Ini bukan alasan untuk meninggalkannya, tetapi ia adalah alasan untuk membatasi leverage dan untuk tidak berasumsi bahwa fill Anda selama lonjakan vol akan menyerupai fill pasar-tenang.
  • Beri lantai dan potong prakiraan. Vol prakiraan nol atau mendekati-nol menghasilkan leverage tak hingga. Selalu beri lantai σ^t\hat\sigma_t pada minimum yang masuk akal dan batasi posisi, dan catat seberapa sering masing-masing mengikat — jika cap mengikat sebagian besar waktu, target Anda terlalu agresif untuk aset tersebut.

Ringkasan

  • Sebuah prakiraan volatilitas tidak memiliki nilai sampai ia mengubah keputusan. Volatility targeting — menentukan ukuran eksposur sebagai wt=σtarget/σ^tw_t = \sigma_{\text{target}}/\hat\sigma_t (dibatasi) — adalah uji terbersih dari nilai sebuah prakiraan, karena kualitas prakiraan memetakan langsung ke profil realized-vol yang lebih datar dan Sharpe yang lebih tinggi.
  • Vol targeting menaikkan return yang disesuaikan risiko dan, terutama, mengendalikan drawdown, karena volatilitas dapat diprakirakan (ia mengelompok) sementara arah tidak, dan karena rasio Sharpe turun dalam rezim vol-tinggi yang secara otomatis diberi bobot rendah oleh aturan. Ia adalah penentuan ukuran Kelly di bawah asumsi bahwa return yang diharapkan berskala dengan volatilitas.
  • Benchmark GARCH secara jujur terhadap baseline yang kuat: rolling realized vol, EWMA/RiskMetrics (λ=0.94\lambda=0.94, sebuah IGARCH dengan nol parameter bebas), dan HAR-RV pada proksi realized-variance intraday. EWMA dan HAR sulit dikalahkan.
  • Anda tidak dapat mengamati volatilitas sejati, jadi evaluasi terhadap proksi (r2r^2 atau, jauh lebih baik, RVRV) menggunakan fungsi loss yang robust terhadap noise proksi. Utamakan QLIKE daripada MSE: ia menghukum under-forecast lebih (kesalahan yang mahal) dan invarian-skala, sehingga ia tidak dibajak oleh beberapa hari vol-tinggi. Gunakan Mincer-Zarnowitz untuk mendiagnosis bias dan uji Diebold-Mariano untuk memutuskan apakah keunggulan satu prakiraan nyata atau noise.
  • Dalam backtest walk-forward yang sadar-biaya, vol targeting secara andal mengalahkan notional tetap pada Sharpe dan drawdown, dan keempat pemrakira mengelompok berdekatan — keunggulan GARCH-atas-EWMA kecil, bergantung-rezim, dan sering tidak signifikan secara statistik. Laporkan uji DM, bukan hanya loss rata-rata.
  • Jujurlah: vol targeting adalah manajemen risiko, bukan alpha. Ia membentuk ulang distribusi return dari taruhan arah apa pun yang sudah Anda miliki; ia tidak menciptakan keunggulan dari ketiadaan. Dan ia berat-turnover dan berskala-leverage, sehingga hasil live tertinggal dari backtest lebih dari biasanya.

Referensi:

  • Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. DOI
  • Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174-196. DOI
  • Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253-263. DOI
  • Mincer, J., & Zarnowitz, V. (1969). The evaluation of economic forecasts. In Economic Forecasts and Expectations, NBER.
  • Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611-1644. DOI
  • J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th ed.
  • Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. 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
  • Harvey, D., Leybourne, S., & Newbold, P. (1997). Testing the equality of prediction mean squared errors. International Journal of Forecasting, 13(2), 281-291. DOI
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.