Крипто портфельдердегі бірлескен тәуекел үлгілеу үшін копула модельдері

Корреляция — көптеген портфель менеджерлері әртараптандыруды бағалау кезінде бірінші қолданатын құрал. Бірақ крипто нарықтарында корреляция қауіпті түрде адастырады. Екі токен тыныш нарықтарда 0.3 Пирсон корреляциясын көрсетуі мүмкін, ал құлдырау кезінде ол 0.95-ке дейін секіруі мүмкін. Сызықтық корреляция эллиптикалық үлестірімдерді болжайды — бұл болжам криптовалюта табыстарына тән ауыр құйрықтар мен асимметриялық тәуелділік құрылымдары кезінде күйрейді.
Копула модельдері мұны шеткі мінез-құлықты (әр активтің жеке қалай әрекет ететінін) тәуелділік құрылымынан (активтердің бірге қалай қозғалатынын) бөлу арқылы шешеді. Склар теоремасына негізделген бұл бөлу бізге портфель табыстарының толық бірлескен үлестірімін — соның ішінде тәуекел шынымен өмір сүретін құйрықтарды да — үлгілеу үшін икемді негіз береді.
Сызықтық корреляция неге крипто үшін жұмыс істемейді
BTC, ETH, SOL және AVAX портфелін қарастырайық. 2022 жылдың мамырында Terra/Luna құлдырауы кезінде осы активтер арасындағы корреляциялар 1.0-ге жақындады, дәл әртараптандыру ең қажет болған кезде. Тұрақты корреляцияларды болжаған орта-дисперсия оптимизаторы портфель тәуекелін айтарлықтай төмен бағалаған болар еді.
Пирсон корреляциясының крипто үшін негізгі проблемалары:
- Эллиптикалық емес үлестірімдер. Крипто табыстары айтарлықтай асимметрия мен эксцесс көрсетеді. BTC күнделікті табыстары жиі 10-нан жоғары эксцесс мәндерін көрсетеді (қалыпты үлестірім: 3).
- Асимметриялық тәуелділік. Активтер өсу кезеңдеріне қарағанда құлдырау кезінде көбірек корреляцияланады. Бұл "корреляцияның бұзылуы" құбылысы акциялар нарықтарында жақсы құжатталған және криптода одан да айқын байқалады.
- Құйрық тәуелділігі. Екі активтің бір мезгілде экстремалды шығын шегу ықтималдығы сызықтық корреляциямен анықталмайды. Корреляциясы бірдей, бірақ құйрық тәуелділігі мүлдем басқа екі актив болуы мүмкін.
Склар теоремасы: негіз
Склар теоремасы (1959) кез келген көпөлшемді бірлескен үлестірімді келесідей жіктеуге болатынын айтады:
мұндағы — шеткі үлестірім функциялары, ал — копула, яғни айнымалылар арасындағы бүкіл тәуелділік құрылымын кодтайтын функция.
Керісінше, шеткі үлестірімдер үздіксіз болса, копула бірегей болады.
Бұл жіктеу қуатты, себебі ол бізге мүмкіндік береді:
- Әр активтің шеткі үлестірімін бөлек үлгілеу (GARCH, EVT немесе кез келген сәйкес келетін үлестірімді қолдана отырып)
- Тәуелділік құрылымын копула арқылы тәуелсіз үлгілеу
- Толық бірлескен үлестірімді алу үшін оларды біріктіру
Бірлескен үлестірімнің тығыздығы келесідей көбейткіштерге жіктеледі:
мұндағы — копула тығыздығы, ал — шеткі тығыздықтар.
Копула отбасылары және олардың қасиеттері

