← Макалаларга кайтуу
March 30, 2026
5 мүн окуу

Крипто портфелдериндеги биргелешкен тобокелдикти моделдөө үчүн копула моделдери

Крипто портфелдериндеги биргелешкен тобокелдикти моделдөө үчүн копула моделдери
#risk
#copula
#portfolio
#tail-dependence
#VaR
📊
Part 4 of 5 · Collection
Portfolio Construction & Risk

Копула моделдери — биргелешкен тобокелдик бөлүштүрүлүшү

Корреляция — көпчүлүк портфель менеджерлери диверсификацияны баалоодо биринчи кайрылган курал. Бирок крипто рыноктордо корреляция кооптуу түрдө адаштырат. Эки токен тынч рыноктордо 0.3 Пирсон корреляциясын көрсөтүшү мүмкүн, кризис учурунда болсо ал 0.95ке чейин секирет. Сызыктуу корреляция эллиптикалык бөлүштүрүүлөрдү болжолдойт — бул божомол криптовалюта кирешелерине мүнөздүү оор куйруктар менен асимметриялуу көз карандылык структураларынын алдында кыйрайт.

Копула моделдери муну чектик жүрүм-турумду (ар бир актив жеке кандай жүрөрүн) көз карандылык структурасынан (активдер бирге кандай кыймылдарын) бөлүү аркылуу чечет. Склар теоремасына негизделген бул бөлүнүү бизге портфель кирешелеринин толук биргелешкен бөлүштүрүлүшүн — тобокелдик чындыгында жашаган куйруктарды кошо алганда — моделдөө үчүн ийкемдүү негиз берет.

Сызыктуу корреляция эмне үчүн крипто үчүн иштебейт

BTC, ETH, SOL жана AVAX портфелин карап көрөлү. 2022-жылдын майында Terra/Luna кулашы учурунда бул активдердин ортосундагы корреляциялар 1.0го жакындашты, дал ошондо диверсификация эң керек болгон учурда. Туруктуу корреляцияларды божомолдогон орточо-дисперсия оптимизатору портфель тобокелдигин олуттуу түрдө төмөн баалаган болмок.

Пирсон корреляциясынын крипто үчүн негизги көйгөйлөрү:

  1. Эллиптикалык эмес бөлүштүрүүлөр. Крипто кирешелери олуттуу асимметрия жана эксцесс көрсөтөт. BTC күндөлүк кирешелери көбүнчө 10дон жогору эксцесс маанилерин көрсөтөт (нормалдуу бөлүштүрүү: 3).
  2. Асимметриялуу көз карандылык. Активдер өсүү мезгилдерине караганда кулаган мезгилде көбүрөөк корреляцияланат. Бул "корреляциянын бузулушу" көрүнүшү акциялар рыногунда жакшы документтелген жана криптодо андан да айкын байкалат.
  3. Куйрук көз карандылыгы. Эки активдин бир учурда экстремалдуу жоготууга дуушар болуу ыктымалдыгы сызыктуу корреляция менен чагылдырылбайт. Корреляциясы бирдей, бирок куйрук көз карандылыгы такыр башка эки актив болушу мүмкүн.

Склар теоремасы: негиз

Склар теоремасы (1959) каалаган көп өлчөмдүү биргелешкен бөлүштүрүү F(x1,x2,,xd)F(x_1, x_2, \ldots, x_d) төмөнкүчө ажыратылышы мүмкүн экенин айтат:

F(x1,x2,,xd)=C(F1(x1),F2(x2),,Fd(xd))F(x_1, x_2, \ldots, x_d) = C\bigl(F_1(x_1), F_2(x_2), \ldots, F_d(x_d)\bigr)

мында FiF_i — чектик бөлүштүрүү функциялары, C:[0,1]d[0,1]C: [0,1]^d \to [0,1] болсо — өзгөрмөлөрдүн ортосундагы бүткүл көз карандылык структурасын коддогон копула.

Тескерисинче, чектик бөлүштүрүүлөр үзгүлтүксүз болсо, копула CC уникалдуу болот.

Бул ажыратуу күчтүү, анткени ал бизге мүмкүндүк берет:

  • Ар бир активдин чектик бөлүштүрүлүшүн өзүнчө моделдөө (GARCH, EVT же ылайыктуу башка бөлүштүрүүлөрдү колдонуп)
  • Көз карандылык структурасын копула аркылуу көз каранды эмес моделдөө
  • Толук биргелешкен бөлүштүрүүнү алуу үчүн аларды бириктирүү

Биргелешкен бөлүштүрүүнүн тыгыздыгы төмөнкүчө көбөйтүлөт:

