← Kembali ke artikel
July 12, 2026
Bacaan 5 minit

DCC-GARCH: Korelasi Dinamik untuk Pairs dan Risiko Portfolio

#volatility
#GARCH
#DCC
#correlation
#portfolio
#pairs-trading
#crypto

Tanya kebanyakan desk kripto tentang korelasi antara BTC dan ETH, dan anda akan mendapat satu nombor — 0.8, mungkin 0.75 — dikira sepanjang tempoh yang tiada siapa ingat bagaimana ia dipilih. Nombor itu adalah pembohongan, atau sekurang-kurangnya penyederhanaan yang berbahaya. Korelasi sampel adalah purata sepanjang tempoh di mana struktur pergantungan sebenar sentiasa berubah. Dalam pasaran yang tenang, BTC dan ETH bergerak berasingan cukup untuk menjadikan pair market-neutral kelihatan menarik. Dalam liquidation cascade, mereka terkunci antara satu sama lain dan dengan segala-galanya, dan diversifikasi yang anda bayar untuk itu menguap pada saat yang tepat anda memerlukannya.

Ini bukan kesan yang halus. Ambil mana-mana drawdown 2022 — kejatuhan LUNA pada Mei, pelepasan 3AC pada Jun, keruntuhan FTX pada November — dan anda akan lihat purata korelasi berpasangan merentas 20 token teratas bergerak dari julat 0.4-0.6 ke arah 0.9+ dalam beberapa hari. Korelasi bukan pemalar yang kadangkala dianggarkan dengan buruk; ia adalah siri masa dengan dinamiknya sendiri, kluster tersendiri, dan rejimnya sendiri. Menganggapnya sebagai skalar adalah setara multivariat dengan menganggap volatiliti konstan — kesilapan yang telah kita habiskan Bahagian 1 siri ini untuk membongkarnya bagi satu aset.

Artikel ini adalah Bahagian 3 daripada siri volatiliti empat bahagian. Bahagian 1 membina GARCH(1,1) univariat dengan pustaka arch dan menunjukkan bagaimana volatiliti berkluster dan kembali ke min. Bahagian 2 menambah asimetri (GJR-GARCH, EGARCH) dan inovasi Student-t untuk menangkap kesan leverage dan ekor tebal. Di sini kita beralih kepada multivariat: kita memodelkan seluruh matriks kovarians bersyarat HtH_t ketika ia berkembang, menggunakan model Dynamic Conditional Correlation (DCC) oleh Engle. Ini memberikan kita dua perkara yang tidak pernah mampu diberikan oleh korelasi skalar — nisbah lindung nilai dinamik untuk pairs trading, dan varians portfolio yang jujur dan berubah mengikut masa untuk peruntukan berasaskan risiko. Bahagian 4 menutup siri ini dengan backtest volatility-targeted yang mengikat ramalan univariat dan multivariat kepada peraturan position-sizing.

Kami menganggap anda telah membaca Bahagian 1 dan 2, jadi kami tidak akan menerbitkan semula GARCH univariat. Jika anda mahukan gelagat ekor bersama — kebarangkalian dua aset melanggar kuantil 1% mereka secara serentak — itu adalah persoalan copula, dan kami membincangkannya dalam Model Copula untuk Risiko Bersama. DCC dan copula saling melengkapi: copula memberikan anda struktur ketergantungan-ekor yang statik tetapi fleksibel, manakala DCC memberikan anda siri masa yang boleh diurus bagi keseluruhan matriks korelasi. Artikel ini tentang yang kedua.

Mengapa Korelasi Statik Gagal dalam Kripto

Sebelum menyelami mekanismenya, mari kita tepat tentang apa yang gagal. Satu korelasi sampel ρ^\hat{\rho} sepanjang tetingkap [tw,t][t-w, t] menganggarkan

ρ^ij=s(ri,srˉi)(rj,srˉj)s(ri,srˉi)2s(rj,srˉj)2\hat{\rho}_{ij} = \frac{\sum_{s} (r_{i,s} - \bar{r}_i)(r_{j,s} - \bar{r}_j)}{\sqrt{\sum_s (r_{i,s}-\bar{r}_i)^2}\sqrt{\sum_s (r_{j,s}-\bar{r}_j)^2}}

Ini membawa tiga andaian tersirat, semuanya palsu untuk kripto:

  1. Kestasioneran ketergantungan. Tetingkap tersebut mempunyai satu ρ\rho sebenar. Pada hakikatnya ketergantungan mempunyai rejim — rejim pasaran tenang berhampiran 0.5 dan rejim tekanan berhampiran 0.95 — dan ρ^\hat{\rho} mencampurkan mereka menjadi purata yang tidak bermakna.
  2. Volatiliti margin yang konstan. Korelasi Pearson ialah kovarians ternormal. Jika σi,t\sigma_{i,t} dan σj,t\sigma_{j,t} sendiri bergerak (dan memang bergerak — itulah keseluruhan premis Bahagian 1 dan 2), maka walaupun kovarians yang konstan menghasilkan korelasi yang berubah mengikut masa, dan sebaliknya. Anda tidak boleh memisahkan kedua-duanya tanpa model volatiliti di bawahnya.
  3. Simetri merentas arah pasaran. Korelasi meningkat dalam drawdown lebih daripada dalam rali. Ini adalah saudara multivariat kepada kesan leverage. Tetingkap bergolek tidak dapat menyatakannya tanpa menjadi begitu pendek sehingga ia menjadi bunyi bising semata-mata.

Penyelesaian tetingkap-bergolek — mengira semula ρ^\hat{\rho} sepanjang 30 atau 60 hari terakhir — menukar satu masalah dengan masalah lain. Tetingkap pendek responsif tetapi bising dan lewat daripada perubahan sebenar; tetingkap panjang stabil tetapi lapuk. Lebih teruk lagi, matriks korelasi bergolek merentas dd aset tidak dijamin kekal positive semi-definite sebaik sahaja anda mula menyusutkan atau menampalnya, yang merosakkan setiap pengoptimum hiliran. Kita mahukan model yang (a) dipacu oleh proses volatiliti yang betul bagi setiap aset, (b) menghasilkan matriks korelasi yang sah pada setiap langkah secara binaan, dan (c) mempunyai parameter yang boleh kita anggarkan melalui maximum likelihood dan bukannya memilih panjang tetingkap secara sembarangan. Model itu ialah DCC-GARCH.

Masalah Multivariat: Matriks Kovarians Bersyarat

Biarkan rtRdr_t \in \mathbb{R}^d menjadi vektor pulangan bagi dd aset pada masa tt, dengan min bersyarat μt\mu_t (selalunya hanya pemalar atau term AR kecil) dan reja ϵt=rtμt\epsilon_t = r_t - \mu_t. Kita anggap

ϵtFt1D(0,Ht)\epsilon_t \mid \mathcal{F}_{t-1} \sim \mathcal{D}(0, H_t)

di mana HtH_t ialah matriks kovarians bersyarat d×dd \times d diberikan set maklumat Ft1\mathcal{F}_{t-1}, dan D\mathcal{D} ialah taburan bersyarat tertentu (Gaussian atau, lebih baik untuk kripto, Student-t multivariat). Segala-galanya dalam pemodelan volatiliti multivariat adalah jawapan berbeza kepada satu persoalan: bagaimana anda memparameterkan dinamik HtH_t supaya ia kekal simetri positive definite pada setiap langkah tanpa letupan bilangan parameter?

Dua jawapan klasik menunjukkan mengapa masalah ini sukar.

