← Мақалаларға оралу
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 сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

Біз сіздің жекелігіңізді құрметтейміз. Кез келген уақытта жазылымнан шығуға болады.