Гаусс копуласы
Гаусс копуласы корреляция матрицасымен параметрленеді:
мұндағы — көпөлшемді қалыпты CDF, ал — бірөлшемді қалыпты квантиль функциясы.
Құйрық тәуелділігі: ( үшін).
Гаусс копуласының құйрық тәуелділігі нөлге тең — ол бірлескен экстремалды оқиғалардың ықтималдығын жүйелі түрде төмен бағалайды. Бұл 2008 жылға дейін CDO-ларды дұрыс бағаламаудың негізгі факторы болды, ал крипто тәуекелін үлгілеу үшін де соншалықты қауіпті.
Стьюдент t-копуласы
t-копула еркіндік дәрежесі параметрі арқылы симметриялық құйрық тәуелділігін енгізеді:
Құйрық тәуелділігі:
және үшін бұл береді — екі активтің де ең нашар квантильде бір мезгілде болу ықтималдығы 18%. Төмен (ауыр құйрықтар) бұл ықтималдықты арттырады. Май құйрықты табыстары бар крипто нарықтары әдетте 3-8 аралығындағы талап етеді.
t-копула Гаусс копуласынан айтарлықтай жақсы, бірақ ол симметриялық құйрық тәуелділігін () енгізеді. Іс жүзінде крипто активтер жоғарғы құйрық тәуелділігіне (бірге өсу) қарағанда төменгі құйрық тәуелділігін (бірге құлдырау) көбірек көрсетеді.
Клейтон копуласы
Клейтон копуласы төменгі құйрық тәуелділігін анықтайды — бұл дәл криптода байқайтын асимметриялық құлдырау-кластерлеу мінез-құлқы:
Құйрық тәуелділігі: , .
өскен сайын, төменгі құйрық тәуелділігі күшейеді. үшін — бірлескен экстремалды шығындардың өте жоғары ықтималдығы.
Гумбель копуласы
Гумбель копуласы айна кескіні — ол жоғарғы құйрық тәуелділігін анықтайды:
Құйрық тәуелділігі: , .
Франк копуласы
Франк копуласының екі құйрықта да тәуелділігі нөлге тең (), бұл оны құйрық әсерлерінсіз үлестірімнің негізгі бөлігіндегі тәуелділікті үлгілеу үшін қолайлы етеді:
Крипто үшін дұрыс копуланы таңдау
Крипто портфельдері үшін эмпирикалық дәлелдер мыналарды көрсетеді:
- Төменгі құйрық тәуелділігі үшін Клейтон немесе айналдырылған Гумбель (survival Gumbel) — құлдырау жұғымдылығын анықтау
- Симметриялық құйрық тәуелділігі қолайлы болғанда сенімді жалпы мақсаттағы таңдау ретінде t-копула
- Өрлеу кезеңдерінде күшті жоғарғы құйрық тәуелділігін анықтау үшін Джо копуласы
Bruhn мен Jeleskovic (2024) зерттеуі GARCH-копула модельдерінің, әсіресе Стьюдент t шеткі үлестірімдерін t-копулалармен қолданатындардың, крипто нарығындағы құлдырау (2022), қалпына келу (2023) және тұрақтылық (2024) жағдайларында орта-дисперсия мен тарихи CVaR тәсілдерінен тұрақты түрде асып түсетінін анықтады.
Өлшемділік қарғысы: Vine копулалары келеді