f(x1,,xd)=c(F1(x1),,Fd(xd))i=1dfi(xi)f(x_1, \ldots, x_d) = c\bigl(F_1(x_1), \ldots, F_d(x_d)\bigr) \cdot \prod_{i=1}^{d} f_i(x_i)

мында cc — копула тыгыздыгы, fif_i — чектик тыгыздыктар.

Копула үй-бүлөлөрү жана алардын касиеттери

Копула үй-бүлөлөрү боюнча куйрук көз карандылыгын салыштыруу

Гаусс копуласы

Гаусс копуласы корреляция матрицасы Σ\Sigma менен параметрленет:

CΣGauss(u1,,ud)=ΦΣ(Φ1(u1),,Φ1(ud))C_{\Sigma}^{\text{Gauss}}(u_1, \ldots, u_d) = \Phi_{\Sigma}\bigl(\Phi^{-1}(u_1), \ldots, \Phi^{-1}(u_d)\bigr)

мында ΦΣ\Phi_{\Sigma} — көп өлчөмдүү нормалдуу CDF, Φ1\Phi^{-1} болсо — бир өлчөмдүү нормалдуу квантиль функциясы.

Куйрук көз карандылыгы: λL=λU=0\lambda_L = \lambda_U = 0 (ρ<1\rho < 1 үчүн).

Гаусс копуласынын куйрук көз карандылыгы нөлгө барабар — ал биргелешкен экстремалдуу окуялардын ыктымалдыгын системалуу түрдө төмөн баалайт. Бул 2008-жылга чейин CDOлорду туура эмес баалоонун негизги фактору болгон, крипто тобокелдигин моделдөө үчүн да ошончолук коркунучтуу.

Стьюдент t-копуласы

t-копула эркиндик даражасынын параметри ν\nu аркылуу симметриялуу куйрук көз карандылыгын киргизет:

Cν,Σt(u1,,ud)=tν,Σ(tν1(u1),,tν1(ud))C_{\nu, \Sigma}^{t}(u_1, \ldots, u_d) = t_{\nu, \Sigma}\bigl(t_{\nu}^{-1}(u_1), \ldots, t_{\nu}^{-1}(u_d)\bigr)

Куйрук көз карандылыгы:

λL=λU=2tν+1((ν+1)(1ρ)1+ρ)\lambda_L = \lambda_U = 2 \cdot t_{\nu+1}\left(-\sqrt{\frac{(\nu+1)(1-\rho)}{1+\rho}}\right)

ν=4\nu = 4 жана ρ=0.5\rho = 0.5 үчүн бул λ0.18\lambda \approx 0.18 берет — эки активдин тең өзүнүн эң начар квантилинде бир учурда болуу ыктымалдыгы 18%. Төмөн ν\nu (оор куйруктар) бул ыктымалдыкты жогорулатат. Май куйруктуу кирешелери бар крипто рыноктору көбүнчө 3-8 диапазонундагы ν\nu талап кылат.

t-копула Гаусс копуласынан олуттуу жакшыраак, бирок ал симметриялуу куйрук көз карандылыгын (λL=λU\lambda_L = \lambda_U) талап кылат. Практикада крипто активдер жогорку куйрук көз карандылыгына (бирге өсүү) караганда төмөнкү куйрук көз карандылыгын (бирге кулоо) көбүрөөк көрсөтөт.

Клейтон копуласы

Клейтон копуласы төмөнкү куйрук көз карандылыгын чагылдырат — бул дал крипто рыногунда байкалган асимметриялуу кулоо-кластерлешүү жүрүм-туруму:

CθClayton(u1,u2)=(u1θ+u2θ1)1/θ,θ>0C_{\theta}^{\text{Clayton}}(u_1, u_2) = \left(u_1^{-\theta} + u_2^{-\theta} - 1\right)^{-1/\theta}, \quad \theta > 0

Куйрук көз карандылыгы: λL=21/θ\lambda_L = 2^{-1/\theta}, λU=0\lambda_U = 0.

θ\theta өскөн сайын, төмөнкү куйрук көз карандылыгы күчөйт. θ=2\theta = 2 үчүн λL0.71\lambda_L \approx 0.71 — биргелешкен экстремалдуу жоготуулардын өтө жогорку ыктымалдыгы.

Гумбель копуласы

Гумбель копуласы күзгүдөгү сүрөт сыяктуу — ал жогорку куйрук көз карандылыгын чагылдырат:

CθGumbel(u1,u2)=exp([(lnu1)θ+(lnu2)θ]1/θ),θ1C_{\theta}^{\text{Gumbel}}(u_1, u_2) = \exp\left(-\left[(-\ln u_1)^{\theta} + (-\ln u_2)^{\theta}\right]^{1/\theta}\right), \quad \theta \geq 1