VECH

Model VECH (Bollerslev, Engle, Wooldridge 1988) menulis half-vectorization HtH_t sebagai fungsi linear reja kuasa dua lepas dan kovarians lepas:

vech(Ht)=c+Avech(ϵt1ϵt1)+Bvech(Ht1)\mathrm{vech}(H_t) = c + A\,\mathrm{vech}(\epsilon_{t-1}\epsilon_{t-1}') + B\,\mathrm{vech}(H_{t-1})

di mana vech()\mathrm{vech}(\cdot) menyusun segi tiga bawah matriks simetri menjadi vektor sepanjang d(d+1)/2d(d+1)/2. Ini adalah paling umum — setiap varians dan kovarians bergantung pada setiap varians dan kovarians lepas — dan paling tidak berguna melebihi d=3d=3. Bagi dd aset, AA dan BB masing-masing berukuran d(d+1)2×d(d+1)2\frac{d(d+1)}{2} \times \frac{d(d+1)}{2}. Pada d=5d=5 itu adalah dua matriks 15×1515\times 15, kira-kira 450 parameter, ditambah kekangan positive-definiteness yang menyakitkan untuk dinyatakan pun. Permukaan likelihood adalah rawa.

BEKK

Model BEKK (Engle & Kroner 1995) menjamin positive definiteness secara binaan menggunakan bentuk kuadratik:

Ht=CC+Aϵt1ϵt1A+BHt1BH_t = C'C + A'\,\epsilon_{t-1}\epsilon_{t-1}'\,A + B'\,H_{t-1}\,B

dengan CC segi tiga atas. Kerana setiap term ialah bentuk kuadratik, Ht0H_t \succ 0 secara automatik selagi CC0C'C \succ 0. BEKK lebih parsimoni daripada VECH tetapi masih berskala sebagai O(d2)O(d^2) parameter — matriks AA dan BB masing-masing berukuran d×dd \times d. Bagi d=10d=10 anda sedang menganggarkan kira-kira 200+ parameter secara bersama melalui MLE, pada data kripto harian yang bising, tanpa jaminan pengoptimum menumpu kepada apa-apa yang bermakna. Pada praktiknya BEKK penuh dihadkan kepada d4d \le 4, dan walaupun begitu orang menggunakan sekatan "diagonal" atau "skalar" yang membuang kebanyakan dinamik silang.

Ini adalah kutukan dimensi untuk GARCH multivariat: bilangan parameter berkembang secara kuadratik, tetapi jumlah maklumat dalam data tidak. Anda kehabisan darjah kebebasan jauh sebelum anda kehabisan aset yang anda pedulikan. Mana-mana buku kripto dengan 10-30 token adalah sama sekali di luar jangkauan untuk VECH atau BEKK.

Jalan keluar, hasil kerja Engle, adalah untuk berhenti cuba memodelkan HtH_t secara langsung dan sebaliknya memfaktorkannya kepada bahagian yang sudah kita tahu cara menganggarkan dengan murah.

DCC Engle (2002): Penguraian Dua-Langkah

Model Constant Conditional Correlation (CCC) Bollerslev (1990) adalah pemfaktoran parsimoni pertama. Ia menulis

Ht=DtRDtH_t = D_t\, R\, D_t

di mana Dt=diag(σ1,t,,σd,t)D_t = \mathrm{diag}(\sigma_{1,t}, \ldots, \sigma_{d,t}) ialah matriks diagonal sisihan piawai bersyarat — satu GARCH univariat bagi setiap aset — dan RR ialah matriks korelasi konstan. Ini adalah penyederhanaan besar: anda memasang dd model GARCH univariat bebas, kemudian menganggarkan satu matriks korelasi sampel bagi reja ternormal. Positive definiteness adalah automatik selagi RR adalah matriks korelasi yang sah dan semua σi,t>0\sigma_{i,t} > 0.

Masalah CCC ada di dalam namanya sendiri — korelasi itu konstan, yang tepat merupakan andaian yang kita tolak sejak awal artikel ini. Dynamic Conditional Correlation Engle (2002) mengekalkan pemfaktoran indah CCC tetapi membiarkan matriks korelasi bernafas:

Ht=DtRtDtH_t = D_t\, R_t\, D_t

Kini RtR_t berubah mengikut masa. Kebijaksanaannya adalah volatiliti dan korelasi dianggarkan dalam dua langkah berasingan, jadi kita tidak pernah berhadapan dengan pengoptimuman bersama O(d2)O(d^2) penuh.

Langkah 1: GARCH univariat bagi setiap aset

Bagi setiap aset ii, pasang model GARCH univariat tepat seperti dalam Bahagian 1 dan 2 — GARCH(1,1), GJR-GARCH, atau EGARCH dengan inovasi Student-t, apa sahaja yang sesuai bagi siri tersebut. Ini memberikan varians bersyarat σi,t2\sigma_{i,t}^2 dan seterusnya Dt=diag(σ1,t,,σd,t)D_t = \mathrm{diag}(\sigma_{1,t}, \ldots, \sigma_{d,t}).

Daripada model yang dipasang kita ekstrak reja ternormal:

zi,t=ϵi,tσi,tz_{i,t} = \frac{\epsilon_{i,t}}{\sigma_{i,t}}

Secara binaan setiap zi,tz_{i,t} mempunyai (secara anggaran) varians bersyarat unit. Susun mereka ke dalam vektor zt=(z1,t,,zd,t)z_t = (z_{1,t}, \ldots, z_{d,t})'. Reja ternormal ini adalah bahan mentah bagi langkah korelasi — dinamik volatiliti individu mereka telah dikupas keluar, jadi pergerakan bersama yang tinggal adalah ketergantungan tulen, bukan artifak volatiliti. (Ini adalah logik gaya PIT yang sama yang digunakan artikel copula sebelum memasang margin; di sini kita berhenti pada penormalan dan bukan pergi sepenuhnya kepada uniform.)

Langkah 2: Rekursi korelasi DCC

Kita memodelkan proses bantu QtQ_t, matriks d×dd \times d simetri positive-definite, dengan rekursi gaya GARCH dipacu oleh hasil darab luar reja ternormal:

Qt=(1ab)Qˉ+azt1zt1+bQt1Q_t = (1 - a - b)\,\bar{Q} + a\, z_{t-1} z_{t-1}' + b\, Q_{t-1}

di mana:

  • Qˉ=1Tt=1Tztzt\bar{Q} = \frac{1}{T}\sum_{t=1}^{T} z_t z_t' ialah matriks korelasi tidak bersyarat bagi reja ternormal (ini ialah correlation targeting — lebih lanjut di bawah),
  • a0a \ge 0 mengawal betapa kuat kejutan hari ini zt1zt1z_{t-1}z_{t-1}' menarik korelasi,
  • b0b \ge 0 mengawal ketekalan — berapa banyak Qt1Q_{t-1} semalam terus dibawa,
  • dan kekangan kembali-ke-min ialah a+b<1a + b < 1 (dengan a,b>0a, b > 0), analog secara langsung dengan α+β<1\alpha + \beta < 1 dalam GARCH univariat.

Perhatikan strukturnya adalah serupa dengan rekursi GARCH(1,1) skalar, tetapi pada matriks: penambat jangka panjang Qˉ\bar{Q}, term kejutan, dan term ketekalan. Kerana ia adalah gabungan cembung matriks positive-semi-definite (Qˉ\bar{Q}, hasil darab luar rank-1, dan Qt1Q_{t-1} sebelumnya), QtQ_t kekal positive definite selagi Qˉ0\bar{Q} \succ 0 dan pemberat tidak negatif. Inilah yang memberikan kita matriks kovarians yang sah secara terjamin secara percuma.

QtQ_t hampir menjadi matriks korelasi tetapi tidak tepat — diagonalnya tidak tepat 1. Jadi kita normalkannya:

Rt=(diag(Qt))1/2Qt(diag(Qt))1/2R_t = \left(\mathrm{diag}(Q_t)\right)^{-1/2}\, Q_t\, \left(\mathrm{diag}(Q_t)\right)^{-1/2}

Secara unsur, korelasi bersyarat antara aset ii dan jj ialah

ρij,t=qij,tqii,tqjj,t\rho_{ij,t} = \frac{q_{ij,t}}{\sqrt{q_{ii,t}\, q_{jj,t}}}

RtR_t ini ialah matriks korelasi yang betul — diagonal unit, off-diagonal dalam [1,1][-1,1], positive definite — pada setiap langkah masa, secara binaan. Susun semula kovarians bersyarat penuh:

Ht=DtRtDt,hij,t=ρij,tσi,tσj,tH_t = D_t\, R_t\, D_t, \qquad h_{ij,t} = \rho_{ij,t}\,\sigma_{i,t}\,\sigma_{j,t}

Bentuk unsur terakhir itu adalah yang akan anda gunakan secara berterusan: kovarians bersyarat dua aset ialah korelasi dinamik mereka didarab dengan setiap volatiliti dinamik mereka. Setiap ramuan di sebelah kanan berubah mengikut masa dan datang daripada model yang boleh anda anggarkan.

Keseluruhan model hanya mempunyai dua parameter korelasi, aa dan bb, tanpa mengira sama ada d=2d = 2 atau d=50d = 50. Sisi volatiliti berskala secara linear (satu GARCH univariat bagi setiap aset, masing-masing dengan ~4-5 parameter, semua dipasang secara bebas dan selari secara memalukan). Inilah sebabnya DCC berskala di mana BEKK dan VECH tidak boleh: kutukan dimensi terhad kepada Qˉ\bar{Q}, yang disasarkan (dimasukkan sebagai anggaran sampel) dan bukannya dioptimumkan.

Sekatan skalar dan kosnya

Skalar a,ba, b bermakna setiap pasangan aset berkongsi dinamik korelasi yang sama — kelajuan penyesuaian dan ketekalan yang sama. Korelasi BTC-ETH dan korelasi DOGE-SHIB bergerak pada rentak yang sama walaupun ekonomi mereka berbeza. Ini adalah harga kebolehurusan, dan biasanya harga yang boleh diterima. Generalisasi (Generalized DCC dengan matriks A,BA, B; DCC asimetri Cappiello-Engle-Sheppard) melonggarkan ini dengan kos parameter dan kestabilan penganggaran. Kami menyebut aDCC di bawah.

Quasi-Log-Likelihood DCC

Untuk menganggarkan aa dan bb kita memerlukan likelihood. Keputusan utama Engle ialah log-likelihood Gaussian memisahkan kepada bahagian volatiliti dan bahagian korelasi, yang mewajarkan penganggar dua-langkah. Dengan andaian ϵtFt1N(0,Ht)\epsilon_t \mid \mathcal{F}_{t-1} \sim \mathcal{N}(0, H_t), sumbangan log-likelihood pada masa tt ialah

t=12(dlog(2π)+logHt+ϵtHt1ϵt)\ell_t = -\frac{1}{2}\left( d\log(2\pi) + \log|H_t| + \epsilon_t' H_t^{-1} \epsilon_t \right)

Gantikan Ht=DtRtDtH_t = D_t R_t D_t. Maka Ht=Dt2Rt|H_t| = |D_t|^2 |R_t| dan Ht1=Dt1Rt1Dt1H_t^{-1} = D_t^{-1} R_t^{-1} D_t^{-1}, dan menggunakan zt=Dt1ϵtz_t = D_t^{-1}\epsilon_t:

t=12(dlog(2π)+2logDt+logRt+ztRt1zt)\ell_t = -\frac{1}{2}\left( d\log(2\pi) + 2\log|D_t| + \log|R_t| + z_t' R_t^{-1} z_t \right)

Sekarang pisahkan dengan menambah dan menolak ztztz_t'z_t:

t=12(dlog(2π)+2logDt+ϵtDt2ϵt)bahagian volatiliti   tV  12(logRt+ztRt1ztztzt)bahagian korelasi   tC\ell_t = \underbrace{-\frac{1}{2}\left( d\log(2\pi) + 2\log|D_t| + \epsilon_t' D_t^{-2}\epsilon_t \right)}_{\text{bahagian volatiliti }\;\ell_t^{V}} \;\underbrace{-\frac{1}{2}\left( \log|R_t| + z_t' R_t^{-1} z_t - z_t' z_t \right)}_{\text{bahagian korelasi }\;\ell_t^{C}}

Bahagian volatiliti tV\ell_t^V hanya bergantung pada parameter GARCH univariat (melalui DtD_t) — memaksimumkannya adalah tepat memasang dd model GARCH univariat bebas, yang telah kita lakukan dalam Langkah 1. Bahagian korelasi tC\ell_t^C bergantung pada aa dan bb (melalui RtR_t), diberikan reja ternormal daripada Langkah 1. Jadi dalam Langkah 2 kita hanya memaksimumkan

LC(a,b)=12t=1T(logRt+ztRt1zt)\mathcal{L}^C(a, b) = -\frac{1}{2}\sum_{t=1}^{T}\left( \log|R_t| + z_t' R_t^{-1} z_t \right)

(term ztztz_t'z_t tidak bergantung pada a,ba, b, jadi kita gugurkannya). Ini adalah pengoptimuman dua-parameter tidak kira berapa banyak aset — itulah keseluruhan intinya. Ia dipanggil likelihood quasi kerana penganggar dua-langkah adalah konsisten tetapi tidak sepenuhnya cekap; ralat piawai memerlukan pembetulan (Engle & Sheppard 2001), tetapi untuk penjanaan isyarat anggaran titik itulah yang penting.

Untuk kripto, inovasi Gaussian meremehkan risiko ekor. Menukarkan kepada likelihood Student-t multivariat adalah perubahan drop-in kepada t\ell_t (gantikan kernel Gaussian dengan ketumpatan-tt multivariat dan tambah parameter darjah kebebasan ν\nu). Kami mengekalkan quasi-likelihood Gaussian dalam penganggar di bawah untuk kejelasan dan mencatat di mana ν\nu masuk — penormalan daripada Bahagian 1-2 telah menggunakan inovasi-t pada margin, yang menangkap kebanyakan manfaat ekor.

Pelaksanaan Python

Satu fakta yang tegas: pustaka arch tidak melakukan GARCH multivariat atau DCC. arch adalah enjin univariat yang cemerlang (kami bergantung padanya untuk itu tepat), tetapi tiada dcc_model di dalamnya. Pilihan praktikal anda ialah:

  1. Bina DCC anda sendiri di atas arch — pasang model univariat dengan arch, ekstrak reja ternormal, laksanakan rekursi QQ dan quasi-likelihood korelasi dalam NumPy/SciPy, dan optimumkan dua skalar. Inilah yang kita lakukan di bawah. Ia kira-kira 60 baris dan sepenuhnya telus.
  2. Pakej PyPI mgarch — pelaksanaan DCC-GARCH pure-Python yang ringan. Sesuai untuk pemasangan pantas, kurang fleksibel jika anda mahukan margin GJR atau inovasi-t yang dipasang dengan tepat.
  3. rmgarch R (Alexios Galanos) — pelaksanaan rujukan. dccspec / dccfit menyokong DCC, aDCC, GARCH-copula, Student-t, dan ralat piawai yang betul. Jika anda melakukan penyelidikan volatiliti multivariat yang serius, rmgarch (dipanggil daripada Python melalui rpy2 jika perlu) adalah piawaian emas.

Kami membina pilihan 1 kerana ia menjadikan setiap bahagian bergerak jelas dan menggunakan semula kemahiran univariat daripada Bahagian 1-2.

Langkah 1: Pasang margin GARCH univariat dengan arch

import numpy as np
import pandas as pd
from arch import arch_model
from scipy.optimize import minimize

def fetch_returns(symbols, start="2022-01-01", end="2025-12-31"):
    """
    Daily log returns for a list of crypto symbols.
    Replace with your data source (ccxt for 24/7 exchange data,
    yfinance for a quick sketch).
    """
    import yfinance as yf
    px = yf.download([f"{s}-USD" for s in symbols],
                     start=start, end=end)["Close"]
    px.columns = symbols
    rets = np.log(px / px.shift(1)).dropna()
    return rets

symbols = ["BTC", "ETH", "SOL", "BNB"]
returns = fetch_returns(symbols)

def fit_univariate(series, dist="t"):
    """
    Fit GJR-GARCH(1,1) with Student-t innovations (Part 2 model).
    Returns the fitted result and the *scaled* series it was fit on.
    We scale returns by 100 for the optimizer's numerical health,
    exactly as in Parts 1 and 2.
    """
    scaled = series * 100.0
    model = arch_model(scaled, mean="Constant",
                       vol="GARCH", p=1, o=1, q=1, dist=dist)
    res = model.fit(disp="off")
    return res

fits = {s: fit_univariate(returns[s]) for s in symbols}

Z = pd.DataFrame({s: fits[s].std_resid for s in symbols}).dropna()

Sigma = pd.DataFrame({s: fits[s].conditional_volatility
                      for s in symbols}).loc[Z.index]

print(Z.describe())

Pemeriksaan waras yang pantas pada reja ternormal amat penting. Jika mana-mana lajur mempunyai sisihan piawai jauh daripada 1, atau autokorelasi baki yang berat dalam kuasa duanya (Ljung-Box pada zi,t2z_{i,t}^2), margin univariat itu tersalah-spesifikasi dan langkah DCC akan mewarisi ralat tersebut. Betulkan margin dahulu — itulah tujuan Bahagian 2.

Langkah 2: Rekursi DCC dan quasi-log-likelihood

def dcc_negloglik(params, Z):
    """
    Negative DCC quasi-log-likelihood (Gaussian) in (a, b).
    Z : (T, d) array of standardized residuals from Step 1.

    Implements:
        Q_t = (1-a-b) Qbar + a z_{t-1} z_{t-1}' + b Q_{t-1}
        R_t = diag(Q_t)^{-1/2} Q_t diag(Q_t)^{-1/2}
        LL  = -1/2 sum_t ( log|R_t| + z_t' R_t^{-1} z_t )
    with correlation targeting: Qbar = sample corr of Z.
    """
    a, b = params
    if a <= 0 or b <= 0 or a + b >= 1.0:
        return 1e10

    Z = np.asarray(Z)
    T, d = Z.shape
    Qbar = np.cov(Z, rowvar=False, bias=True)   # unconditional (targeted)
    dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
    Qbar = dinv @ Qbar @ dinv

    Q = Qbar.copy()          # initialize Q_1 at the target
    ll = 0.0
    for t in range(T):
        q_diag = np.sqrt(np.diag(Q))
        R = Q / np.outer(q_diag, q_diag)
        sign, logdet = np.linalg.slogdet(R)
        if sign <= 0:
            return 1e10
        z = Z[t]
        Rinv_z = np.linalg.solve(R, z)
        ll += -0.5 * (logdet + z @ Rinv_z)
        Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
    return -ll

def fit_dcc(Z):
    """Estimate (a, b) by maximizing the DCC quasi-log-likelihood."""
    res = minimize(
        dcc_negloglik, x0=[0.03, 0.94], args=(np.asarray(Z),),
        method="L-BFGS-B",
        bounds=[(1e-6, 0.5), (1e-6, 0.999)],
    )
    a, b = res.x
    print(f"DCC estimates: a = {a:.4f}, b = {b:.4f}, a+b = {a+b:.4f}")
    print(f"log-likelihood: {-res.fun:.2f}")
    return a, b

a_hat, b_hat = fit_dcc(Z)

Menjalankan ini pada buku BTC/ETH/SOL/BNB sepanjang beberapa tahun data harian menghasilkan output dalam bentuk berikut (nombor di bawah adalah ilustratif, bukan daripada eksperimen bertarikh tertentu — jalankan pada data anda sendiri):

DCC estimates: a = 0.0287, b = 0.9401, a+b = 0.9688
log-likelihood: -3812.44

Cara membacanya:

  • a=0.029a = 0.029 adalah kecil — matriks korelasi tidak melonjak dengan kejutan satu hari. Setiap hari menolak RtR_t ke arah hasil darab luar zt1zt1z_{t-1}z_{t-1}' hanya sebanyak ~3%.
  • b=0.940b = 0.940 adalah besar — korelasi sangat berterusan. Sebaik sahaja buku itu tergandeng dalam peristiwa tekanan, ia kekal tergandeng untuk seketika, mereput kembali ke arah Qˉ\bar{Q} secara perlahan. Ini sepadan dengan pengalaman sebenar drawdown kripto: korelasi tidak kembali serta-merta sebaik sahaja harga stabil.
  • a+b=0.969<1a + b = 0.969 < 1 mengesahkan kembali-ke-min. Proses korelasi mempunyai tahap jangka panjang stasioner (Qˉ\bar{Q}) yang ia kembali kepadanya, dengan separuh hayat kira-kira log(0.5)/log(a+b)22\log(0.5)/\log(a+b) \approx 22 hari. Jika anda pernah menganggarkan a+ba + b hampir sama dengan 1, proses korelasi itu tersepadu — ia tiada penambat jangka panjang, biasanya gejala perubahan struktur di dalam sampel anda yang diserap oleh model sebagai ketekalan tak terhingga.

Ketekalan hampir-unit dan pembebanan kejutan yang kecil adalah cap jari DCC kanonik merentas kelas aset, dan kripto tidak terkecuali. Inilah juga sebabnya korelasi bergolek 30-hari adalah pengganti yang begitu lemah: tetingkap bergolek secara tersirat menganggap aa dan bb yang langsung tidak sepadan dengan struktur pereputan ini.

Beberapa nota pelaksanaan yang menjimatkan masa penyahpepijatan sebenar:

  • Permulaan. Bermula pada [0.03, 0.94] mencerminkan anggaran kripto biasa: aa kecil (korelasi bertindak balas kepada kejutan tetapi tidak ganas), bb besar (korelasi berterusan). Jika pengoptimum anda mengembara ke a+b1a+b \to 1 proses korelasi itu tersepadu — biasanya tanda perubahan struktur dalam sampel (perubahan rejim yang model itu bertungkus-lumus untuk memuatkan sebagai ketekalan).
  • Konvensyen pemasaan. Di dalam gelung kita menilai RtR_t terhadap ztz_t dan kemudian mengemas kini QQ dengan ztztz_t z_t' untuk langkah seterusnya. Ini mengekalkan RtR_t sebagai fungsi maklumat hingga t1t-1 sahaja — tiada look-ahead. Melakukan silap satu ini adalah bug DCC yang paling biasa, dan ia secara senyap menggembungkan kesesuaian dalam-sampel.
  • Correlation targeting. Kami memasukkan Qˉ\bar{Q} sebagai korelasi sampel dan bukannya menganggarkannya. Inilah yang menjadikan pengoptimuman dua-dimensi. Kosnya ialah Qˉ\bar{Q} menggunakan sampel penuh, jadi dalam walk-forward yang ketat anda mesti menganggarkan semula Qˉ\bar{Q} pada tetingkap latihan sahaja (lihat di bawah).

Langkah 3: Membina semula laluan korelasi dan kovarians

Setelah a,ba, b ditetapkan, jalankan rekursi sekali lagi, kali ini menyimpan laluan penuh RtR_t (dan HtH_t) supaya strategi hiliran boleh menggunakannya.

def dcc_filter(Z, Sigma, a, b):
    """
    Run the DCC recursion with fixed (a,b) and return the full paths:
      R_path : (T, d, d) conditional correlation matrices
      H_path : (T, d, d) conditional covariance matrices (scaled units)
    Sigma : (T, d) conditional volatilities aligned with Z.
    """
    Z = np.asarray(Z); Sig = np.asarray(Sigma)
    T, d = Z.shape
    Qbar = np.cov(Z, rowvar=False, bias=True)
    dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
    Qbar = dinv @ Qbar @ dinv

    Q = Qbar.copy()
    R_path = np.empty((T, d, d))
    H_path = np.empty((T, d, d))
    for t in range(T):
        q_diag = np.sqrt(np.diag(Q))
        R = Q / np.outer(q_diag, q_diag)
        R_path[t] = R
        Dt = np.diag(Sig[t])          # D_t = diag(sigma_i,t)
        H_path[t] = Dt @ R @ Dt       # H_t = D_t R_t D_t
        z = Z[t]
        Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
    return R_path, H_path

R_path, H_path = dcc_filter(Z, Sigma, a_hat, b_hat)

i, j = symbols.index("BTC"), symbols.index("ETH")
rho_btc_eth = pd.Series(R_path[:, i, j], index=Z.index, name="rho_BTC_ETH")
print(rho_btc_eth.describe())
print("min/max correlation:", rho_btc_eth.min().round(3),
      rho_btc_eth.max().round(3))

Siri rho_btc_eth adalah ganjaran keseluruhan latihan ini: dan bukannya satu nombor, kini anda mempunyai korelasi harian yang boleh anda plot, ambang, atau suapkan ke dalam strategi. Pada data kripto sebenar anda biasanya akan melihat ia berjulat daripada kira-kira 0.5 dalam tempoh tenang hingga melebihi 0.9 semasa tekanan — julat sebenar yang dipuratakan oleh satu korelasi sampel.

Ramalan satu-langkah-ke-hadapan

Untuk perdagangan langsung anda memerlukan Ht+1H_{t+1} satu-langkah-ke-hadapan daripada maklumat yang tersedia sekarang. Sisi volatiliti datang daripada ramalan satu-langkah setiap model arch; sisi korelasi adalah satu lagi pusingan rekursi:

def dcc_forecast_next(Z, a, b, fits, symbols):
    """One-step-ahead H_{t+1} using info through the last observation."""
    Z = np.asarray(Z); T, d = Z.shape
    Qbar = np.cov(Z, rowvar=False, bias=True)
    dinv = np.diag(1.0 / np.sqrt(np.diag(Qbar)))
    Qbar = dinv @ Qbar @ dinv

    Q = Qbar.copy()
    for t in range(T):
        z = Z[t]
        Q = (1 - a - b) * Qbar + a * np.outer(z, z) + b * Q
    q_diag = np.sqrt(np.diag(Q))
    R_next = Q / np.outer(q_diag, q_diag)

    sig_next = np.array([
        np.sqrt(fits[s].forecast(horizon=1, reindex=False)
                .variance.iloc[-1, 0])
        for s in symbols
    ])
    Dt = np.diag(sig_next)
    H_next = Dt @ R_next @ Dt
    return R_next, H_next, sig_next

R_next, H_next, sig_next = dcc_forecast_next(Z, a_hat, b_hat, fits, symbols)

Ingat segala-galanya dalam unit berskala (×100) kerana kita memasang arch pada series * 100. Bahagikan volatiliti dengan 100 (dan kovarians dengan 1002=10,000100^2 = 10{,}000) untuk kembali kepada unit pulangan mentah sebelum menyuap ke dalam strategi. Mengekalkan penskalaan yang betul adalah membosankan tetapi sumber bug senyap yang kerap.

Aplikasi 1: Nisbah Lindung Nilai Dinamik untuk Pairs Trading

Pair market-neutral klasik — beli satu aset, jual pendek jumlah beta-weighted aset lain — hidup atau mati bergantung pada nisbah lindung nilai β\beta. Anggarkannya melalui OLS statik sepanjang tetingkap latihan dan anda mewarisi tepat masalah korelasi-lapuk yang menjadi tumpuan keseluruhan artikel ini: lindung nilai yang meneutralkan pendedahan pasaran suku lalu adalah salah pada suku ini.

DCC memberikan anda nisbah lindung nilai sebagai siri masa. Lindung nilai varians-minimum bagi pendedahan ETH menggunakan BTC adalah pekali regresi bersyarat

βt=Covt(rETH,rBTC)Vart(rBTC)=hETH,BTC,tσBTC,t2=ρETH,BTC,tσETH,tσBTC,t\beta_t = \frac{\mathrm{Cov}_t(r_{\text{ETH}}, r_{\text{BTC}})}{\mathrm{Var}_t(r_{\text{BTC}})} = \frac{h_{\text{ETH,BTC},t}}{\sigma_{\text{BTC},t}^2} = \rho_{\text{ETH,BTC},t}\,\frac{\sigma_{\text{ETH},t}}{\sigma_{\text{BTC},t}}

Setiap term di sebelah kanan adalah output DCC. Nisbah lindung nilai bergerak atas dua sebab berbeza, dan DCC memisahkan mereka dengan bersih: korelasi ρt\rho_t berubah (aset bergandeng atau berpisah), dan nisbah volatiliti σETH,t/σBTC,t\sigma_{\text{ETH},t}/\sigma_{\text{BTC},t} berubah (satu aset menjadi lebih volatil secara relatif). Beta rolling-OLS mengaburkan kedua-dua kesan bersama dengan lat; DCC mengaitkan mereka secara berasingan.

def dynamic_hedge_ratio(R_path, Sigma, base="BTC", target="ETH",
                        symbols=symbols, index=Z.index):
    """
    beta_t to hedge `target` exposure with `base`:
        beta_t = rho_t * sigma_target,t / sigma_base,t
    (Scaling cancels in the ratio, so scaled units are fine here.)
    """
    i = symbols.index(target)
    j = symbols.index(base)
    rho = R_path[:, i, j]
    sig = np.asarray(Sigma)
    beta = rho * sig[:, i] / sig[:, j]
    return pd.Series(beta, index=index, name=f"beta_{target}_{base}")

beta_t = dynamic_hedge_ratio(R_path, Sigma)
print(beta_t.describe())

spread = (returns["ETH"] - beta_t.shift(1) * returns["BTC"]).dropna()

Suap spread ke dalam enjin pairs apa sahaja yang anda jalankan. Lindung nilai dinamik itu sendiri tidak mencipta kelebihan — ia menjadikan spread yang anda dagangkan benar-benar market-neutral sepanjang masa, supaya isyarat kembali-ke-min anda tidak tercemar oleh pendedahan arah yang hanyut. Jika anda membina strategi pairs, ini terus masuk ke dalam rangka kerja dalam Statistical Arbitrage & Pairs Trading dalam Kripto dan pendekatan jarak untuk pairs, menggantikan nisbah lindung nilai tetap mereka. Siri korelasi itu sendiri juga merupakan input yang lebih bersih kepada isyarat pair berasaskan korelasi berbanding mana-mana tetingkap bergolek — anda mendapat ρt\rho_t yang dilicinkan dan konsisten-model dan bukannya anggaran bertetingkap yang bising.

Dua peringatan khusus untuk menggunakan βt\beta_t secara langsung. Pertama, lat-kan — dagang pada βt1\beta_{t-1}, bukan βt\beta_t semasa, atau anda sedang mengintip. Kedua, nisbah lindung nilai yang berayun setiap hari menjana turnover dan yuran; dalam pasaran 24/7 kripto dengan kos pendanaan pada kaki pendek, lindung nilai yang terlalu bertindak balas boleh berdarah lebih daripada hanyutan yang ia betulkan. Licinkan βt\beta_t (EWMA, atau imbang semula lindung nilai hanya apabila ia melepasi jalur) dan saizkan keseluruhan dengan waras — position sizing daripada isyarat bising adalah disiplin tersendiri, dibincangkan dalam saiz strategi Kriteria Kelly.

Aplikasi 2: Varians Portfolio yang Berubah Mengikut Masa

Bagi portfolio dengan vektor pemberat ww, varians bersyarat ialah

σp,t2=wHtw=ijwiwjρij,tσi,tσj,t\sigma_{p,t}^2 = w'\, H_t\, w = \sum_{i}\sum_{j} w_i w_j\, \rho_{ij,t}\,\sigma_{i,t}\,\sigma_{j,t}

Dengan matriks kovarians statik — lalai Markowitz — nombor ini adalah pemalar yang anda kira sekali dan berpura-pura masih benar. Ia tidak. Risiko portfolio bernafas dengan pasaran, dan ia bernafas paling kuat tepat apabila korelasi melonjak, kerana dalam drawdown kedua-dua term σi,t\sigma_{i,t} dan term ρij,t\rho_{ij,t} meningkat bersama dan didarab. Portfolio yang kelihatan seperti 40% vol tahunan dalam pasaran tenang boleh berjalan pada 80%+ dalam minggu tekanan, dan matriks kovarians statik akan memberitahu anda tiada apa yang berubah.

def portfolio_vol_path(H_path, weights, index=Z.index, unscale=1e4):
    """
    Conditional portfolio volatility sigma_{p,t} = sqrt(w' H_t w).
    H_path is in scaled (x100) units, so covariances carry a 100^2
    factor: divide by unscale=1e4 to return to raw-return variance.
    """
    w = np.asarray(weights)
    var_t = np.einsum("i,tij,j->t", w, H_path, w) / unscale
    return pd.Series(np.sqrt(var_t), index=index, name="port_vol")

w = np.array([0.4, 0.3, 0.2, 0.1])   # BTC, ETH, SOL, BNB
pv = portfolio_vol_path(H_path, w)
pv_annual = pv * np.sqrt(365)
print(pv_annual.describe())

σp,t\sigma_{p,t} yang berubah mengikut masa ini adalah input jujur yang diperlukan oleh peruntukan berasaskan risiko. Pengoptimuman min-varians (Markowitz untuk kripto) dengan kovarians sampel yang statik mengoptimumkan terhadap fiksyen; menyuapkannya HtH_t (atau ramalan jangka pendeknya) menjadikan sempadan cekap itu sendiri berubah mengikut masa dan memaksa pengoptimum mengurangkan risiko ke dalam rejim korelasi yang meningkat dan bukannya selepas ia berlaku. Pendekatan risk-parity dan hierarki — saluran paip HRP + CVaR — lebih sensitif lagi kepada input kovarians, kerana keseluruhan peruntukan adalah fungsi matriks risiko. Dan jika anda membandingkan pengagih secara bersemuka, seperti dalam algoritma pengoptimuman portfolio dibandingkan, sama ada mereka menggunakan kovarians statik atau dinamik sering menjadi pemacu risiko terealisasi yang lebih besar berbanding pilihan algoritma.

Aplikasi langsung ialah volatility targeting keseluruhan portfolio: pilih vol tahunan sasaran σ\sigma^{*}, dan skalakan pendedahan kasar mengikut σ/σp,t\sigma^{*} / \sigma_{p,t} setiap tempoh supaya risiko terealisasi kekal lebih kurang konstan dan bukannya membengkak dalam krisis. Ini menutup gelung dengan Bahagian 4, yang membina dan mem-backtest peraturan ini secara tepat.

Aplikasi 3: Korelasi sebagai Isyarat Rejim

Selain lindung nilai dan sizing, matriks korelasi membawa isyarat makro. Skalar paling berguna yang boleh anda ekstrak ialah purata korelasi berpasangan:

ρˉt=2d(d1)i<jρij,t\bar{\rho}_t = \frac{2}{d(d-1)}\sum_{i < j} \rho_{ij,t}

Apabila ρˉt\bar{\rho}_t meningkat merentas buku, pasaran sedang memasuki rejim risk-off — cerita idiosinkratik berhenti bermakna dan segala-galanya berdagang sebagai satu beta makro. Ini adalah cap jari kuantitatif "korelasi menuju 1 dalam krisis." Ia cenderung mendahului atau berselari dengan drawdown, yang menjadikannya penunjuk rejim yang boleh digunakan dan bukan postmortem yang ketinggalan.

def avg_pairwise_corr(R_path, index=Z.index):
    T, d, _ = R_path.shape
    iu = np.triu_indices(d, k=1)          # upper-triangle off-diagonals
    avg = R_path[:, iu[0], iu[1]].mean(axis=1)
    return pd.Series(avg, index=index, name="avg_corr")

avg_corr = avg_pairwise_corr(R_path)

roll_q = avg_corr.rolling(365, min_periods=90).quantile(0.80)
risk_off = (avg_corr > roll_q)

Anda boleh menggunakan risk_off sebagai throttle berdiri sendiri (kurangkan pendedahan kasar, lebarkan stop, hentikan strategi kembali-ke-min yang akan tergilis apabila segala-galanya trend bersama) atau sebagai ciri dalam model rejim yang lebih formal. Ia sepadan secara semula jadi dengan pendekatan hidden-Markov dalam pengesanan rejim dengan HMM: purata korelasi DCC adalah salah satu pembolehubah pemerhatian yang lebih bermaklumat yang boleh anda berikan kepada HMM, kerana ia bersifat prospektif tentang tekanan sistemik dengan cara yang tidak dimiliki oleh pulangan tertinggal. Peringatan jujur: korelasi yang meningkat memberitahu anda diversifikasi sedang gagal, bukan ke arah mana pasaran akan bergerak. Ia adalah isyarat risiko, bukan isyarat alfa, dan harus disaizkan sedemikian — lihat asimetri kerugian dan keuntungan untuk memahami mengapa menganggap rejim risiko sebagai pertaruhan arah berakhir dengan buruk.

Pertimbangan Praktikal

Kestabilan penganggaran dan bilangan aset

DCC berskala jauh lebih baik daripada BEKK, tetapi "berskala" bukan bermakna "percuma." Matriks correlation-targeting Qˉ\bar{Q} adalah korelasi sampel d×dd \times d, dan matriks korelasi sampel menjadi ill-conditioned apabila dd menghampiri bilangan pemerhatian. Dengan 4 aset dan 1000 hari anda baik-baik sahaja. Dengan 60 aset dan 400 hari, Qˉ\bar{Q} hampir singular, songsangannya dalam likelihood meletup, dan RtR_t boleh mengembara menjadi bukan-PD akibat bunyi berangka. Mitigasi, secara kasar mengikut kekerapan anda akan memerlukannya:

  • Susutkan Qˉ\bar{Q} ke arah sasaran berstruktur (Ledoit-Wolf, atau ke arah identiti / matriks korelasi konstan) sebelum menjalankan rekursi. Ini adalah pembetulan paling berkesan untuk buku besar.
  • Kumpulkan aset ke dalam beberapa sektor (majors, L1s, DeFi, memes), modelkan dalam dan merentas peringkat sektor, atau jalankan DCC pada faktor komponen utama dan bukan aset mentah.
  • Utamakan lebih banyak data berbanding lebih banyak aset. DCC mempunyai selera yang tidak berpuas untuk sejarah yang panjang, bersih, dan serentak — yang tepat tidak dimiliki oleh token muda.

Secara realistik, kekalkan DCC terus kepada beberapa dozen aset sahaja. Untuk semesta yang besar, DCC pada pulangan faktor tambah reja idiosinkratik adalah penyelesaian standard.

Correlation targeting adalah jalan pintas dengan kos

Menyasarkan Qˉ\bar{Q} menjadikan penganggaran boleh diurus tetapi membakar korelasi tidak bersyarat sampel-penuh ke dalam setiap RtR_t. Dalam backtest yang ketat ini adalah kebocoran look-ahead: matriks korelasi hari-tt anda "tahu" purata korelasi keseluruhan sampel, termasuk masa depan. Untuk penilaian yang jujur anda mesti menganggarkan semula Qˉ\bar{Q} pada tetingkap latihan sahaja dan menetapkannya di luar-sampel, atau menggolekkannya ke hadapan. Ini adalah disiplin yang sama yang dikuatkuasakan oleh keseluruhan rangka kerja pengoptimuman walk-forward, dan ia mudah dilanggar secara tidak sengaja dengan np.cov(Z) yang mudah sepanjang array penuh — seperti yang dilakukan oleh kod pengajaran kita di atas. Betulkan sebelum anda mempercayai satu nombor P&L.

Kadar pemasangan semula dan disiplin look-ahead

Anda tidak perlu mengoptimumkan semula a,ba, b setiap hari — mereka adalah parameter yang stabil. Kadar produksi yang munasabah:

  • Anggarkan semula a,ba, b dan parameter GARCH univariat setiap minggu atau bulan.
  • Jalankan penapis (kemas kini QtQ_t, σi,t\sigma_{i,t}) setiap tempoh dengan parameter yang dibekukan untuk mendapatkan RtR_t dan HtH_t terkini. Penapisan adalah murah; pemasangan tidak.
  • Sentiasa ramalkan, jangan sekali-kali licinkan. Gunakan RtR_t yang dibina daripada maklumat hingga t1t-1 untuk berdagang pada tt. Struktur dua-laluan (pasang pada tetingkap, kemudian tapis ke hadapan) itulah yang mengekalkan anda jujur.

Jurang antara backtest DCC dan prestasi langsung hampir selalu adalah kebocoran look-ahead — Qˉ\bar{Q} sampel-penuh, βt\beta_t semasa, atau pemasangan semula pada data yang termasuk dagangan yang anda nilai. Disiplin memadankan backtest dengan keadaan langsung adalah topik tersendiri dalam parity backtest-langsung, dan DCC adalah model yang menghukum kecuaian di sini lebih daripada kebanyakan. Jika, selepas penilaian walk-forward yang bersih, korelasi dinamik tidak menambah apa-apa berbanding anggaran bergolek yang mudah untuk strategi anda, itu adalah keputusan negatif yang sebenar dan boleh diterbitkan — pemikiran dalam keputusan negatif yang jujur terpakai secara langsung.

DCC Asimetri (aDCC)

Sama seperti kesan leverage univariat (Bahagian 2) bermaksud berita buruk meningkatkan volatiliti lebih daripada berita baik, korelasi meningkat lebih banyak selepas kejutan negatif bersama berbanding selepas kejutan positif bersama. Cappiello, Engle & Sheppard (2006) menangkap ini dengan DCC asimetri, menambah term dipacu oleh hasil darab luar reja ternormal bahagian-negatif zt=min(zt,0)z_t^- = \min(z_t, 0):

Qt=(QˉaQˉbQˉgNˉ)+azt1zt1+gzt1zt1+bQt1Q_t = (\bar{Q} - a\bar{Q} - b\bar{Q} - g\bar{N}) + a\, z_{t-1} z_{t-1}' + g\, z_{t-1}^- z_{t-1}^{-\prime} + b\, Q_{t-1}

di mana Nˉ=1Ttztzt\bar{N} = \frac{1}{T}\sum_t z_t^- z_t^{-\prime} dan g0g \ge 0 mengukur tendangan korelasi tambahan daripada pergerakan draw bersama. Untuk kripto, di mana korelasi-crash adalah risiko dominan, term asimetri biasanya signifikan dan berbaloi dengan satu parameter tambahan. rmgarch memasang aDCC terus (model="aDCC"); menambah term ztz_t^- kepada penganggar NumPy kita adalah latihan yang mudah.

Perbandingan: DCC Berbanding Alternatif

Di mana DCC berdiri antara cara anda boleh mendapatkan matriks kovarians untuk buku kripto? Ringkasan yang jujur:

Pendekatan Parameter Berskala kepada ρ\rho Berubah Mengikut Masa? PD Terjamin? Ketergantungan Ekor?
Kovarians sampel / bergolek 0 (panjang tetingkap) mana-mana dd kasar (tertangguh, bising) tidak (perlu ditampal) tidak
EWMA (RiskMetrics) 1 (λ\lambda) mana-mana dd ya (satu pereputan) ya tidak
CCC-GARCH dd margin + Qˉ\bar{Q} dozen tidak (RR konstan) ya tidak
DCC-GARCH dd margin + 2 dozen ya ya tidak
aDCC-GARCH dd margin + 3 dozen ya, asimetri ya separa
BEKK O(d2)O(d^2) 4\le 4 ya (kaya) ya tidak
VECH O(d4)O(d^4) 3\le 3 ya (paling kaya) menyakitkan tidak
GARCH-copula dd margin + copula dozen (vines) copula statik ya ya

Beberapa bacaan jadual ini:

  • EWMA adalah asas murah yang harus dikalahkan oleh semua orang sebelum mendakwa DCC membantu. Ia adalah kes khas satu-parameter dari segi semangat — satu pereputan eksponen tunggal digunakan pada kovarians secara langsung — dan untuk banyak buku ia sukar dipertingkatkan secara mengejutkan di luar-sampel. Jika DCC tidak mengatasi EWMA dalam walk-forward yang bersih, gunakan EWMA.
  • CCC vs DCC adalah keseluruhan intipati artikel ini: pemfaktoran sama, tetapi CCC membekukan RR dan DCC membiarkannya bergerak. Dua parameter tambahan (a,ba, b) adalah keseluruhan perbezaan, dan dalam kripto mereka berbaloi dengan usaha mereka.
  • BEKK/VECH membeli dinamik yang lebih kaya — setiap kovarians boleh bertindak balas kepada setiap kejutan lepas — tetapi kos parameter mengehadkan mereka kepada buku kecil. Untuk lebih daripada 4 aset ia bukan pilihan sebenar.
  • GARCH-copula adalah satu-satunya baris dengan "ya" di bawah ketergantungan ekor. Itulah pelengkap semula: DCC memodelkan pusat dinamik taburan bersama, copula memodelkan ekor statiknya. Jika soalan risiko anda ialah "apa berlaku apabila segala-galanya runtuh sekaligus," rujuk saluran paip copula; jika ia "berapakah nisbah lindung nilai / varians portfolio saya sekarang," rujuk DCC.

Lalai praktikal untuk desk kripto sistematik: DCC (atau aDCC) untuk nisbah lindung nilai dan kovarians dinamik pada badan, overlay copula untuk risiko-ekor dan CVaR, dan EWMA sebagai asas pemeriksaan waras yang mengekalkan anda jujur tentang sama ada mesin tambahan itu berbaloi.

Batasan

  • Dinamik skalar. Satu aa dan satu bb untuk semua pasangan adalah sekatan yang kuat. BTC-ETH dan dua alt-coin yang jarang dikenali berkongsi kelajuan penyesuaian yang sama. Generalized DCC melonggarkan ini tetapi memperkenalkan semula letupan parameter yang DCC direka untuk mengelakkan.
  • Kehilangan kecekapan dua-langkah. Penganggar quasi-likelihood adalah konsisten tetapi tidak sepenuhnya cekap, dan ralat piawai naif adalah salah. Gunakan pembetulan Engle-Sheppard jika anda peduli tentang inferens; untuk penjanaan isyarat anggaran titik sudah memadai.
  • Ekor Gaussian secara lalai. Quasi-likelihood Gaussian biasa meremehkan risiko ekor bersama. Inovasi Student-t membantu; untuk ketergantungan ekor yang sebenar (kebarangkalian pergerakan ekstrem serentak), DCC adalah alat yang salah dan model copula adalah yang betul. DCC memberikan anda badan dinamik korelasi; copula memberikan anda ekor statik. Desk yang serius menggunakan kedua-duanya.
  • Korelasi bukan sebab-akibat, dan bukan arah. ρˉt\bar{\rho}_t yang meningkat memberi amaran bahawa diversifikasi sedang gagal; ia tidak memberitahu apa-apa tentang arah pasaran. Jangan bebankan isyarat risiko dengan jangkaan arah.
  • Kelaparan data. Segala-galanya di atas menganggap sejarah yang panjang, bersih, dan diselaraskan. Token kripto yang paling baru dan menarik melanggar ketiga-tiganya.

Ringkasan

  • Korelasi statik adalah pembohongan dalam kripto. Korelasi berkluster, berterusan, dan melonjak ke arah 1 dalam drawdown — tepat apabila diversifikasi sepatutnya membantu. Satu ρ^\hat{\rho} sampel memuratakan proses berganti-rejim menjadi purata yang tidak bermakna.
  • GARCH multivariat penuh (VECH, BEKK) tidak berskala. Bilangan parameter berkembang sebagai O(d2)O(d^2); kedua-duanya terhad kepada beberapa aset sahaja pada praktiknya.
  • DCC (Engle 2002) memfaktorkan masalah: Ht=DtRtDtH_t = D_t R_t D_t, dengan DtD_t daripada pemasangan GARCH univariat bebas (guna semula Bahagian 1-2) dan RtR_t daripada rekursi dua-parameter. Ia berskala kepada dozen aset kerana hanya a,ba, b yang dioptimumkan.
  • Rekursi Qt=(1ab)Qˉ+azt1zt1+bQt1Q_t = (1-a-b)\bar{Q} + a\,z_{t-1}z_{t-1}' + b\,Q_{t-1}, dinormalkan kepada RtR_t, menghasilkan matriks korelasi positive-definite yang sah pada setiap langkah, dengan a,b>0a,b>0, a+b<1a+b<1.
  • arch tidak melakukan DCC. Pasang margin dengan arch, kemudian laksanakan penganggar NumPy/SciPy ~60-baris di sini, atau gunakan mgarch (Python) atau rmgarch (R, rujukan).
  • Tiga ganjaran konkrit: nisbah lindung nilai dinamik βt=ρtσETH,t/σBTC,t\beta_t = \rho_t\,\sigma_{\text{ETH},t}/\sigma_{\text{BTC},t} untuk pairs trading; varians portfolio yang jujur dan berubah mengikut masa wHtww'H_t w untuk peruntukan berasaskan risiko; dan purata korelasi berpasangan sebagai isyarat rejim risk-off.
  • Disiplin adalah segala-galanya. Correlation targeting membocorkan purata sampel-penuh, jadi anggarkan semula Qˉ\bar{Q} pada data latihan sahaja; lat-kan setiap nisbah lindung nilai; tapis ke hadapan, jangan sekali-kali licinkan. Penilaian walk-forward tidak boleh dirunding.
  • aDCC menambah term asimetri-draw dan biasanya berbaloi dalam kripto, di mana korelasi-crash mendominasi.
  • Bahagian 4 menggunakan ramalan ini untuk membina dan mem-backtest strategi volatility-targeted.

Rujukan:

  • Engle, R. (2002). Dynamic Conditional Correlation: A Simple Class of Multivariate Generalized Autoregressive Conditional Heteroskedasticity Models. Journal of Business & Economic Statistics, 20(3), 339-350. DOI
  • Engle, R. & Sheppard, K. (2001). Theoretical and Empirical Properties of Dynamic Conditional Correlation Multivariate GARCH. NBER Working Paper 8554. DOI
  • Bollerslev, T. (1990). Modelling the Coherence in Short-Run Nominal Exchange Rates: A Multivariate Generalized ARCH Model. Review of Economics and Statistics, 72(3), 498-505. DOI
  • Cappiello, L., Engle, R., & Sheppard, K. (2006). Asymmetric Dynamics in the Correlations of Global Equity and Bond Returns. Journal of Financial Econometrics, 4(4), 537-572. DOI
  • Engle, R. & Kroner, K. (1995). Multivariate Simultaneous Generalized ARCH. Econometric Theory, 11(1), 122-150. DOI
  • Bollerslev, T., Engle, R., & Wooldridge, J. (1988). A Capital Asset Pricing Model with Time-Varying Covariances. Journal of Political Economy, 96(1), 116-131. DOI
  • Galanos, A. (2022). rmgarch: Multivariate GARCH Models. R package. CRAN.
Penafian: Maklumat yang disediakan dalam artikel ini adalah untuk tujuan pendidikan dan maklumat sahaja dan bukan merupakan nasihat kewangan, pelaburan, atau dagangan. Dagangan mata wang kripto melibatkan risiko kerugian yang ketara.

MarketMaker.cc Team

Penyelidikan & Strategi Kuantitatif

Bincang di Telegram
Newsletter

Kekal Mendahului Pasaran

Langgan surat berita kami untuk pandangan dagangan AI eksklusif, analisis pasaran, dan kemas kini platform.

Kami menghormati privasi anda. Berhenti melanggan pada bila-bila masa.