Стандартты көпөлшемді копулалар (Гаусс, t-копула) жоғары өлшемдерге масштабталады, бірақ шектеуші болжамдарды енгізеді. Архимед копулалары (Клейтон, Гумбель, Франк) табиғи түрде екіөлшемді — оларды өлшемдеріне кеңейту барлық жұптардың бірдей тәуелділік параметрін бөлісуін талап етеді, бұл шынайы емес.
Vine копулалары -өлшемді копуланы ағаш құрылымына орналастырылған екіөлшемді копулалар каскадына жіктеу арқылы мұны шешеді. Айнымалылардың әр жұбы (басқаларға шартты) өзінің екіөлшемді копула отбасы мен параметрін алады.
Жұп-копула конструкциясы
-өлшемді тығыздық үшін vine копула жіктелуі:
мұндағы — жиынтығына шартты және айнымалылары үшін екіөлшемді копула тығыздығы.
-өлшемді vine копуласы екіөлшемді копуланы талап етеді. 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 жұпты бірдей бөлісуге мәжбүрлейді. Бірақ BTC-ETH (күшті құлдырау тәуелділігі) болуы мүмкін, ал SOL-AVAX (орташа) болуы мүмкін. Vine копулалары әр жұпқа өз тәуелділік құрылымын білдіруге мүмкіндік береді:
- BTC-ETH: t-копула (, )
- BTC-SOL: Клейтон ()
- ETH-AVAX: Франк ()
- SOL-DOT | BTC: Гумбель ()
Бұл икемділік дәл портфель тәуекелін бағалау үшін өте маңызды.
Шеткі үлестірімдерді үлгілеу: GARCH-EVT
Копуланы бейімдеу алдында, біз әр активтің табыс сериясын біркелкі айнымалыларына түрлендіруіміз керек ("ықтималдық интегралдық түрлендіру"). Стандартты конвейер:
- Уақыт бойынша өзгеретін өзгергіштікті анықтау үшін әр активтің табыс сериясына GARCH моделін бейімдеу
- Стандартталған қалдықтарды алу
- Экстремалды мән теориясын (EVT) қолдана отырып құйрықтарды бейімдеу — атап айтқанда, шектен (әдетте 5-ші және 95-ші процентильдер) тыс жоғарғы және төменгі құйрықтар үшін жалпыланған Парето үлестірімі (GPD)
- Үлестірімнің негізгі бөлігі үшін эмпирикалық CDF қолдану
- Псевдо-біркелкі бақылауларды алу үшін ықтималдық интегралдық түрлендіруді қолдану
Бұл GARCH-EVT тәсілі жиі "жартылай параметрлік" әдіс деп аталады. Ол дұрыс анықтайды:
- Өзгергіштік кластерленуі (GARCH)
- Ауыр құйрықтар (EVT-ден GPD)
- Үлестірімнің жалпы пішіні (негізгі бөлік үшін эмпирикалық CDF)
Крипто активтер үшін Стьюдент t инновацияларымен EGARCH(1,1) немесе GJR-GARCH(1,1) моделі жақсы жұмыс істейді, себебі ол асимметриялық өзгергіштік реакциясын анықтайды (жаман жаңалықтар жақсы жаңалықтарға қарағанда өзгергіштікті көбірек арттырады).
Копулалармен портфель VaR және CVaR
Тәуекел құны (VaR)
сенімділік деңгейіндегі портфель VaR:
мұндағы — портфель шығыны. Копулалармен VaR-ды Монте-Карло арқылы бағалаймыз:
- Бейімделген vine копуласынан үлгіні модельдеу (біркелкі кеңістікте)
- Кері шеткі CDF-терді пайдаланып табыс кеңістігіне қайта түрлендіру
- Портфель табыстарын есептеу:
- VaR — модельденген портфель шығыны үлестірімінің -квантилі
Шартты тәуекел құны (CVaR / Күтілетін жетіспеушілік)
CVaR — шығын VaR-дан асатынын ескере отырып күтілетін шығын:
CVaR когерентті (субаддитивтілікті қанағаттандырады), бұл оны портфельді оңтайландыру үшін VaR-дан жоғары етеді. Монте-Карло бағалауы қарапайым — VaR-дан асатын шығындардың орташасын алу.
Копулаға негізделген тәуекел неге корреляцияға негізделген тәуекелден жақсы
Жұптық корреляциясы бірдей 0.5 болатын екі портфельді қарастырайық:
- Портфель A: Гаусс копула тәуелділігі (құйрық тәуелділігі жоқ)
- Портфель B: Клейтон копула тәуелділігі (, )
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 | ||
|---|---|---|---|
| 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 копуласын бейімдеу ағаш деңгейі бойынша құрайды. 500 күндік роллинг терезесі бар 10 активті портфель үшін, әр қадамда 50,000 Монте-Карло модельдеуімен толық бэктест сағаттар алуы мүмкін. Мұны басқару стратегиялары:
- Кесілген vine:
trunc_lvl=3немесеtrunc_lvl=4орнату — жоғары ағаштар тәуекелге аз үлес қосатын әлсіз шартты тәуелділіктерді анықтайды - Азайтылған модельдеу саны: 99% VaR үшін көбінесе 10,000-20,000 модельдеу жеткілікті
- Параллель есептеу: Әр актив үшін GARCH бейімдеулері тәуелсіз және параллельделуі мүмкін
- Модельді кэштеу: Копуланы күн сайын емес, апта сайын қайта бейімдеп, тек GARCH болжамдарын жаңарту
Режимді сезіну
Крипто нарықтары нақты режимдерді көрсетеді (бул, аю, бүйірлік, жоғары өзгергіштік оқиғалары). Бүкіл үлгіге бейімделген жалғыз vine копуласы режимге тәуелді тәуелділікті анықтай алмауы мүмкін. Мыналарды қарастырыңыз:
- 250-500 күндік роллинг терезелер
- Копула параметрлері жасырын Марков күйіне тәуелді болатын режим ауыстырғыш копулалар
- Соңғы деректерге көбірек салмақ беретін экспоненциалды өлшенген бақылаулар
Кең таралған қателер
- PIT-ті ұмыту. Псевдо-біркелкі бақылаулар орнына шикі табыстарды тікелей копулаға беру мағынасыз нәтижелер береді. Әрқашан алдымен біркелкі шеттерге түрлендіріңіз.
- Тым көп отбасылармен артық бейімдеу. Таңдау жиынтығына мүмкін болатын әрбір екіөлшемді отбасыны қосу артық бейімдеуге әкелуі мүмкін, әсіресе қысқа үлгілерде. Модельді таңдау үшін BIC пайдаланыңыз және 4-5 отбасымен шектеуді қарастырыңыз.
- Сериялық тәуелділікті елемеу. Копулалар бір уақыт нүктесінде көлденең қима тәуелділікті үлгілейді. Егер GARCH қадамын өткізіп жіберіп, автокорреляцияланған табыстарды копулаға берсеңіз, бағаланған тәуелділік сериялық әсерлермен ластанады.
- Динамикалық нарықтардағы статикалық копулалар. 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.
Authors
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.