Penyasaran Kemeruapan dan Berdagang dengan Ramalan GARCH
Tiga bahagian pertama siri ini mengajar anda cara meramal kemeruapan. Kami membina GARCH(1,1) univariat dalam Bahagian 1, menambah leveraj dan ekor gemuk dengan GJR serta inovasi Student-t dalam Bahagian 2, dan memodelkan keseluruhan matriks kovarians sepanjang masa dengan DCC-GARCH dalam Bahagian 3. Pada penghujung setiap satu, kami mencetak satu nombor: kemeruapan yang dijangka untuk esok. Dan kemudian, jika kita jujur, kita berhenti — seolah-olah menghasilkan ramalan itulah tujuannya.
Ia bukan. Ramalan kemeruapan bukanlah P&L. Tiada sesiapa pernah dibayar kerana skor QLIKE yang rendah. Ramalan hanya menjadi bernilai pada saat tepat ia mengubah keputusan yang jika tidak, anda akan buat secara berbeza — berapa banyak untuk beli, bila untuk potong, berapa banyak modal untuk diperuntukkan. Jika ramalan anda tidak menggerakkan kedudukan, ketepatan statistiknya hanyalah hobi peribadi.
Bahagian terakhir ini adalah tentang menutup gelung tersebut. Kami mengambil ramalan daripada Bahagian 1-3 dan menggunakannya dalam keputusan yang paling bersih mungkin: penyasaran kemeruapan (volatility targeting) — menyaiz kedudukan supaya kemeruapan terealisasi portfolio mencapai sasaran malar. Kemudian kami melakukan perkara yang blog ini pentingkan lebih daripada mana-mana model tunggal: kami menilai secara jujur. Kami menanda aras GARCH terhadap garis dasar yang bodoh-tetapi-kuat (realized vol bergolek, EWMA), kami menggunakan fungsi kerugian yang teguh terhadap hakikat bahawa kita tidak pernah dapat memerhati kemeruapan sebenar, kami menjalankan backtest walk-forward dengan kos dan tanpa melihat ke hadapan, dan kami menyatakan secara jelas apa yang penyasaran kemeruapan berikan dan tidak berikan kepada anda. Spoiler: ia menambah baik pulangan terselaras risiko dan menjinakkan drawdown jauh lebih boleh dipercayai berbanding ia mengeluarkan alfa.
Mengapa Penyasaran Kemeruapan Ialah Ujian yang Betul
Terdapat cara yang lebih canggih untuk menggunakan ramalan kemeruapan — penetapan harga opsyen, had VaR, lindung nilai dinamik — tetapi penyasaran kemeruapan ialah cara yang mengasingkan nilai ramalan dengan pencemaran paling sedikit daripada pertaruhan lain. Ideanya ialah satu persamaan tunggal.
Pegang aset berisiko dengan arah tersirat isyarat (buat masa ini, hanya "long"). Bukannya kedudukan tetap, skalakan pendedahan secara songsang kepada kemeruapan ramalan:
di mana ialah ramalan anda tentang kemeruapan tempoh seterusnya (dibuat menggunakan hanya data sehingga ), dan ialah kemeruapan tahunan yang anda mahu strategi itu beroperasi — katakan 15% atau 20%. Apabila model meramalkan pasaran yang tenang, anda meningkatkan leveraj ke arah (atau melepasi) 1.0; apabila ia meramalkan ribut, anda mengecilkan. Kemeruapan terealisasi bagi kedudukan yang diskala itu, pada peringkat pertama, ialah
setiap kali . Jadi keseluruhan kualiti latihan ini bergantung pada satu perkara: sejauh mana dekat ramalan anda dengan kemeruapan sebenar tempoh seterusnya . Ramalan yang lebih baik menghasilkan profil kemeruapan terealisasi yang lebih rata dan — seperti yang akan kita lihat — nisbah Sharpe yang lebih baik. Itulah sebabnya ini ialah ujian yang betul. Ramalan bukanlah hiasan; ia ialah penyebut.
Mengapa ini menaikkan Sharpe dan mengawal drawdown
Dua fakta empirik melakukan kerja di sini.
Kemeruapan jauh lebih boleh diramal berbanding pulangan. Arah pulangan BTC esok hampir seperti lambungan syiling pada frekuensi harian; magnitudnya tidak. Kemeruapan berkelompok — pergerakan besar diikuti pergerakan besar — yang merupakan keseluruhan sebab GARCH wujud (Bahagian 1 menerbitkan struktur AR(1)-dalam-varians yang mengekod ini). Nilai sebanyak 0.4-0.6 untuk varians sehari ke hadapan adalah rutin; nombor yang sama untuk pulangan akan menjadi isyarat bertaraf Renaissance. Penyasaran kemeruapan mengeksploitasi kuantiti yang boleh diramal dan kekal agnostik tentang kuantiti yang tidak boleh diramal.
Nisbah Sharpe tidak malar sepanjang masa; ia jatuh apabila kemeruapan melonjak. Rejim kemeruapan tinggi dalam kripto — lata penyahleverajan, kegagalan pertukaran, hari-hari segala-galanya melompat 30% — cenderung mempunyai pulangan-per-unit-risiko yang lebih teruk, bukan lebih baik. Dengan memotong pendedahan secara mekanikal tepat apabila kemeruapan ramalan tinggi, anda kurang memberatkan tempoh yang paling menyumbang kepada drawdown dan paling sedikit kepada pulangan terkompaun. Moreira dan Muir (2017) menunjukkan untuk ekuiti bahawa portfolio terurus-kemeruapan — penskalaan yang tepat ini — menaikkan nisbah Sharpe dan menghasilkan alfa positif terhadap faktor yang tidak terurus. Mekanismenya bukan sihir; ia ialah keengganan untuk memegang kedudukan dolar malar ke dalam tetingkap yang boleh diramal bergelora.
Manfaat drawdown lebih langsung lagi. Drawdown maksimum dikuasai oleh ekor taburan pulangan-kedudukan. Oleh kerana mempunyai kemeruapan yang dipasak berhampiran , ekor kiri gemuk yang dialami oleh strategi nosional-tetap semasa letupan kemeruapan dimampatkan: anda sudah kecil semasa masuk. Penyasaran kemeruapan tidak meramal kejatuhan, tetapi ia secara sistematik kurang terdedah apabila pasaran bergelora, dan kegeloraan ialah masa kejatuhan berlaku.
Hubungan dengan Kelly dan penyaizan pecahan
Penyasaran kemeruapan ialah sepupu rapat kriteria Kelly. Untuk aset tunggal dengan pulangan lebihan dijangka dan varians , pecahan optimum-pertumbuhan (Kelly-penuh) ialah
Jika anda mengandaikan nisbah Sharpe secara kasarnya malar — andaian yang kuat, tetapi yang tersirat dalam "pasaran membayar harga stabil untuk risiko" — maka dan , yang tepat ialah penyasaran kemeruapan dengan . Dengan kata lain, penyasaran kemeruapan ialah penyaizan Kelly di bawah andaian bahawa pulangan dijangka berskala dengan kemeruapan. Kami membincangkan Kelly penuh dan pecahan, serta mengapa tiada orang waras berdagang Kelly penuh, dalam kriteria Kelly dan penyaizan strategi. Pengajaran praktikal dari sana terbawa: gunakan pecahan daripada saiz teori, kerana ralat anggaran dalam penyebut (ramalan vol anda) dan terutamanya pengangka (pulangan dijangka) menjadikan penyaizan penuh berbahaya agresif.
Dua lagi hubungan yang wajar diingat. Pertama, penyasaran kemeruapan menyaiz berdasarkan serakan simetri pulangan, tetapi ganjaran kripto tidak simetri — kos hari turun 20% bukanlah cermin hari naik 20% apabila leveraj dan pembubaran terlibat. Kami menangani ketaksimetrian itu secara langsung dalam ketaksimetrian rugi-untung, dan ramalan GJR/EGARCH (Bahagian 2) sudah membakar sebahagian daripadanya ke dalam dengan bertindak balas lebih kepada kejutan negatif. Kedua, ramalan vol ialah anggaran titik; pandangan risiko yang lebih lengkap melampirkan selang kepadanya. Ramalan konformal untuk perdagangan menunjukkan cara menukar output model kepada selang bebas-taburan yang boleh anda saizkan, yang berpasangan secara semula jadi dengan tema penilaian-jujur artikel ini.
Para Pesaing: Apa yang GARCH Perlu Kalahkan
Inilah disiplin yang memisahkan penilaian sebenar daripada demo. Sebelum anda memahkotakan GARCH, anda mesti memberinya lawan yang murah, jelas, dan mengejutkan sukar dikalahkan. Jika model GJR-t anda yang rumit tidak dapat mengatasi EWMA lima baris, anda telah belajar sesuatu yang berharga dan menyelamatkan diri anda daripada banyak kerumitan pengeluaran.
Kami menanda aras empat peramal kemeruapan tempoh seterusnya.
(a) Kemeruapan terealisasi berjejak (sisihan piawai bergolek)
Ramalan paling naif: kemeruapan esok bersamaan sisihan piawai sampel bagi pulangan harian terakhir.
Ia mempunyai satu hiperparameter (tetingkap , biasanya 20-60 hari) dan tiada model. Kelemahannya ialah setiap pemerhatian dalam tetingkap mendapat berat sama dan kemudian tiba-tiba jatuh dari cenuram apabila ia keluar — kesan "menghantui" atau "gema", di mana satu hari kejatuhan menggembungkan ramalan untuk tepat hari dan kemudian hilang dalam semalaman, sama ada pasaran sebenarnya sudah tenang atau tidak.
(b) EWMA / RiskMetrics ()
Purata bergerak berpemberat eksponen membaiki masalah gema dengan memberikan berat mereput geometri kepada pulangan kuasa dua yang lebih lama:
Ini ialah penganggar RiskMetrics (J.P. Morgan, 1996). Dengan kanonik untuk data harian, ingatan berkesan lebih kurang hari, tetapi reputan lancar — tiada cenuram. Perhatikan apa sebenarnya EWMA: ia ialah GARCH(1,1) terkamir dengan dan , iaitu GARCH tanpa purata-berbalik dan tanpa varians jangka panjang. Ia mempunyai parameter bebas sifar jika anda menerima , dan ia ialah garis dasar paling sukar tunggal dalam keseluruhan artikel ini. Sebahagian besar kertas "GARCH mengalahkan X" secara senyap gagal mengalahkan EWMA di luar sampel.
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 membingungkan orang: ramalan untuk tempoh (boleh digunakan untuk menyaiz kedudukan yang dipegang sepanjang ) mesti dibina daripada pulangan yang diperhati sebelum . Dalam rekursi di atas, var[t] menggunakan r2[t-1], jadi siri itu ialah ramalan satu-langkah-ke-hadapan yang tulen. Mendapatkan indeks ini betul ialah perbezaan antara backtest dan fantasi — lebih lanjut tentang itu dalam bahagian walk-forward.
(c) GARCH(1,1) dan GJR-t (Bahagian 1-2)
Protagonis kita. GARCH(1,1) piawai:
dengan varians jangka panjang dan ramalan satu-langkah keluar terus daripada rekursi (Bahagian 1). Sambungan GJR-GARCH menambah sebutan leveraj supaya kejutan negatif menaikkan varians lebih daripada kejutan positif:
dan dipasangkan dengan inovasi Student-t untuk mengendalikan ekor gemuk kripto, ini ialah GJR-t Bahagian 2. Sebab GARCH boleh mengalahkan EWMA ialah purata-berbalik: selepas kejutan, GARCH menarik ramalan kembali ke arah pada kadar yang dikawal oleh , manakala EWMA (kerana terkamir) tidak pernah berbalik. Apabila kemeruapan melonjak dan kemudian menormal — kes biasa — ramalan GARCH mereput kembali lebih cepat dan lebih tepat. Apabila kemeruapan benar-benar gigih, kedua-duanya hampir tidak dapat dibezakan.
(d) HAR-RV pada varians terealisasi (jika anda mempunyai data intrahari)
Jika anda mempunyai bar intrahari — dan dalam pasaran kripto 24/7 anda hampir selalu ada — anda boleh membina proksi kemeruapan yang jauh kurang bising berbanding pulangan kuasa dua harian: varians terealisasi, hasil tambah pulangan kuasa dua intrahari sepanjang hari.
Model Heterogeneous Autoregressive Corsi (2009) meramalkan varians terealisasi esok daripada purata harian, mingguan, dan bulanan lepas — cara kasar tetapi amat berkesan untuk menangkap kegigihan ingatan panjang dengan tiga peregresi:
di mana dan ialah purata berjejak 5-hari dan 22-hari bagi harian. Ia ialah regresi OLS biasa, ia mengeksploitasi proksi intrahari berkualiti lebih tinggi, dan ia selalunya peramal vol-harian terbaik daripada keempat-empatnya — sering mengalahkan GARCH tepat kerana ialah sasaran yang lebih bersih daripada .
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
Satu nota tentang log-HAR: kerana terpencong-kanan dan positif tegas, ramai pengamal meregres pada ciri HAR log, yang menambah baik penyuaian dan menjamin ramalan positif. Apabila anda mengeksponen kembali, anda perlu menambah pembetulan Jensen separuh-varians, , atau anda akan meramal secara sistematik kurang.
Dengan empat peramal di tangan — RV, EWMA, GARCH/GJR-t, HAR — persoalan menjadi: bagaimana kita memutuskan yang mana terbaik, apabila kita tidak pernah dapat melihat perkara yang semuanya cuba ramalkan?
Menilai Ramalan Kemeruapan Secara Jujur
Ini ialah pengajaran teras artikel, jadi perlahankan di sini.
Anda mahu membandingkan ramalan terhadap varians bersyarat sebenar . Tetapi ialah kuantiti pendam (latent) — ia ialah parameter proses penjanaan data, tidak pernah diperhati secara langsung. Yang anda dapat hanyalah satu pulangan terealisasi setiap hari. Jadi setiap penilaian kemeruapan sebenarnya ialah perbandingan ramalan anda terhadap proksi bising untuk kebenaran. Dua proksi piawai:
- Pulangan kuasa dua . Tak berat sebelah untuk di bawah model min-sifar (), tetapi amat bising: satu pulangan harian ialah anggaran satu-pemerhatian bagi sisihan piawai. Proksi boleh menjadi 0 (hari rata) walaupun vol sebenar tinggi, atau besar pada hari ekor bertuah.
- Varians terealisasi daripada data intrahari. Jauh kurang bising — pensampelan intrahari mempuratakan bunyi pulangan-tunggal idiosinkratik — yang tepatnya sebab HAR-RV berfungsi dan sebab anda patut menggunakan sebagai proksi anda jika anda mempunyai sebarang data intrahari.
Kehalusan yang menangkap hampir semua orang: kerana proksi bising, pilihan fungsi kerugian bukanlah tak bersalah. Susun kedudukan dua ramalan dengan kerugian yang salah dan proksi bising boleh membalikkan susunan, memberitahu anda ramalan yang lebih teruk lebih baik. Patton (2011) menghitung dengan tepat fungsi kerugian mana yang "teguh" dalam erti bahawa menyusun ramalan mengikut kerugian dijangka pada proksi bising memberikan susunan sama yang anda akan dapat pada varians sebenar (tak boleh diperhati). Hanya keluarga tertentu layak. Dua ahli penting dalam amalan.
MSE lawan QLIKE
Ralat kuasa dua min pada varians:
di mana ialah ramalan dan diproksi oleh atau . MSE teguh dalam erti Patton (susunannya konsisten-proksi), tetapi ia simetri dan bergantung-skala: ia menghukum lebih-ramal dan kurang-ramal saiz mutlak yang sama secara setara, dan ia memberatkan ralat semasa tempoh kemeruapan tinggi jauh lebih daripada ralat semasa tempoh tenang. Model yang tepat pada 95% hari tenang tetapi meletupkan ramalan varians pada tiga hari krisis akan kelihatan teruk di bawah MSE, walaupun tingkah laku krisisnya adalah apa yang sebenarnya anda mahukan.
Kerugian QLIKE (kuasi-kebolehjadian) ialah kuda kerja:
Ia ialah kerugian yang tersirat oleh kebolehjadian Gaussian pada varians, ia juga teguh dalam erti Patton, dan ia mempunyai dua sifat yang menjadikannya pilihan utama untuk kemeruapan. Pertama, ia tak simetri dalam arah yang betul: ia menghukum kurang-ramal varians lebih daripada lebih-ramal. Untuk pengurus risiko atau penyasar-vol, itulah ketaksimetrian yang betul — kurang-meramal vol bermakna anda mengambil saiz terlalu banyak tepat sebelum ia penting, yang merupakan ralat yang mahal. Kedua, ia (secara kasar) tak berubah-skala: kerana ia bergantung pada nisbah , ralat ramalan 10% berkos lebih kurang sama sama ada ia berlaku pada hari tenang atau hari krisis, jadi penilaian tidak dirampas oleh segelintir pemerhatian varians-tinggi seperti MSE. Keteguhan terhadap heteroskedastisiti proksi itu tepatnya apa yang anda mahukan apabila keseluruhan tujuannya ialah kemeruapan berubah secara liar.
Perhatikan , dengan kesamaan jika dan hanya jika . 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 amaran operasi. Simpan proksi dan ramalan dalam unit yang serupa (kedua-dua varians harian, atau kedua-dua tahunan) atau nisbahnya tidak bermakna. Dan jangan sekali-kali biarkan forecast_var mencecah sifar — keratkan ia pada lantai kecil, kerana akan meracuni keseluruhan purata.
Regresi Mincer-Zarnowitz
Satu nombor kerugian memberitahu anda ramalan mana yang lebih baik; ia tidak memberitahu anda bagaimana ramalan salah. Regresi Mincer-Zarnowitz (1969) melakukannya. Regres proksi pada ramalan:
Di bawah ramalan optimum tak berat sebelah, dan : secara purata varians terealisasi bersamaan ramalan. Sisihan mendiagnosis patologi:
- dengan : tandatangan klasik ramalan yang terlalu meruap — ia terlebih bertindak balas, meramalkan ekstrem yang tidak terwujud sepenuhnya. Amat biasa untuk model yang dipacu pulangan-kuasa-dua mentah.
- : ramalan kurang bertindak balas, berskala terlalu sedikit dengan varians sebenar.
- regresi rendah: walaupun kelihatan baik secara purata, ramalan menjejaki varians dengan buruk dari hari ke hari. Kerana proksi begitu bising, jangan cemas bahawa MZ terhadap selalunya hanya 0.05-0.20; terhadap ia akan jauh lebih tinggi. terhadap dibatasi jauh di bawah 1 tidak kira sebaik mana ramalan, semata-mata kerana bunyi proksi.
Ujian bersama bagi memberikan pemeriksaan penentukuran formal. Dalam amalan, gunakan MZ sebagai diagnostik untuk memahami ramalan, dan QLIKE untuk menyusun ramalan.
Diebold-Mariano: adakah perbezaan itu nyata?
Katakan QLIKE min GARCH ialah 0.183 dan EWMA ialah 0.191. GARCH "menang." Tetapi adakah 0.008 kelebihan nyata atau bunyi persampelan? Ujian Diebold-Mariano (1995) menjawab tepat perkara ini. Takrifkan pembeza kerugian setiap tempoh
untuk dua ramalan dan (di sini = QLIKE). Hipotesis nol ialah ketepatan ramalan sama, . Statistiknya ialah pembeza min dipiawaikan oleh ralat piawai jangka-panjang (HAC)nya, kerana berkorelasi bersiri:
di mana ialah anggaran varians jangka-panjang jenis Newey-West. Statistik DM melepasi menolak ketepatan sama pada 5%. Yang penting, DM ialah ujian tentang ramalan, bukan model bersarang, dan ia mengendalikan kebergantungan bersiri dalam siri kerugian yang ujian naif pada akan abaikan.
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)
Keputusan ilustratif dalam komen itu ialah hasil yang jujur dan biasa, dan ia ialah keseluruhan sebab bahagian ini wujud: GARCH selalunya mencatat kerugian purata sedikit lebih rendah berbanding EWMA, dan sama kerap kelebihan itu gagal melepasi palang keertian DM. Jika anda hanya sentiasa melaporkan QLIKE min, anda akan meyakinkan diri sendiri tentang kelebihan yang ujian DM akan veto. Laporkan statistik DM. Ini ialah disiplin yang sama yang kami terapkan kepada pulangan strategi dalam penilaian jujur tanpa kelebihan teguh — anggaran titik yang mengalahkan tanda aras bukanlah kelebihan sehingga anda telah menolak bahawa ia bunyi.
Backtest: Strategi Bersasarkan-Vol Walk-Forward
Sekarang kami menggabungkan dua bahagian — peramal dan peraturan penyaizan — kepada strategi dan menilainya dengan satu-satunya cara yang bermakna: walk-forward, di luar sampel, dengan kos.
Strategi ini sengaja ringkas, kerana kesederhanaan itulah yang membolehkan kita mengaitkan keputusan kepada ramalan vol dan bukannya kepada isyarat pintar. BTC long-sahaja, bersasarkan-vol. Setiap hari, ramal kemeruapan hari-seterusnya, tetapkan kedudukan kepada , pegang semalaman, dan ulang. Varian long/flat mematikan kedudukan apabila penapis tren negatif; varian portfolio-kecil menyaiz pada matriks kovarians DCC daripada Bahagian 3 dan bukannya varians aset tunggal. Kami menerangkan kes long-sahaja secara penuh dan mencatat sambungannya.
Mekanik walk-forward dan kontrak tanpa-melihat-ke-hadapan
Sifat paling penting tunggal backtest ini ialah setiap kuantiti yang digunakan untuk menyaiz kedudukan pada hari boleh dikira menggunakan hanya data yang tersedia pada penutup hari . Parameter GARCH dianggar semula pada tetingkap bergolek yang berakhir pada ; ramalannya ialah satu-langkah-ke-hadapan daripada penyuaian itu; kedudukan ditetapkan daripada ramalan itu; dan pulangan yang diperoleh ialah , di mana ialah pulangan hari seterusnya, yang model tidak pernah lihat. Menyuai semula GARCH pada sampel penuh dan kemudian "meramal" masa lampau ialah cara paling biasa orang secara tidak sengaja mereka-cipta backtest yang hebat. Kami menangani perangkap melihat-ke-hadapan ini dan metodologi umum dalam pengoptimuman 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 nota pelaksanaan yang lebih penting daripada rupanya:
- Penskalaan untuk pengoptimum. Penyuaian
archlebih gembira secara berangka apabila pulangan dalam peratus, maka* 100dan/ 100**2sepadan apabila menyahskala varians. Lupa menyahskala dan sasaran vol anda tersasar 10,000x. - Kadans penyuaian semula. Menganggar semula parameter GARCH setiap hari mahal dan menambah hampir tiada apa — parameter stabil minggu ke minggu. Menyuai semula mingguan (
refit_every=5) sambil meramal harian (rekursi mengemas kini daripada pulangan baharu walaupun tanpa penyuaian semula) ialah kompromi piawai. Ini mencerminkan nasihat cache daripada saluran paip copula dalam model copula untuk risiko bersama. - Had bukan kosmetik. Apabila vol ramalan runtuh dalam rejim tenang-mati, boleh meletup ke leveraj 5x, 10x. Penyasaran vol tak berhad akan dengan senang hati menyerahkan anda leveraj bencana tepat sebelum perubahan rejim kemeruapan — saat tepat ramalan bakal paling salah. Hadkan ia (3x di sini) dan sedari bahawa had akan terikat tepat pada tempoh paling tenang dan paling berbahaya-dalam-imbasan-belakang.
- Kos berskala dengan pusing ganti, dan penyasaran vol ialah mesin pusing ganti. Setiap goyangan dalam ramalan menyaiz semula kedudukan. Pada aset vol-rendah dengan ramalan yang melompat-lompat anda boleh membolak-balikkan buku setiap hari. Sebutan
cost_bpsbukan butiran pembundaran; untuk penyasar-vol pusing-ganti-tinggi ia boleh memakan pecahan bermakna daripada penambahbaikan Sharpe kasar.
Rupa output (ilustratif)
Menjalankan ini pada data harian BTC sepanjang tetingkap pelbagai tahun, membandingkan empat peramal sebagai penyebut penyaizan, cenderung menghasilkan jadual dengan bentuk berikut. Nombor di bawah adalah ilustratif — dipilih tangan untuk menunjukkan corak lazim, bukan output backtest sebenar — tetapi susunan dan magnitud adalah mewakili apa yang pengamal laporkan.
| Ramalan penyaizan | Sharpe | Vol terealisasi | Vol sasaran | Drawdown maks | Pusing ganti tahunan |
|---|---|---|---|---|---|
| Nosional tetap (tanpa penyasaran) | 0.71 | 0.68 | — | -0.78 | 0.1x |
| Rolling RV (60d) | 0.94 | 0.24 | 0.20 | -0.41 | 12x |
| EWMA () | 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 intrahari) | 1.09 | 0.20 | 0.20 | -0.31 | 20x |
Dua varian yang wajar dibina
Kes long-sahaja mengasingkan ramalan, tetapi dua sambungan cukup biasa untuk ditunjukkan secara eksplisit.
Long/flat dengan pintu tren. Penyasaran vol menyaiz kedudukan tetapi tidak mengambil pandangan arah — ia sentiasa long. Penambahbaikan murah dan jujur ialah menutup kedudukan apabila penapis tren perlahan bertukar negatif, jadi anda memegang long bersasarkan-vol hanya dalam tren menaik dan duduk rata sebaliknya. Ini mengekalkan logik penyaizan sama dan melapiskan penapis rejim kasar di atas; ia tidak berpura-pura mengatur masa kemasukan, hanya untuk mengelakkan memegang menerusi tren menurun 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)
Pintu tren memotong pusing ganti pada sisi turun (anda berhenti membolak-balik kedudukan yang mengecil dalam pasaran menurun) tetapi menambah risiko rejimnya sendiri — ia terhayun-hayun dalam pasaran mendatar yang bergolak dan lambat pada pusingan. Sama ada ia membantu ialah soalan empirik yang mesti anda jawab dengan ketelitian walk-forward, teruji-DM yang sama seperti peraturan penyaizan itu sendiri; penapis tren tepatnya jenis tambahan yang kelihatan hebat dalam-sampel dan menyejat di luar sampel.
Penyasaran vol portfolio pada kovarians DCC. Untuk buku beberapa aset, ramalan skalar menjadi kemeruapan portfolio , di mana ialah matriks kovarians berubah-masa daripada DCC-GARCH Bahagian 3. Anda memilih berat asas (berat sama, permodalan pasaran, atau condongan min-varians), mengira vol ramalan portfolio di bawah , dan menskala keseluruhan vektor berat untuk mencapai sasaran portfolio.
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 ialah jambatan semula jadi kepada literatur pembinaan-portfolio: berat asas boleh datang daripada Markowitz min-varians atau kaedah berasaskan-risiko seperti HRP/CVaR, dan penyasaran vol kemudian duduk di atas sebagai lapisan tindanan yang menskala risiko agregat kepada malar. Matriks DCC penting kerana korelasi melonjak dalam kejatuhan (Bahagian 3) — portfolio yang kelihatan terpelbagai dalam pasaran tenang boleh mempunyai vol ramalan jauh lebih tinggi berbanding kovarians statik tersirat tepat apabila ia penting, dan lapisan tindanan memotong pendedahan kasar sebagai tindak balas.
Diagnostik yang anda patut sentiasa plot
Jangan sekali-kali percaya jadual ringkasan sahaja. Untuk sebarang penyasar-vol, plot tiga perkara dan tinjau dengan mata sebelum anda mempercayai sebarang nombor Sharpe. Pertama, vol bergolek terealisasi strategi terhadap garis sasaran — ia patut memeluk sasaran; hanyutan sistematik di atasnya bermakna ramalan anda berat sebelah rendah (arah yang mahal). Kedua, siri kedudukan/leveraj — cari had terikat dan lonjakan leveraj tepat sebelum drawdown, tandatangan ramalan yang terperangkap oleh perubahan rejim. Ketiga, serakan ramalan-lawan-proksi (gambar Mincer-Zarnowitz) — awan dengan cerun jauh dari 1 memberitahu anda ramalan tersalah-skala dengan cara yang purata QLIKE boleh sembunyikan. Tiga plot ini menangkap lebih banyak pepijat dan lebih banyak penipuan diri berbanding sebarang statistik tunggal.
Baca jadual ini cara anda patut membaca setiap jadual backtest: lihat apa yang teguh dan apa yang marginal. Fakta teguh melompat keluar. Setiap varian bersasarkan-vol menghancurkan nosional tetap pada Sharpe dan, lebih dramatik, pada drawdown dan kestabilan vol-terealisasi — strategi nosional-tetap beroperasi pada 68% vol tahunan dengan drawdown 78%, yang semata-mata tidak-boleh-dilabur. Dan setiap kaedah penyasaran menyampaikan vol terealisasi hampir dengan sasaran 20%, yang merupakan keseluruhan janji mekanik itu berfungsi. Fakta marginal ialah perbezaan antara peramal: HAR menewaskan GARCH menewaskan EWMA menewaskan rolling RV, tetapi jurangnya kecil — sepersepuluh mata Sharpe — dan, diuji dengan Diebold-Mariano pada ramalan atau bootstrap pada pulangan, akan sering gagal melepasi keertian. Jurang kecil, rapuh, bergantung-rejim antara peramal canggih dan naif itulah tajuk utama jujur keseluruhan siri ini.
Berlaku Jujur Tentang Apa yang Ini Berikan kepada Anda
Blog ini mempunyai keseluruhan koleksi tentang backtesting tanpa menipu diri sendiri, jadi mari kita terapkan ia kepada keputusan kita sendiri dan bukannya secara senyap berharap anda tidak.
Penyasaran kemeruapan menambah baik pulangan terselaras-risiko dan drawdown. Ia tidak mengeluarkan alfa daripada tiada apa-apa. Lihat semula jadual. Penambahbaikan Sharpe daripada penyasaran adalah nyata dan berbaloi dimiliki — tetapi uraikan ia dan kebanyakannya datang daripada tidak memegang kedudukan malar ke dalam rejim vol-tinggi, yang secara mekanikal mengelakkan drawdown terburuk dan menstabilkan laluan pengkompaunan. Strategi masih long BTC; ia tiada pandangan yang pasaran tidak serahkan. Jika BTC mempunyai Sharpe negatif sepanjang sampel anda, penyasaran vol akan menyerahkan anda Sharpe negatif yang kurang teruk, bukan yang positif. Ia membentuk semula taburan pulangan — ekor lebih nipis, vol lebih mantap, pengkompaunan geometri lebih baik — tetapi kelebihan arah mentah ialah apa jua long asas itu. Jangan biarkan lengkung ekuiti yang indah menipu anda untuk percaya anda telah menemui alfa sedangkan anda telah menemui pengurusan risiko. Moreira-Muir menemui alfa tulen dalam faktor ekuiti daripada pengurusan vol, tetapi keputusan itu tentang tukaran risiko-pulangan berubah-masa faktor tersebut, dan ia tidak secara automatik dipindahkan kepada aset kripto tunggal sepanjang sampel yang berbeza.
Kelebihan kualiti-ramalan GARCH ke atas EWMA selalunya kecil dan bergantung-rejim. Ini ialah ganjaran tidak selesa Bahagian 1-3. Anda membina model yang semakin canggih — sebutan leveraj, ekor Student-t, korelasi dinamik — dan sumbangan marginal setiap satunya kepada P&L penyasaran-vol, ke atas EWMA naif, selalunya dalam jalur bunyi. Kelebihan GARCH (purata-berbalik selepas kejutan) muncul terutamanya dalam rejim tertentu: lonjakan tajam yang kemudian menormal. Dalam tren mengisar atau rejim vol-tinggi gigih ia hampir tidak berbeza daripada EWMA. Ini tidak menjadikan GARCH tak berguna — struktur purata-berbalik, parameter yang boleh ditafsir, keupayaan mensimulasi laluan ke hadapan dan menetapkan harga opsyen terhadap ramalan semuanya mempunyai nilai yang EWMA tiada — tetapi jika kegunaan satu-satunya anda ialah penyaizan, jalankan ujian DM sebelum anda membayar kos kerumitan, dan ketahui bahawa pengesanan rejim memberitahu anda perkara sama dari sudut berbeza: model yang menang bergantung pada rejim.
Sharpe backtest ialah batas atas Sharpe langsung, dan penyasaran vol melebarkan jurang. Kerana strategi berat-pusing-ganti dan diskala-leveraj, ia luar biasa sensitif kepada geseran yang backtest naif tinggalkan: isian anda lebih teruk daripada penutup yang anda saizkan, kos pembiayaan pada kedudukan perp berleveraj terakru berterusan, dan had leveraj berinteraksi dengan mekanik margin dan pembubaran yang w * return mudah abaikan. Setiap satunya menjadikan langsung lebih teruk daripada backtest. Kami menangani jurang ini secara sistematik dalam pariti backtest-langsung; untuk penyasaran vol khususnya, belanjawankan ia dengan menggunakan kos konservatif, had leveraj yang realistik (rendah), dan dengan melaksanakan pada pembukaan bar seterusnya dan bukan penutup yang anda kira isyaratnya.
Selingan tentang premium risiko kemeruapan. Segala di atas meramal kemeruapan terealisasi. Terdapat objek selari, boleh didagang: kemeruapan tersirat, ditetapkan harga ke dalam opsyen, yang secara purata berada di atas vol terealisasi berikutan — premium risiko kemeruapan, pampasan kerana menanggung risiko lonjakan vol. Jurang itu sendiri ialah sumber pulangan (menjual varians menuainya, membelinya melindung nilai risiko ekor), dan ia ialah permainan yang benar-benar berbeza daripada penyasaran vol: ia ialah pertaruhan pada harga kemeruapan dan bukan penggunaan ramalan kemeruapan. Kami tidak mengejarnya di sini, tetapi jenteranya bermula dengan model penetapan harga dalam penetapan harga opsyen Black-Scholes, dan ramalan vol-terealisasi yang baik (Bahagian 1-2) tepatnya input yang anda perlukan untuk menilai sama ada vol tersirat kaya atau murah. Membandingkan ramalan GARCH anda dengan vol tersirat pasaran opsyen ialah salah satu kegunaan lebih jujur bagi segala yang anda bina dalam siri ini.
Pertimbangan Praktikal
Himpunan pelbagai perkara yang memisahkan penyasar-vol yang berfungsi daripada yang rapuh.
- Anggar pada ufuk yang betul. Jika anda menyaiz kedudukan yang dipegang untuk satu hari, ramal vol satu hari. Jika anda mengimbang semula mingguan, ramal (dan sasarkan) vol mingguan, atau agregatkan ramalan GARCH harian sepanjang ufuk — ramalan GARCH pelbagai-langkah purata-berbalik ke arah , yang penskalaan naif "" abaikan. Bahagian 1 meliputi ramalan GARCH pelbagai-langkah.
- Penahunan dalam pasaran 24/7. Kripto berdagang 365 hari setahun tanpa hujung minggu atau cuti, jadi tahunkan vol harian dengan , bukan daripada ekuiti. Salah dalam ini secara senyap tersalah-skala sasaran anda sebanyak ~20%.
- Penyebut boleh menjadi matriks kovarians. Untuk buku pelbagai-aset, gantikan skalar dengan vol portfolio daripada DCC-GARCH Bahagian 3, dan skala keseluruhan vektor berat untuk mencapai vol sasaran portfolio. Ini menghubungkan penyasaran vol kepada penyaizan min-varians (Markowitz untuk kripto) dan peruntukan berasaskan-risiko (saluran paip HRP dan CVaR) — penyasaran vol ialah kes khas aset-tunggal bagi penskalaan kepada belanjawan risiko portfolio.
- Penyasaran vol prokitaran dalam cara yang halus. Apabila semua orang menjalankan peraturan yang sama, lonjakan vol memaksa penyahleverajan segerak, yang menolak harga turun, yang menaikkan vol terealisasi, yang memaksa lebih penyahleverajan. Suapan balik ini (didokumentasikan dengan baik dalam "volmageddon" 2018 dan pelbagai lata penyahleverajan kripto) bermakna peraturan itu berfungsi kurang baik tepat apabila ramai pemain menggunakannya. Ia bukan sebab untuk meninggalkannya, tetapi ia sebab untuk menghadkan leveraj dan untuk tidak mengandaikan isian anda semasa lonjakan vol akan menyerupai isian pasaran-tenang.
- Lantaikan dan keratkan ramalan. Vol ramalan sifar atau hampir-sifar menghasilkan leveraj tak terhingga. Sentiasa lantaikan pada minimum waras dan hadkan kedudukan, dan log berapa kerap setiap satu terikat — jika had terikat kebanyakan masa, sasaran anda terlalu agresif untuk aset itu.
Ringkasan
- Ramalan kemeruapan tiada nilai sehingga ia mengubah keputusan. Penyasaran kemeruapan — menyaiz pendedahan sebagai (berhad) — ialah ujian paling bersih bagi nilai ramalan, kerana kualiti ramalan memetakan terus kepada profil vol-terealisasi yang lebih rata dan Sharpe yang lebih tinggi.
- Penyasaran vol menaikkan pulangan terselaras-risiko dan, terutamanya, mengawal drawdown, kerana kemeruapan boleh diramal (ia berkelompok) manakala arah tidak, dan kerana nisbah Sharpe jatuh dalam rejim vol-tinggi yang peraturan secara automatik kurang beratkan. Ia ialah penyaizan Kelly di bawah andaian bahawa pulangan dijangka berskala dengan kemeruapan.
- Tanda araskan GARCH secara jujur terhadap garis dasar kuat: rolling realized vol, EWMA/RiskMetrics (, IGARCH dengan parameter bebas sifar), dan HAR-RV pada proksi varians-terealisasi intrahari. EWMA dan HAR sukar dikalahkan.
- Anda tidak boleh memerhati kemeruapan sebenar, jadi nilai terhadap proksi ( atau, jauh lebih baik, ) menggunakan fungsi kerugian teguh terhadap bunyi proksi. Utamakan QLIKE berbanding MSE: ia menghukum kurang-ramal lebih (ralat mahal) dan tak berubah-skala, jadi ia tidak dirampas oleh beberapa hari vol-tinggi. Gunakan Mincer-Zarnowitz untuk mendiagnosis berat sebelah dan ujian Diebold-Mariano untuk memutuskan sama ada kelebihan satu ramalan nyata atau bunyi.
- Dalam backtest walk-forward yang sedar-kos, penyasaran vol boleh dipercayai mengalahkan nosional tetap pada Sharpe dan drawdown, dan empat peramal berkelompok rapat bersama — kelebihan GARCH-ke atas-EWMA kecil, bergantung-rejim, dan sering tidak bererti secara statistik. Laporkan ujian DM, bukan hanya kerugian min.
- Berlaku jujur: penyasaran vol ialah pengurusan risiko, bukan alfa. Ia membentuk semula taburan pulangan bagi apa jua pertaruhan arah yang anda sudah ada; ia tidak mencipta kelebihan daripada tiada apa-apa. Dan ia berat-pusing-ganti dan diskala-leveraj, jadi keputusan langsung lebih ketinggalan daripada backtest berbanding biasa.
Rujukan:
- 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
MarketMaker.cc Team
Penyelidikan & Strategi Kuantitatif