Куйрук көз карандылыгы: λL=0\lambda_L = 0, λU=221/θ\lambda_U = 2 - 2^{1/\theta}.

Франк копуласы

Франк копуласынын эки куйругунда тең көз карандылыгы нөлгө барабар (λL=λU=0\lambda_L = \lambda_U = 0), бул аны куйрук эффекттерисиз бөлүштүрүүнүн негизги бөлүгүндөгү көз карандылыкты моделдөө үчүн ылайыктуу кылат:

CθFrank(u1,u2)=1θln(1+(eθu11)(eθu21)eθ1)C_{\theta}^{\text{Frank}}(u_1, u_2) = -\frac{1}{\theta}\ln\left(1 + \frac{(e^{-\theta u_1}-1)(e^{-\theta u_2}-1)}{e^{-\theta}-1}\right)

Крипто үчүн туура копуланы тандоо

Крипто портфелдери үчүн эмпирикалык далилдер төмөнкүлөрдү көрсөтөт:

  • Төмөнкү куйрук көз карандылыгы үчүн Клейтон же буралган Гумбель (survival Gumbel) — кулоо жугуштуулугун чагылдыруу
  • Симметриялуу куйрук көз карандылыгы кабыл алынгыс болгондо ишенимдүү жалпы максаттагы тандоо катары t-копула
  • Өсүү фазаларында күчтүү жогорку куйрук көз карандылыгын чагылдыруу үчүн Джо копуласы

Bruhn жана Jeleskovic (2024) изилдөөсү GARCH-копула моделдери, өзгөчө Стьюдент t чектик бөлүштүрүүлөрүн t-копулалар менен колдонгондор, крипто рыногундагы кулоо (2022), калыбына келүү (2023) жана туруктуулук (2024) шарттарында орточо-дисперсия жана тарыхый CVaR ыкмаларынан туруктуу түрдө жогору иштеерин аныктады.

Өлчөмдүүлүк каргышы: Vine копулалары кирет

Крипто портфель үчүн vine копула дарак структурасы

Стандарттуу көп өлчөмдүү копулалар (Гаусс, t-копула) жогорку өлчөмдөргө масштабдалат, бирок чектөөчү божомолдорду талап кылат. Архимед копулалары (Клейтон, Гумбель, Франк) табигый түрдө эки өлчөмдүү — аларды d>2d > 2 өлчөмдөрүнө кеңейтүү бардык жуптардын бирдей көз карандылык параметрин бөлүшүүсүн талап кылат, бул чындыкка дал келбейт.

Vine копулалары dd-өлчөмдүү копуланы дарак структурасына жайгаштырылган эки өлчөмдүү копулалардын каскадына ажыратуу аркылуу муну чечет. Өзгөрмөлөрдүн ар бир жубу (башкаларга шартталган) өзүнүн эки өлчөмдүү копула үй-бүлөсүн жана параметрин алат.

Жуп-копула конструкциясы

dd-өлчөмдүү тыгыздык үчүн vine копула ажыратуусу:

f(x1,,xd)=i=1dfi(xi)j=1d1i=1djci,i+ji+1,,i+j1f(x_1, \ldots, x_d) = \prod_{i=1}^{d} f_i(x_i) \cdot \prod_{j=1}^{d-1}\prod_{i=1}^{d-j} c_{i,i+j|i+1,\ldots,i+j-1}

мында ci,jSc_{i,j|S}SS жыйындысына шартталган ii жана jj өзгөрмөлөрү үчүн эки өлчөмдүү копула тыгыздыгы.

dd-өлчөмдүү vine копуласы (d2)=d(d1)/2\binom{d}{2} = d(d-1)/2 эки өлчөмдүү копуланы талап кылат. 10 активдүү крипто портфели үчүн бул — 45 жуп копула, ар бири башка үй-бүлөдөн болушу мүмкүн.

Vine структуралары: C-vine, D-vine, R-vine

C-vine (каноникалык vine): Ар бир даракта бардык башка түйүндөр менен байланышкан бир тамыр түйүн бар. Бир өзгөрмө үстөмдүк кылганда жакшы — мисалы, рынок айдоочусу катары BTC.

Tree 1:    BTC --- ETH
           BTC --- SOL
           BTC --- AVAX
           BTC --- DOT

Tree 2:    ETH|BTC --- SOL|BTC
           ETH|BTC --- AVAX|BTC
           ETH|BTC --- DOT|BTC

D-vine (сызылуучу vine): Ырааттуу жол структурасы. Өзгөрмөлөрдө табигый тартип болгондо жакшы (мисалы, рыноктук капитализация же сектор боюнча).

R-vine (тегерек vine): Эң жалпы структура — каалаган жарактуу дарак ырааттуулугу. R-vine C-vine жана D-vine экөөнү тең камтыйт.

Криптовалюта портфелдери боюнча изилдөөлөр D-vine структуралары көбүнчө крипто активдер үчүн C-vine жана R-vineге караганда жогору VaR божомолдорун бериерин көрсөтөт, бирок бул конкреттүү портфель курамына жараша болот.

Vine копулалары эмне үчүн крипто үчүн маанилүү

Бир Клейтон копуласы менен моделдешкен 8 крипто активинен турган портфель бардык 28 жупту бирдей θ\theta бөлүшүүгө мажбур кылат. Бирок BTC-ETH θClayton=3.5\theta_{\text{Clayton}} = 3.5 (күчтүү кулоо көз карандылыгы) болушу мүмкүн, SOL-AVAX болсо θ=1.2\theta = 1.2 (орточо) болушу мүмкүн. Vine копулалары ар бир жупка өзүнүн көз карандылык структурасын билдирүүгө мүмкүндүк берет:

  • BTC-ETH: t-копула (ν=4\nu=4, ρ=0.72\rho=0.72)
  • BTC-SOL: Клейтон (θ=2.1\theta=2.1)
  • ETH-AVAX: Франк (θ=5.3\theta=5.3)
  • SOL-DOT | BTC: Гумбель (θ=1.8\theta=1.8)

Бул ийкемдүүлүк так портфель тобокелдигин баалоо үчүн абдан маанилүү.

Чектик бөлүштүрүүлөрдү моделдөө: GARCH-EVT

Копуланы ыңгайлаштыруудан мурун, биз ар бир активдин киреше сериясын бирдей [0,1][0,1] өзгөрмөлөргө айландырышыбыз керек ("ыктымалдык интегралдык трансформация"). Стандарттуу конвейер:

  1. Убакыт боюнча өзгөрүп туруучу туруксуздукту чагылдыруу үчүн ар бир активдин киреше сериясына GARCH моделин ыңгайлаштыруу
  2. Стандартташтырылган калдыктарды алуу zt=(rtμt)/σtz_t = (r_t - \mu_t) / \sigma_t
  3. Экстремалдуу маани теориясын (EVT) колдонуп куйруктарды ыңгайлаштыруу — так айтканда, чектен (адатта 5- жана 95-процентилдер) тышкары жогорку жана төмөнкү куйруктар үчүн жалпыланган Парето бөлүштүрүлүшү (GPD)
  4. Бөлүштүрүлүштүн негизги бөлүгү үчүн эмпирикалык CDFди колдонуу
  5. Псевдо-бирдей байкоолорду алуу үчүн ыктымалдык интегралдык трансформацияны колдонуу ui,t=F^i(zi,t)u_{i,t} = \hat{F}_i(z_{i,t})

Бул GARCH-EVT ыкмасы көбүнчө "жарым-параметрдик" ыкма деп аталат. Ал туура чагылдырат:

  • Туруксуздук кластерлешүүсү (GARCH)
  • Оор куйруктар (EVTден GPD)
  • Бөлүштүрүлүштүн жалпы формасы (негизги бөлүк үчүн эмпирикалык CDF)

Крипто активдер үчүн Стьюдент t инновациялары менен EGARCH(1,1) же GJR-GARCH(1,1) модели жакшы иштейт, анткени ал асимметриялуу туруксуздук реакциясын чагылдырат (жаман кабарлар жакшы кабарларга караганда туруксуздукту көбүрөөк жогорулатат).

Копулалар менен портфель VaR жана CVaR

Тобокелдик наркы (VaR)

α\alpha ишеним деңгээлиндеги портфель VaR:

VaRα=inf{l:P(Ll)α}\text{VaR}_\alpha = \inf\{ l : P(L \leq l) \geq \alpha \}

мында LL — портфель жоготуусу. Копулалар менен VaRды Монте-Карло аркылуу баалайбыз:

  1. Ыңгайлаштырылган vine копуласынан NN үлгүнү моделдөө (бирдей мейкиндикте)
  2. Тескери чектик CDFлерди колдонуп киреше мейкиндигине кайра айландыруу
  3. Портфель кирешелерин эсептөө: rp=iwirir_p = \sum_i w_i \cdot r_i
  4. VaR — моделделген портфель жоготуу бөлүштүрүлүшүнүн α\alpha-квантили

Шарттуу тобокелдик наркы (CVaR / Күтүлгөн жетишсиздик)

CVaR — жоготуу VaRдан ашканын эске алуу менен күтүлгөн жоготуу:

CVaRα=E[LLVaRα]=11αα1VaRudu\text{CVaR}_\alpha = E[L \mid L \geq \text{VaR}_\alpha] = \frac{1}{1-\alpha}\int_{\alpha}^{1}\text{VaR}_u\, du

CVaR когерентт (субаддитивдикти канааттандырат), бул аны портфелди оптималдаштыруу үчүн VaRдан жогору кылат. Монте-Карло баалоосу жөнөкөй — VaRдан ашкан жоготуулардын орточосун алуу.

Копулага негизделген тобокелдик эмне үчүн корреляцияга негизделген тобокелдиктен жакшыраак

Жуптук корреляциясы бирдей 0.5 болгон эки портфелди карап көрөлү:

  • Портфель A: Гаусс копула көз карандылыгы (куйрук көз карандылыгы жок)
  • Портфель B: Клейтон копула көз карандылыгы (θ=2\theta = 2, λL=0.71\lambda_L = 0.71)

99% ишеним деңгээлинде Портфель Bде VaR жана CVaR олуттуу жогору болот, анткени Клейтон копуласы активдердин бирге кулоо тенденциясын туура моделдейт. Гаусс копуласы экстремалдуу биргелешкен кыймылдар өтө сейрек деп божомолдоп бул тобокелдикти төмөн баалайт.

Крипто портфелдери боюнча эмпирикалык изилдөөлөрдө Гаусс жана vine копула моделдеринин ортосундагы 99% CVaR айырмасы 30-40%дан ашышы мүмкүн, б.а. корреляцияга негизделген моделдер куйрук тобокелдигин үчтөн бирден же андан да көп төмөн баалашы мүмкүн.

Ишке ашыруу: pyvinecopulib аркылуу Python

Крипто кирешелерине vine копуласын ыңгайлаштыруу жана портфель VaR/CVaRды баалоо үчүн бул жерде толук конвейер берилген.

1-кадам: Маалыматтарды даярдоо жана чектик ыңгайлаштыруу

import numpy as np
import pandas as pd
from arch import arch_model
from scipy import stats
import pyvinecopulib as pv

def fetch_crypto_returns(symbols, start="2023-01-01", end="2025-12-31"):
    """
    Fetch daily returns for a list of crypto symbols.
    Replace with your data source (ccxt, yfinance, etc.)
    """
    import yfinance as yf
    prices = yf.download(
        [f"{s}-USD" for s in symbols],
        start=start, end=end
    )["Close"]
    prices.columns = symbols
    returns = np.log(prices / prices.shift(1)).dropna()
    return returns

symbols = ["BTC", "ETH", "SOL", "AVAX", "DOT", "LINK", "MATIC", "ATOM"]
returns = fetch_crypto_returns(symbols)

def fit_garch_marginal(series, dist="t"):
    """
    Fit GJR-GARCH(1,1) with Student-t innovations.
    Returns standardized residuals and the fitted model.
    """
    model = arch_model(
        series * 100,  # scale for numerical stability
        vol="GARCH",
        p=1, o=1, q=1,  # GJR-GARCH
        dist=dist,
        mean="AR",
        lags=1
    )
    result = model.fit(disp="off")
    std_resid = result.std_resid.dropna()
    return std_resid, result

residuals = {}
garch_models = {}
for sym in symbols:
    std_resid, model = fit_garch_marginal(returns[sym])
    residuals[sym] = std_resid
    garch_models[sym] = model

residuals_df = pd.DataFrame(residuals).dropna()

2-кадам: Ыктымалдык интегралдык трансформация

def semi_parametric_pit(residuals, tail_threshold=0.05):
    """
    Semi-parametric probability integral transform:
    - GPD for tails beyond threshold
    - Empirical CDF for the body
    Returns pseudo-uniform observations in [0, 1].
    """
    n = len(residuals)
    u = np.zeros(n)
    sorted_resid = np.sort(residuals)

    lower_thresh = np.quantile(residuals, tail_threshold)
    upper_thresh = np.quantile(residuals, 1 - tail_threshold)

    for i, x in enumerate(residuals):
        if x <= lower_thresh:
            lower_exceedances = -(residuals[residuals <= lower_thresh] - lower_thresh)
            shape, _, scale = stats.genpareto.fit(lower_exceedances, floc=0)
            u[i] = tail_threshold * (
                1 - stats.genpareto.cdf(-(x - lower_thresh), shape, scale=scale)
            )
        elif x >= upper_thresh:
            upper_exceedances = residuals[residuals >= upper_thresh] - upper_thresh
            shape, _, scale = stats.genpareto.fit(upper_exceedances, floc=0)
            u[i] = 1 - tail_threshold * (
                1 - stats.genpareto.cdf(x - upper_thresh, shape, scale=scale)
            )
        else:
            u[i] = np.mean(residuals <= x)

    u = np.clip(u, 1e-6, 1 - 1e-6)
    return u

U = np.column_stack([
    semi_parametric_pit(residuals_df[sym].values)
    for sym in symbols
])

3-кадам: Vine копуласын ыңгайлаштыруу

controls = pv.FitControlsVinecop(
    family_set=[
        pv.BicopFamily.student,
        pv.BicopFamily.clayton,
        pv.BicopFamily.gumbel,
        pv.BicopFamily.frank,
        pv.BicopFamily.joe,
        pv.BicopFamily.bb1,       # Clayton-Gumbel mixture
        pv.BicopFamily.bb7,       # Joe-Clayton mixture
        pv.BicopFamily.gaussian,
    ],
    selection_criterion="bic",    # BIC for model selection
    tree_criterion="tau",          # Kendall's tau for tree structure
    nonparametric_method="constant",
    trunc_lvl=5,                   # Truncate after 5 trees
)

vine = pv.Vinecop(U, controls=controls)

print(f"Log-likelihood: {vine.loglik(U):.2f}")
print(f"AIC: {vine.aic(U):.2f}")
print(f"BIC: {vine.bic(U):.2f}")

for i in range(vine.order.shape[0] - 1):
    pair = vine.get_pair_copula(0, i)
    print(f"Tree 1, Edge {i}: {pair.family} "
          f"(params: {pair.parameters})")

4-кадам: Монте-Карло VaR жана CVaR

def estimate_var_cvar(vine, garch_models, symbols, weights,
                       n_sim=50_000, alpha=0.99, seed=42):
    """
    Estimate portfolio VaR and CVaR using Monte Carlo simulation
    from the fitted vine copula.
    """
    U_sim = vine.simulate(n=n_sim, seeds=[seed])

    returns_sim = np.zeros((n_sim, len(symbols)))
    for j, sym in enumerate(symbols):
        model = garch_models[sym]
        forecasts = model.forecast(horizon=1)
        mu = forecasts.mean.iloc[-1, 0] / 100  # unscale
        sigma = np.sqrt(forecasts.variance.iloc[-1, 0]) / 100

        nu = model.params.get("nu", 5)
        z_sim = stats.t.ppf(U_sim[:, j], df=nu)
        returns_sim[:, j] = mu + sigma * z_sim

    weights = np.array(weights)
    portfolio_returns = returns_sim @ weights

    losses = -portfolio_returns

    var = np.quantile(losses, alpha)

    cvar = np.mean(losses[losses >= var])

    return var, cvar, portfolio_returns

weights = [1.0 / len(symbols)] * len(symbols)

var_99, cvar_99, sim_returns = estimate_var_cvar(
    vine, garch_models, symbols, weights,
    n_sim=100_000, alpha=0.99
)

print(f"1-day 99% VaR:  {var_99*100:.2f}%")
print(f"1-day 99% CVaR: {cvar_99*100:.2f}%")

from scipy.stats import norm
mu_p = sim_returns.mean()
sigma_p = sim_returns.std()
var_gauss = -(mu_p + sigma_p * norm.ppf(0.01))
print(f"\nGaussian VaR:   {var_gauss*100:.2f}%")
print(f"Copula/Gaussian ratio: {var_99/var_gauss:.2f}x")

5-кадам: Куйрук көз карандылыгын талдоо

def compute_tail_dependence(vine, symbols):
    """
    Extract lower and upper tail dependence coefficients
    from the first tree of the vine copula.
    """
    results = []
    order = vine.order
    n_edges = order.shape[0] - 1

    for i in range(n_edges):
        pair = vine.get_pair_copula(0, i)
        u_pair = pair.simulate(n=100_000, seeds=[42])
        q = 0.01  # 1st percentile

        mask_lower = (u_pair[:, 0] <= q)
        lambda_L = np.mean(u_pair[mask_lower, 1] <= q) if mask_lower.sum() > 0 else 0

        mask_upper = (u_pair[:, 0] >= 1 - q)
        lambda_U = np.mean(u_pair[mask_upper, 1] >= 1 - q) if mask_upper.sum() > 0 else 0

        i_idx = order[0]
        j_idx = order[i + 1]
        results.append({
            "pair": f"{symbols[i_idx]}-{symbols[j_idx]}",
            "family": str(pair.family),
            "lambda_L": round(lambda_L, 4),
            "lambda_U": round(lambda_U, 4),
        })

    return pd.DataFrame(results)

tail_dep = compute_tail_dependence(vine, symbols)
print(tail_dep.to_string(index=False))

Крипто портфели үчүн типтүү жыйынтык мындай көрүнүшү мүмкүн:

Pair Family λL\lambda_L λU\lambda_U
BTC-ETH student 0.22 0.22
BTC-SOL clayton 0.35 0.00
BTC-AVAX bb7 0.28 0.12
BTC-DOT student 0.18 0.18
BTC-LINK clayton 0.31 0.00
BTC-MATIC frank 0.00 0.00
BTC-ATOM gumbel 0.00 0.15

Ар бир жуптун такыр башка көз карандылык структурасы болушу мүмкүн экенине көңүл буруңуз. BTC-SOL жогорку куйрук көз карандылыгы нөлгө барабар болгон күчтүү төмөнкү куйрук көз карандылыгын (Клейтон) көрсөтөт — алар бирге кулайт, бирок сөзсүз түрдө бирге өспөйт. BTC-MATIC эч кандай куйрук көз карандылыгын көрсөтпөйт (Франк), бул экстремалдуу шарттарда да белгилүү бир диверсификация пайдасын билдирет.

Копула VaR моделин артка тестирлөө

VaR модели жакшы калибрленген болсо гана пайдалуу. Стандарттуу артка тест VaR бузууларын эсептейт — реалдуу жоготуу болжолдонгон VaRдан ашкан күндөр — жана бузуу жыштыгынын күтүлгөн жыштыкка дал келерин текшерет.

def backtest_var(returns, symbols, weights, window=500,
                 alpha=0.99, n_sim=20_000):
    """
    Rolling-window VaR backtest using vine copula.
    """
    violations = []
    var_series = []
    T = len(returns)

    for t in range(window, T):
        window_returns = returns.iloc[t-window:t]

        U_window = np.zeros((window, len(symbols)))
        models_t = {}
        for j, sym in enumerate(symbols):
            std_resid, model = fit_garch_marginal(window_returns[sym])
            models_t[sym] = model
            u = pv.to_pseudo_obs(std_resid.values.reshape(-1, 1))
            U_window[:len(u), j] = u.ravel()

        U_clean = U_window[~np.any(U_window == 0, axis=1)]
        vine_t = pv.Vinecop(U_clean, controls=controls)

        var_t, _, _ = estimate_var_cvar(
            vine_t, models_t, symbols, weights,
            n_sim=n_sim, alpha=alpha
        )
        var_series.append(var_t)

        actual_return = (returns.iloc[t][symbols].values
                         * np.array(weights)).sum()
        violations.append(-actual_return > var_t)

    violation_rate = np.mean(violations)
    expected_rate = 1 - alpha
    print(f"Expected violation rate: {expected_rate:.4f}")
    print(f"Actual violation rate:   {violation_rate:.4f}")
    print(f"Number of violations:    {sum(violations)} / {len(violations)}")

    return violations, var_series

Жакшы калибрленген 99% VaR моделинин бузуу жыштыгы 1%ге жакын болушу керек. Эгер жыштык олуттуу жогору болсо, модель тобокелдикти төмөн баалайт. Эгер олуттуу төмөн болсо, ал өтө консервативдүү.

Практикалык ой жүгүртүүлөр

Эсептөө наркы

Vine копуласын ыңгайлаштыруу дарак деңгээли боюнча O(d2n)O(d^2 \cdot n) түзөт. 500 күндүк роллинг терезеси бар 10 активдүү портфель үчүн, ар бир кадамда 50,000 Монте-Карло моделдөөсү менен толук артка тест сааттарды алышы мүмкүн. Муну башкаруу стратегиялары:

  • Кыскартылган vine: trunc_lvl=3 же trunc_lvl=4 коюу — жогорку даракттар тобокелдикке аз үлүш кошкон алсыз шарттуу көз карандылыктарды чагылдырат
  • Азайтылган моделдөө саны: 99% VaR үчүн көбүнчө 10,000-20,000 моделдөө жетиштүү
  • Параллелдик эсептөө: Ар бир актив үчүн GARCH ыңгайлаштыруулары көз каранды эмес жана параллелдештирилиши мүмкүн
  • Модель кэштөө: Копуланы күн сайын эмес, жума сайын кайра ыңгайлаштырып, GARCH божомолдорун гана жаңыртуу

Режимди сезүү

Крипто рыноктору так режимдерди көрсөтөт (бул, аюу, каптал, жогорку туруксуздук окуялары). Бүткүл үлгүгө ыңгайлаштырылган жалгыз vine копуласы режимге көз каранды болгон көз карандылыкты чагылдыра албашы мүмкүн. Төмөнкүлөрдү карап көрүңүз:

  • 250-500 күндүк роллинг терезелер
  • Копула параметрлери жашыруун Марков абалына көз каранды болгон режим алмаштыруучу копулалар
  • Акыркы маалыматтарга көбүрөөк салмак берген экспоненциалдуу салмактанган байкоолор

Кеңири таралган каталар

  1. PITти унутуу. Псевдо-бирдей байкоолордун ордуна чийки кирешелерди түз копулага берүү маанисиз натыйжаларды берет. Ар дайым адегенде бирдей четтерге айландырыңыз.
  2. Өтө көп үй-бүлөлөр менен ашыкча ыңгайлаштыруу. Тандоо жыйындысына мүмкүн болгон ар бир эки өлчөмдүү үй-бүлөнү кошуу ашыкча ыңгайлаштырууга алып келиши мүмкүн, өзгөчө кыска үлгүлөрдө. Модель тандоо үчүн BICди колдонуңуз жана 4-5 үй-бүлө менен чектөөнү карап көрүңүз.
  3. Ырааттуу көз карандылыкты этибарга албоо. Копулалар бир убакыт чекитинде туурасынан кесилген көз карандылыкты моделдейт. Эгер GARCH кадамын өткөрүп жиберип, автокорреляцияланган кирешелерди копулага берсеңиз, бааланган көз карандылык ырааттуу эффекттер менен булганат.
  4. Динамикалык рыноктордогу статикалык копулалар. 2021 бул рынок маалыматтарына ыңгайлаштырылган копула 2022 кулашы үчүн начар калибрленген болот. Ар дайым роллинг же кеңейтилүүчү терезелерди колдонуңуз.

Корутунду

Копула моделдери — өзгөчө vine копулалары — сызыктуу корреляция чагылдыра ала турган нерседен алда канча ары кете турган крипто портфелдердин биргелешкен тобокелдигин моделдөө үчүн математикалык жактан катуу негиз берет. Негизги артыкчылыктар:

  • Склар теоремасы аркылуу чектик жана көз карандылык моделдөөсүн бөлүү
  • Тийиштүү копула үй-бүлөсүн тандоо аркылуу ийкемдүү куйрук көз карандылыгы (кулоо жугуштуулугу үчүн Клейтон, өсүү биргелешкен кыймылы үчүн Гумбель, симметриялуу куйруктар үчүн t-копула)
  • Vine копула ажыратуусу аркылуу жогорку өлчөмдүү масштабдуулук, мында активдердин ар бир жубу өзүнүн эки өлчөмдүү копуласын алат
  • Сызыктуу эмес, асимметриялуу көз карандылыкты эске алган так VaR/CVaR баалоо — "баары бирге кулайт" эрежеден тышкары эмес, норма болгон рыноктогу тобокелдик менеджменти үчүн маанилүү

GARCH-EVT-Копула конвейери азыр сандык хедж фонддорунда жана крипто багытталган тобокелдик столдорунда стандарттуу ыкма болуп саналат. pyvinecopulib сыяктуу китепканалар менен ишке ашыруу тоскоолдугу ошончолук төмөн, каалаган системалуу трейдер копулага негизделген тобокелдик моделдөөнү өзүнүн портфелди башкаруу жумуш агымына бириктире алат.

Бул макаладагы код иштеп турган баштапкы чекитти сунуштайт. Өндүрүштүк колдонуу үчүн сиз GARCH тартибин тандоо үчүн тийиштүү кайчылаш валидацияны, татаалыраак чектик моделдерди (мисалы, левередж эффекттери бар EGARCH же күн ичиндеги маалыматтарды колдонгон ишке ашырылган туруксуздук өлчөмдөрүн) жана тарыхый кризис эпизоддоруна калибрленген гипотетикалык копула параметрлери боюнча стресс-тестирлөөнү кошосуз.


Адабияттар

  • Sklar, A. (1959). Fonctions de repartition a n dimensions et leurs marges. Publications de l'Institut de Statistique de l'Universite de Paris, 8, 229-231.
  • Joe, H. (2014). Dependence Modeling with Copulas. Chapman and Hall/CRC.
  • Aas, K., Czado, C., Frigessi, A., & Bakken, H. (2009). Pair-copula constructions of multiple dependence. Insurance: Mathematics and Economics, 44(2), 182-198.
  • Jeleskovic, V. & Bruhn, L. (2024). Cryptocurrency portfolio optimization: Utilizing a GARCH-Copula model within the Markowitz framework. Journal of Corporate Accounting & Finance.
  • Nagler, T. & Vatter, T. (2023). pyvinecopulib: A Python library for vine copula models. GitHub.
  • Tiwari, A. K., et al. (2020). Modeling risk dependence and portfolio VaR forecast through vine copula for cryptocurrencies. PLOS ONE, 15(1), e0242102.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Рынктан бир кадам алдыда болуңуз

AI соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.