← К списку статей
July 11, 2026
5 мин. чтения

Асимметричные GARCH с тяжелыми хвостами: EGARCH, GJR и Student-t

#volatility
#GARCH
#EGARCH
#risk
#VaR
#crypto
#algorithmic-trading

В первой части этой серии мы построили GARCH(1,1) с нуля: интуицию кластеризации волатильности, рекурсию условной дисперсии, оценивание методом максимального правдоподобия, прогнозирование и стандартную диагностику остатков с помощью библиотеки arch. Если вы ее не читали, начните оттуда — этот пост предполагает, что вы уже умеете оценивать и интерпретировать обычный GARCH(1,1), и не будет заново выводить основы.

Обычный GARCH(1,1) — хороший базовый вариант, но плохой финальный ответ. У него есть два структурных дефекта, которые дешево игнорировать в бэктесте и дорого игнорировать с реальным капиталом. Во-первых, он симметричен: модель реагирует на день с +5%+5\% точно так же, как на день с 5%-5\%, потому что шок входит в рекурсию дисперсии только через свой квадрат, εt12\varepsilon_{t-1}^2. Возведение в квадрат уничтожает знак. Во-вторых, он предполагает гауссовские инновации: даже после того как GARCH впитал кластеризацию волатильности, стандартизованные остатки BTC и ETH заметно тяжелохвостые, и гауссовское правдоподобие систематически недооценивает хвост. 99%-й VaR по модели GARCH(1,1)-Normal будет нарушаться намного чаще, чем в 1% случаев.

Этот пост устраняет оба дефекта. Мы добавляем асимметрию с помощью GJR-GARCH и EGARCH и тяжелые хвосты с помощью инноваций Student-tt и скошенного распределения Хансена (skew-tt). Затем мы делаем то, что реально окупается: превращаем оцененное условное распределение в однодневный прогноз Value-at-Risk и Expected Shortfall и честно бэктестируем этот прогноз с помощью тестов Купика и Кристоффersена. Модель волатильности, которую вы никогда не тестируете на риск, — это декорация.

Эффект финансового рычага и почему в крипте все сложнее

В акциях у этой асимметрии есть название и история. Эффект финансового рычага (leverage effect, Black, 1976): когда акции компании падают, отношение долга к капиталу растет, капитал механически становится более рискованным, и волатильность повышается. Плохие новости повышают будущую волатильность сильнее, чем равные по размеру хорошие новости. Эмпирически это один из самых устойчивых стилизованных фактов в литературе по волатильности акций.

У крипты нет ни акционерного капитала, ни балансового рычага в корпоративном смысле, но асимметрия, похожая на эффект финансового рычага, все равно проявляется большую часть времени — движимая вынужденным делевериджем, а не бухгалтерией. Когда BTC резко падает, ликвидируются переколлатерализованные займы, принудительно закрываются лонги по бессрочным фьючерсам, funding переворачивается, и каскад подпитывает волатильность. Так что механизм отличается, но знак часто совпадает с акциями: движения вниз резче поднимают волатильность.

Важная оговорка: крипта грязнее, и асимметрию стоит рассматривать как эмпирический вопрос, а не как закон. Резкие движения вверх — шорт-сквизы, разгон на рычаге, гэп на одобрении ETF — тоже могут резко поднять реализованную волатильность. В зависимости от актива и окна выборки оцененная асимметрия может быть сильной, слабой или иногда "неправильного" знака. Дисциплина, на которой настаивает этот пост: оцените асимметричную модель, посмотрите, статистически значим ли параметр асимметрии и в ожидаемом ли он направлении, и сохраняйте дополнительный параметр, только если он оправдывает свое место. Не предполагайте, что история из акций переносится напрямую — проверяйте это.

Проверка на асимметрию до моделирования

Тезис выше гласит "рассматривайте асимметрию как эмпирический факт" — поэтому перед оценкой асимметричной модели стоит запустить дешевый формальный тест на само наличие асимметрии. Именно это делают тесты Engle-Ng на sign-bias (1993). Сначала оцените симметричный GARCH(1,1), возьмите его квадраты стандартизованных остатков zt2z_t^2 и регрессируйте их на индикаторы знака и величины предыдущего шока:

zt2=a0+a1St1+a2St1εt1+a3St1+εt1+utz_t^2 = a_0 + a_1 S_{t-1}^- + a_2 S_{t-1}^- \varepsilon_{t-1} + a_3 S_{t-1}^+ \varepsilon_{t-1} + u_t

где St1=1{εt1<0}S_{t-1}^- = \mathbf{1}\{\varepsilon_{t-1} < 0\} и St1+=1St1S_{t-1}^+ = 1 - S_{t-1}^-. Логика такая: если симметричная модель уже учла все, знак и величина вчерашнего шока не должны предсказывать сегодняшний квадрат остатка, то есть a1=a2=a3=0a_1 = a_2 = a_3 = 0. Индивидуальные tt-тесты — это тесты на sign-bias (a1a_1), negative-size-bias (a2a_2) и positive-size-bias (a3a_3); совместный FF-тест по всем трем — это omnibus-тест. Значимый a1a_1 или a2a_2 говорит о том, что отрицательные шоки систематически неверно оцениваются симметричной моделью — это сигнал к тому, что GJR или EGARCH помогут.

import statsmodels.api as sm

def sign_bias_test(symmetric_res):
    """Engle-Ng sign-bias tests on a fitted symmetric GARCH result."""
    z = symmetric_res.std_resid.dropna()
    z2 = (z ** 2).values[1:]
    eps_lag = z.values[:-1]                      # standardized shock proxy
    neg = (eps_lag < 0).astype(float)
    X = np.column_stack([
        np.ones_like(eps_lag),                   # intercept
        neg,                                     # sign bias
        neg * eps_lag,                           # negative size bias
        (1 - neg) * eps_lag,                     # positive size bias
    ])
    ols = sm.OLS(z2, X).fit()
    names = ["const", "sign_bias", "neg_size_bias", "pos_size_bias"]
    for nm, coef, t, p in zip(names, ols.params, ols.tvalues, ols.pvalues):
        print(f"{nm:16s} coef={coef:+.4f}  t={t:+.2f}  p={p:.3f}")
    print(f"Joint F p-value: {ols.f_pvalue:.4f}")
    return ols

sign_bias_test(models["GARCH-N"])

Если совместный FF-тест незначим, у вас есть эмпирическое основание остаться на симметричной модели и сэкономить два параметра. Если он значим — обычный исход для BTC/ETH — переходите к GJR/EGARCH со спокойной совестью, зная, что моделируете реальную особенность, а не гонитесь за шумом. Это и есть эмпирическая дисциплина, которую требует тезис выше: не предполагать историю про эффект рычага из акций, а проверять ее.

GJR-GARCH: асимметрия через пороговый член

Модель Glosten-Jagannathan-Runkle (1993) — иногда называемая TGARCH или threshold GARCH — это наименьшая возможная правка GARCH(1,1), позволяющая плохим и хорошим новостям влиять по-разному. Вспомним симметричную рекурсию условной дисперсии из первой части:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

GJR добавляет один пороговый член: дополнительную дозу дисперсии, которая включается только после отрицательного шока.

σt2=ω+αεt12+γIt1εt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \gamma\,I_{t-1}\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

где It1I_{t-1} — индикатор

It1={1if εt1<00if εt10I_{t-1} = \begin{cases} 1 & \text{if } \varepsilon_{t-1} < 0 \\ 0 & \text{if } \varepsilon_{t-1} \geq 0 \end{cases}

Прочитайте рекурсию по случаям. После положительного шока (εt10\varepsilon_{t-1} \geq 0) индикатор равен нулю, и влияние квадрата шока на дисперсию следующего периода — просто α\alpha. После отрицательного шока индикатор равен единице, и влияние составляет α+γ\alpha + \gamma. Параметр γ\gamma — вся история асимметрии в одном числе:

  • γ>0\gamma > 0: отрицательные шоки поднимают волатильность сильнее, чем положительные шоки той же величины. Это эффект финансового рычага, и это то, что вы обычно ожидаете найти в BTC/ETH.
  • γ=0\gamma = 0: модель схлопывается обратно к симметричному GARCH(1,1). Тест отношения правдоподобий или tt-тест на γ\gamma — это прямая проверка того, существует ли асимметрия вообще.
  • γ<0\gamma < 0: положительные шоки поднимают волатильность сильнее — редкий режим криптовалютного разгона вверх. Редко, но не исключайте это a priori.

Положительность и стационарность

Поскольку σt2\sigma_t^2 по-прежнему строится аддитивно, нужно, чтобы каждый член оставался неотрицательным. Достаточные условия положительности:

ω>0,α0,α+γ0,β0.\omega > 0, \quad \alpha \geq 0, \quad \alpha + \gamma \geq 0, \quad \beta \geq 0.

Заметьте, что сам γ\gamma может быть отрицательным, пока α+γ0\alpha + \gamma \geq 0, так что влияние после плохих новостей никогда не становится отрицательным.

Для стационарности по ковариации предположим, что инновации zt=εt/σtz_t = \varepsilon_t/\sigma_t стандартизованы и имеют симметричное распределение вокруг нуля, так что P(εt1<0)=1/2P(\varepsilon_{t-1} < 0) = 1/2, и индикатор в среднем вносит вклад γ/2\gamma/2. Условие стационарности принимает вид

α+β+12γ<1.\alpha + \beta + \tfrac{1}{2}\gamma < 1.

Безусловная (долгосрочная) дисперсия тогда равна

σˉ2=ω1αβ12γ.\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta - \tfrac{1}{2}\gamma}.

Это аналог для GJR результата из первой части σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta), с дополнительным членом 12γ\tfrac{1}{2}\gamma, учитывающим средний вклад периода полураспада эффекта рычага. Если распределение ваших инноваций скошено (скошенное распределение Хансена, см. ниже), 1/21/2 заменяется на фактическую вероятность того, что zt<0z_t < 0, но 1/21/2 — стандартный ориентир, используемый для отчетной персистентности.

EGARCH: моделирование логарифма дисперсии без ограничений положительности

GJR удерживает вас внутри смирительной рубашки положительности дисперсии: каждую комбинацию параметров нужно проверять на неравенства-ограничения, что раздражает при оптимизации и еще хуже при скользящей переоценке, когда окно иногда забредает в недопустимую область. Экспоненциальный GARCH Нельсона (1991) полностью обходит эту проблему, моделируя логарифм условной дисперсии. Поскольку logσt2\log \sigma_t^2 может быть любым действительным числом, σt2=exp(logσt2)\sigma_t^2 = \exp(\log \sigma_t^2) автоматически положительна независимо от значений параметров. Никаких ограничений вводить не нужно.

Запишем рекурсию через стандартизованную инновацию zt1=εt1/σt1z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1}:

logσt2=ω+βlogσt12+α(zt1Ezt1)+γzt1\log \sigma_t^2 = \omega + \beta \log \sigma_{t-1}^2 + \alpha\bigl(|z_{t-1}| - \mathbb{E}|z_{t-1}|\bigr) + \gamma\, z_{t-1}

Шок несут два члена, и разделение их — вся идея:

  • Член величины α(zt1Ezt1)\alpha(|z_{t-1}| - \mathbb{E}|z_{t-1}|) реагирует на размер шока, знак убран. Вычитание Ezt1\mathbb{E}|z_{t-1}| центрирует его так, что шок средней величины не вносит вклада. Для стандартного нормального распределения Ez=2/π0.7979\mathbb{E}|z| = \sqrt{2/\pi} \approx 0.7979; для стандартизованного Student-tt ожидаемое абсолютное значение меньше и зависит от ν\nu, но arch обрабатывает это внутренне.
  • Член знака γzt1\gamma\, z_{t-1} — это асимметрия. Он линеен по знаковой инновации, так что отрицательный zt1z_{t-1} толкает logσt2\log\sigma_t^2 в противоположном направлении от положительного.

Соглашение о знаке важно, и на нем часто спотыкаются. В этой параметризации эффект финансового рычага (плохие новости поднимают волатильность) соответствует γ<0\gamma < 0: отрицательный шок zt1<0z_{t-1} < 0 тогда дает γzt1>0\gamma z_{t-1} > 0, увеличивая логарифм дисперсии. Это противоположный знак по сравнению с γ>0\gamma > 0 в GJR. Всегда сверяйтесь с документацией конкретной модели по поводу соглашения, а не полагайтесь на память; arch сообщает EGARCH со своим знаком, и мы проверяем это ниже по кривой news impact, а не доверяем памяти.

Поскольку все аддитивно в логарифмах, персистентность EGARCH(1,1) определяется единственным авторегрессионным коэффициентом β\beta при logσt12\log\sigma_{t-1}^2; стационарность требует только β<1|\beta| < 1. Это намного более чистое условие, чем неравенство GJR, и это реальное практическое преимущество при переоценке на скользящих окнах.

Стоит отметить одну тонкость: реакция EGARCH на шоки экспоненциальна по инновации (экспонирование происходит в конце), тогда как у GJR она квадратичная. Поэтому EGARCH реагирует более резко на большие шоки — полезная особенность в крипте, где важны именно хвостовые события, но также и причина, по которой EGARCH иногда может выдавать неправдоподобно большие прогнозы дисперсии после дня-выброса. Ни одна из моделей не лучше универсально; выбор делается по качеству вневыборочного прогноза и бэктестам риска — в этом смысл всей серии.

Кривая news impact

Самый чистый способ увидеть разницу между симметричным GARCH, GJR и EGARCH — это кривая news impact (Engle and Ng, 1993): зафиксировать σt1\sigma_{t-1} на ее долгосрочном уровне и построить график условной дисперсии следующего периода σt2\sigma_t^2 как функцию последнего шока εt1\varepsilon_{t-1}. Она отвечает на вопрос "при шоке такого размера и знака насколько модель поднимает завтрашнюю волатильность?"

  • Симметричный GARCH дает симметричную параболу, отцентрированную на нуле. Шоки 5%-5\% и +5%+5\% попадают на одинаковую высоту. Это как раз тот дефект, который мы устраняем.
  • GJR дает параболу с изломом в нуле — круче слева (отрицательные шоки), чем справа, при γ>0\gamma > 0. Две половины имеют кривизну α+γ\alpha+\gamma и α\alpha соответственно.
  • EGARCH дает асимметричную экспоненциальную V-образную форму: два плеча имеют разный наклон из-за члена γz\gamma z, и вся кривая изгибается вверх быстрее параболы из-за финального экспонирования.

Мы построим все три кривые по оцененным параметрам позже, в разделе с реализацией — это самый полезный диагностический инструмент для наглядной демонстрации того, что дает асимметрия.

Тяжелые хвосты: инновации Student-t и skew-t

Асимметрия исправляет реакцию модели на знак шоков. Она никак не влияет на распределение самих шоков. Обычный GARCH предполагает ztN(0,1)z_t \sim \mathcal{N}(0,1), и это предположение почти всегда неверно для крипты. Даже после того как GARCH убирает кластеризацию волатильности, стандартизованные остатки zt=εt/σtz_t = \varepsilon_t / \sigma_t сохраняют избыточный эксцесс — они тяжелохвостые. Гауссовское правдоподобие, подгоняющее плечи распределения, недооценивает, насколько часто в реальности случается день с отклонением в 44, 55 или 66 сигм.

Последствие для риска прямое. Гауссовский 99%-й VaR использует квантиль Φ1(0.01)2.326\Phi^{-1}(0.01) \approx -2.326, то есть предсказывает VaR0.992.326σt\text{VaR}_{0.99} \approx 2.326\,\sigma_t. Если истинное стандартизованное распределение — Student-tt с, скажем, ν=5\nu = 5 степенями свободы, истинный 1%-й квантиль близок к 3.36-3.36 — гауссовский VaR оптимистичен примерно на 44%44\% при этом уровне доверия. Вы будете нарушать его гораздо чаще, чем в 1% случаев, и систематически удивляться "невозможным" дням. Это не особенность крипты; Боллерслев (1987) ввел tt-GARCH именно потому, что остатки акций и валютных пар показывали те же тяжелые хвосты. Крипта — просто более экстремальная версия той же проблемы.

Стандартизованное распределение Student-t

Плотность Student-tt имеет параметр числа степеней свободы ν>2\nu > 2, контролирующий толщину хвостов: малое ν\nu означает тяжелые хвосты, а при ν\nu \to \infty распределение tt сходится к гауссовскому. Загвоздка в том, что необработанное распределение tνt_\nu имеет дисперсию ν/(ν2)1\nu/(\nu-2) \neq 1, поэтому его необходимо стандартизовать к единичной дисперсии перед использованием в качестве инновации — иначе "σt\sigma_t" в рекурсии GARCH не была бы фактически условным стандартным отклонением.

Стандартизованная инновация Student-tt с единичной дисперсией имеет плотность

f(z;ν)=Γ ⁣(ν+12)π(ν2)  Γ ⁣(ν2)(1+z2ν2)ν+12,ν>2.f(z;\nu) = \frac{\Gamma\!\left(\frac{\nu+1}{2}\right)}{\sqrt{\pi(\nu-2)}\;\Gamma\!\left(\frac{\nu}{2}\right)}\left(1 + \frac{z^2}{\nu-2}\right)^{-\frac{\nu+1}{2}}, \qquad \nu > 2.

Обратите внимание на (ν2)(\nu-2) внутри — это и есть стандартизация, обеспечивающая Var(z)=1\mathrm{Var}(z)=1. Вклад в логарифм правдоподобия одного наблюдения при заданной условной дисперсии GARCH σt2\sigma_t^2 и zt=εt/σtz_t = \varepsilon_t/\sigma_t равен

t=logΓ ⁣(ν+12)logΓ ⁣(ν2)12log(π(ν2))12logσt2ν+12log ⁣(1+zt2ν2).\ell_t = \log\Gamma\!\left(\tfrac{\nu+1}{2}\right) - \log\Gamma\!\left(\tfrac{\nu}{2}\right) - \tfrac{1}{2}\log\bigl(\pi(\nu-2)\bigr) - \tfrac{1}{2}\log\sigma_t^2 - \frac{\nu+1}{2}\log\!\left(1 + \frac{z_t^2}{\nu-2}\right).

Член 12logσt2-\tfrac{1}{2}\log\sigma_t^2 — это якобиан преобразования от εt\varepsilon_t к ztz_t — тот же член, что вы видели в гауссовском правдоподобии GARCH в первой части. Меняется только форма. Максимизация tt\sum_t \ell_t совместно по параметрам GARCH и ν\nu — это именно то, что делает arch при передаче dist='t'.

Оцененное ν\nu само по себе информативно. Для дневных доходностей BTC/ETH обычно получается диапазон ν36\nu \approx 3\text{–}6 — тяжелые хвосты, но с конечной дисперсией (для чего нужно ν>2\nu > 2) и обычно конечным эксцессом (для чего нужно ν>4\nu > 4). Если оцененное ν\nu падает ниже 4, учтите, что выборочный эксцесс технически бесконечен в модели, а некоторые оценщики становятся неустойчивыми; это сигнал внимательно присмотреться к выбросам и качеству данных.

Скошенное распределение Хансена (skew-t)

Student-tt тяжелохвостое, но по-прежнему симметричное — левый и правый хвосты равны по тяжести. Остатки доходностей крипты часто также скошены: левый хвост (обвалы) тяжелее правого. Скошенное распределение Хансена (1994) обобщает стандартизованное tt параметром скошенности λ(1,1)\lambda \in (-1, 1) наряду с ν\nu:

f(z;ν,λ)={bc(1+1ν2(bz+a1λ)2)ν+12z<a/bbc(1+1ν2(bz+a1+λ)2)ν+12za/bf(z;\nu,\lambda) = \begin{cases} b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1-\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z < -a/b \\[2mm] b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1+\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z \geq -a/b \end{cases}

где константы a=4λcν2ν1a = 4\lambda c\,\frac{\nu-2}{\nu-1}, b2=1+3λ2a2b^2 = 1 + 3\lambda^2 - a^2 и c=Γ(ν+12)π(ν2)Γ(ν2)c = \frac{\Gamma(\frac{\nu+1}{2})}{\sqrt{\pi(\nu-2)}\,\Gamma(\frac{\nu}{2})} подобраны так, чтобы zz имело нулевое среднее и единичную дисперсию при любых допустимых (ν,λ)(\nu,\lambda). Распределение разбивается в точке z=a/bz = -a/b, используя разное масштабирование в каждой части, чтобы сместить больше массы в один хвост.

Интерпретация: λ<0\lambda < 0 дает левоскошенное распределение (более тяжелый нижний хвост), что является обычной находкой для крипты и тем, что вы бы ожидали в паре с эффектом финансового рычага. λ=0\lambda = 0 восстанавливает симметричное распределение Student-tt, так что тест λ=0\lambda = 0 показывает, дает ли член скошенности какую-то пользу. В arch это dist='skewt', который оценивает и ν\nu, и λ\lambda. Результат — VaR, чей левый хвостовой квантиль честно тяжелее правого хвостового квантиля — именно то, что нужно, когда убытки, которые вы пытаетесь пережить, асимметричны. Это напрямую связано с асимметрией убытка и прибыли в исходах позиций: просадка на x%x\% требует больше x%x\% для восстановления, так что неправильное моделирование левого хвоста обходится дороже, чем правого.

Реализация на Python

Теперь оценим все это с помощью библиотеки arch. Настройка повторяет первую часть: получаем дневные доходности, масштабируем на 100 для численной кондиционированности (оптимизаторы GARCH плохо себя ведут, когда доходности имеют порядок O(0.01)O(0.01)), и оцениваем с постоянным средним. Если вам нужны внутридневные данные или другая модель среднего, механика идентична.

Настройка и данные

import numpy as np
import pandas as pd
from arch import arch_model
from arch.univariate import GARCH, EGARCH, ConstantMean, StudentsT, SkewStudent
from scipy import stats

def fetch_returns(symbol="BTC-USD", start="2019-01-01", end="2025-12-31"):
    """Daily log returns, in percent (scaled x100 for the optimizer)."""
    import yfinance as yf
    px = yf.download(symbol, start=start, end=end)["Close"].dropna()
    ret = 100.0 * np.log(px / px.shift(1)).dropna()
    ret.name = symbol
    return ret

r = fetch_returns("BTC-USD")
print(f"{len(r)} daily observations, "
      f"annualized vol ~ {r.std() * np.sqrt(365):.0f}%")

Крипта торгуется 24/7, поэтому мы аннуализируем через 365, а не 252 — небольшой, но постоянно возникающий источник путаницы, когда вы сравниваете криптовалютный Sharpe или волатильность с цифрами фондового деска.

Оценка четырех моделей

Паттерн в arch: vol='Garch' с p=1, q=1 — это симметричный GARCH; добавление o=1 включает пороговый член GJR; vol='EGARCH' переключает на модель логарифма дисперсии. Распределение инноваций задается через dist: 'normal', 't', 'skewt'.

def fit(returns, vol="Garch", p=1, o=0, q=1, dist="normal"):
    am = arch_model(returns, mean="Constant",
                    vol=vol, p=p, o=o, q=q, dist=dist)
    res = am.fit(disp="off")
    return res

models = {
    "GARCH-N":    fit(r, vol="Garch",  o=0, dist="normal"),  # Part 1 baseline
    "GJR-t":      fit(r, vol="Garch",  o=1, dist="t"),        # asymmetry + fat tails
    "EGARCH-t":   fit(r, vol="EGARCH", o=1, dist="t"),        # log-variance asymmetry
    "GJR-skewt":  fit(r, vol="Garch",  o=1, dist="skewt"),    # + skew
}

for name, res in models.items():
    print(f"\n===== {name} =====")
    print(res.summary().tables[1])   # parameter table

Для vol='EGARCH' аргумент o контролирует асимметричный член (γz\gamma z), а p/q контролируют члены величины и лага; o=1, p=1, q=1 — это стандартный EGARCH(1,1). Один подвох: имена параметров EGARCH в arch те же буквы, но соглашение о знаке члена асимметрии — нельсоновское, так что отрицательная оценка означает эффект финансового рычага. Мы проверяем это по кривой news impact, а не по памяти.

Чтение результата GJR

Таблица параметров GJR-tt выглядит примерно так (иллюстративные значения, не результат реального эксперимента — переоцените на своих данных):

                  coef    std err       t      P>|t|
omega           0.0480     0.017     2.82     0.005
alpha[1]        0.0620     0.018     3.44     0.001
gamma[1]        0.0910     0.028     3.25     0.001
beta[1]         0.8850     0.021    42.1      0.000
nu              4.30       0.55      7.82     0.000

Как это читать:

  • gamma[1] = 0.091 с tt-статистикой выше 3 — статистически значимый эффект финансового рычага. После отрицательного шока влияние квадрата шока составляет α+γ=0.062+0.091=0.153\alpha + \gamma = 0.062 + 0.091 = 0.153; после положительного — просто α=0.062\alpha = 0.062. Плохие новости двигают волатильность этой модели примерно в 2.52.5 раза сильнее, чем хорошие новости той же величины.
  • nu = 4.3 подтверждает тяжелые хвосты — далеко от гауссовского (ν\nu \to \infty) и достаточно низкое, чтобы четвертый момент был на грани конечности. Гауссовский VaR на этом ряду был бы сильно оптимистичным.
  • Персистентность составляет α+β+12γ=0.062+0.885+0.04550.993\alpha + \beta + \tfrac{1}{2}\gamma = 0.062 + 0.885 + 0.0455 \approx 0.993 — очень высокая, как обычно для дневной крипты: шоки затухают медленно, и волатильность сильно кластеризована.

Самая важная строка для проверки — строка γ\gamma. Если ее pp-значение велико, асимметричный член не оправдывает свое место на этом активе и окне, и стоит предпочесть более простую симметричную модель. Это дисциплина отбора моделей, а не декорация — подробнее об этом ниже.

Сравнение моделей по информационным критериям

Логарифм правдоподобия всегда улучшается при добавлении параметров, поэтому нельзя выбирать модель только по нему. Используйте AIC/BIC, которые штрафуют за число параметров (BIC агрессивнее):

def compare(models: dict) -> pd.DataFrame:
    rows = []
    for name, res in models.items():
        rows.append({
            "model": name,
            "n_params": len(res.params),
            "loglik": res.loglikelihood,
            "AIC": res.aic,
            "BIC": res.bic,
        })
    df = pd.DataFrame(rows).set_index("model")
    return df.sort_values("BIC")

print(compare(models))

Практическое правило интерпретации: улучшение BIC более чем примерно на 6 по сравнению с базовой моделью — сильное свидетельство того, что дополнительная структура реальна; разница в 1–2 — это шум. Если GJR-t превосходит GARCH-N на 30+ пунктов BIC, а GJR-skewt превосходит GJR-t только на 1, сохраните tt и откажитесь от скошенности — параметр скошенности не окупает себя на этих данных. Не читайте AIC/BIC как замену вневыборочной валидации; они вознаграждают внутривыборочное качество с поправкой на сложность, что необходимо, но недостаточно. Настоящий тест — это бэктест VaR и, в конечном счете, пошаговая (walk-forward) оценка.

Построение кривой news impact

Это самый показательный график — он делает асимметрию видимой и проверяет соглашение о знаке EGARCH.

import matplotlib.pyplot as plt

def news_impact_curve(res, shock_grid):
    """
    Next-period conditional variance as a function of the last shock,
    holding sigma_{t-1} at the model's unconditional level.
    Works for symmetric GARCH, GJR (o=1), and EGARCH.
    """
    p = res.params
    vol_name = res.model.volatility.__class__.__name__
    sigma2_bar = np.mean(res.conditional_volatility ** 2)

    omega = p["omega"]
    alpha = p.get("alpha[1]", 0.0)
    gamma = p.get("gamma[1]", 0.0)
    beta  = p.get("beta[1]", 0.0)

    if vol_name == "EGARCH":
        sig_prev = np.sqrt(sigma2_bar)
        z = shock_grid / sig_prev
        E_abs = np.sqrt(2 / np.pi)   # approx; arch uses the fitted dist's E|z|
        log_s2 = (omega + beta * np.log(sigma2_bar)
                  + alpha * (np.abs(z) - E_abs) + gamma * z)
        return np.exp(log_s2)
    else:
        ind = (shock_grid < 0).astype(float)
        return omega + (alpha + gamma * ind) * shock_grid**2 + beta * sigma2_bar

shocks = np.linspace(-8, 8, 401)   # daily % shocks
plt.figure(figsize=(8, 5))
for name in ["GARCH-N", "GJR-t", "EGARCH-t"]:
    nic = news_impact_curve(models[name], shocks)
    plt.plot(shocks, nic, label=name, lw=2)
plt.axvline(0, color="gray", lw=0.8, ls="--")
plt.xlabel("Last shock  $\\varepsilon_{t-1}$  (daily %)")
plt.ylabel("Next-period conditional variance  $\\sigma_t^2$")
plt.title("News impact curve: symmetric vs GJR vs EGARCH (BTC)")
plt.legend()
plt.tight_layout()

Когда вы запустите это, симметричная кривая GARCH-N окажется чистой параболой, отцентрированной на нуле, — шоки 6%-6\% и +6%+6\% дают одинаковую дисперсию. GJR-t — парабола с изломом в начале координат, выше на левом плече. EGARCH-t — экспоненциальная V-образная кривая, и если ее левое плечо расположено выше правого, вы одним взглядом подтвердили и эффект финансового рычага, и соглашение о знаке. Если левое плечо EGARCH расположено ниже правого, либо γ\gamma оценилась положительной (режим повышенной волатильности вверх), либо у вас перепутан знак — график подскажет, что именно, без всяких догадок.

Сравнение четырех моделей бок о бок

Прежде чем перейти к риску, полезно поставить четыре модели рядом. Каждая строка — это дизайн-решение, а столбцы показывают, во что оно обходится и что дает.

Свойство GARCH-N GJR-t EGARCH-t GJR-skewt
Асимметрия (знак шока) нет пороговая γIε2\gamma I\varepsilon^2 знаковая γz\gamma z пороговая γIε2\gamma I\varepsilon^2
Форма хвоста инновации гауссовская Student-tt Student-tt скошенная-tt
Скошенность инновации нет нет нет да (λ\lambda)
Ограничения положительности да да (α+γ0\alpha+\gamma\ge0) нет (лог-форма) да
Условие стационарности α+β<1\alpha+\beta<1 α+β+12γ<1\alpha+\beta+\tfrac12\gamma<1 β<1\lvert\beta\rvert<1 α+β+P(z<0)γ<1\alpha+\beta+P(z<0)\gamma<1
Дополнительные параметры к базовой 0 γ,ν\gamma,\nu γ,ν\gamma,\nu γ,ν,λ\gamma,\nu,\lambda
Типичный вердикт для крипты не проходит бэктест VaR сильный, устойчивый сильный, устойчивый маргинальное улучшение над GJR-t

Паттерн, который стоит запомнить: скачок от первого столбца ко второму — добавление одновременно асимметрии и тяжелых хвостов — это то место, где живет почти все улучшение калибровки риска. Последующие уточнения (функциональная форма EGARCH, член скошенности) реальны, но второго порядка, и на многих криптовалютных рядах они находятся внутри шума. Тратьте бюджет моделирования на первый скачок и относитесь скептически ко всему остальному.

Применение к риску: VaR и Expected Shortfall

Оценка более сложной модели волатильности имеет смысл только если она улучшает решение. Самое понятное решение для улучшения — это однодневный прогноз хвостового риска: насколько плохим может быть завтра? Мы получаем однодневный Value-at-Risk и Expected Shortfall (он же Conditional VaR, который использует в качестве целевой функции конвейер портфеля HRP/CVaR) напрямую из оцененного прогноза GARCH-tt/skew-tt.

От условного распределения к VaR

Механика GARCH дает однодневный прогноз условного среднего μt+1\mu_{t+1} и условного стандартного отклонения σt+1\sigma_{t+1}. Доходность моделируется как rt+1=μt+1+σt+1zt+1r_{t+1} = \mu_{t+1} + \sigma_{t+1} z_{t+1} с zt+1z_{t+1}, взятым из оцененного стандартизованного распределения (гауссовского, tt или skew-tt). Так что α\alpha-квантиль доходности — это просто аффинное преобразование α\alpha-квантиля стандартизованного распределения:

VaRα(t+1)=(μt+1+σt+1Fz1(1α))\text{VaR}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, F_z^{-1}(1-\alpha)\Bigr)

где Fz1F_z^{-1} — квантиль (обратная функция распределения) стандартизованной инновации, а ведущий знак минус следует соглашению, что VaR — это положительное число убытка. Для 99%-го VaR α=0.99\alpha = 0.99, и вы подставляете Fz1(0.01)F_z^{-1}(0.01). Вся выгода от tt/skew-tt проявляется именно здесь: Fz1(0.01)F_z^{-1}(0.01) более отрицательно, чем гауссовское 2.326-2.326, так что VaR честно больше.

Expected Shortfall

VaR сообщает порог; он ничего не говорит о том, насколько плохим будет нарушение, когда оно случится. Expected Shortfall — средний убыток при условии превышения VaR — сообщает, и он когерентен (субаддитивен), поэтому именно он лежит в основе оптимизации CVaR и почему Базель перешел на него. Для модели типа "положение-масштаб",

ESα(t+1)=(μt+1+σt+1E ⁣[zzFz1(1α)]).\text{ES}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, \mathbb{E}\!\left[z \mid z \leq F_z^{-1}(1-\alpha)\right]\Bigr).

Член условного хвостового математического ожидания E[zzq]\mathbb{E}[z \mid z \le q] имеет замкнутые формы для стандартных распределений. Для гауссовского, с q=Φ1(1α)q = \Phi^{-1}(1-\alpha),

E[zzq]=ϕ(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\phi(q)}{1-\alpha},

где ϕ\phi — плотность стандартного нормального распределения. Для стандартизованного Student-tt с ν\nu степенями свободы и q=tν1(1α)q = t_\nu^{-1}(1-\alpha) (на стандартизованной шкале) хвостовое математическое ожидание равно

E[zzq]=ν+q2ν1gν(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\nu + q^2}{\nu - 1}\cdot\frac{g_\nu(q)}{1-\alpha},

где gνg_\nu — стандартизованная плотность tt. Expected Shortfall для tt-распределения превышает гауссовский не только на ту же величину, что и VaR, потому что хвост tt-распределения не просто дальше — он толще, так что средний убыток за порогом непропорционально велик. Этот дополнительный разрыв — число, которое гауссовская модель от вас скрывает.

Вычисление VaR и ES по оцененной модели arch

Распределения в arch предоставляют метод ppf (квантиль), так что можно получить стандартизованный квантиль напрямую и не выводить его заново. Для ES мы интегрируем численно, что устойчиво и работает единообразно для normal/t/skewt.

from scipy import integrate

def var_es_forecast(res, alpha=0.99):
    """
    One-step-ahead VaR and ES at level alpha, on the same (x100) scale
    as the returns fed to the model. Divide by 100 for fractional units.
    """
    fc = res.forecast(horizon=1, reindex=False)
    mu = fc.mean.iloc[-1, 0]
    sigma = np.sqrt(fc.variance.iloc[-1, 0])

    dist = res.model.distribution          # StudentsT / SkewStudent / Normal
    dp = [res.params[k] for k in res.params.index
          if k in ("nu", "eta", "lambda", "lam")]

    z_q = dist.ppf(1 - alpha, dp) if dp else dist.ppf(1 - alpha)
    z_q = float(np.atleast_1d(z_q)[0])

    def pdf(z):
        arr = np.atleast_1d(z).astype(float)
        lp = dist.loglikelihood(dp, arr, np.ones_like(arr), individual=True) \
             if dp else dist.loglikelihood([], arr, np.ones_like(arr),
                                           individual=True)
        return np.exp(lp)

    num, _ = integrate.quad(lambda z: z * pdf(z), -30, z_q, limit=200)
    es_z = num / (1 - alpha)               # E[z | z <= z_q]

    var = -(mu + sigma * z_q)
    es  = -(mu + sigma * es_z)
    return {"mu": mu, "sigma": sigma, "z_q": z_q,
            "VaR": var, "ES": es}

for name in ["GARCH-N", "GJR-t", "GJR-skewt"]:
    out = var_es_forecast(models[name], alpha=0.99)
    print(f"{name:11s}  sigma={out['sigma']:.2f}%  "
          f"z_q={out['z_q']:+.2f}  "
          f"VaR99={out['VaR']:.2f}%  ES99={out['ES']:.2f}%")

Столбец z_q — вся история в одном числе. Гауссовская модель использует zq2.33z_q \approx -2.33; модель tt с ν4.3\nu \approx 4.3 использует что-то около 3.3-3.3; skew-tt отодвигает левый квантиль еще дальше, одновременно подтягивая правый. При том же σt+1\sigma_{t+1} — заметно больший VaR. Если вы запускали гауссовский VaR на крипте, это тот разрыв, который вы молча поглощали.

Один шаг против многих шагов: оговорка

Все вышеизложенное — это прогноз на один день вперед, и именно там VaR по GARCH самый чистый. Две вещи усложняют более длинные горизонты, и вам стоит их знать перед экстраполяцией.

Во-первых, прогнозы дисперсии возвращаются к среднему. Условная дисперсия на hh шагов вперед из стационарного GARCH сходится к безусловному уровню σˉ2\bar\sigma^2 по мере роста hh, а кумулятивная дисперсия за hh дней — это сумма поshaговых прогнозов — это не h×σt+12h\times\sigma_{t+1}^2, если только волатильность не находится на своем долгосрочном среднем. Наивное масштабирование "корень из времени" VaR(h)=hVaR(1)\text{VaR}(h) = \sqrt{h}\,\text{VaR}(1) игнорирует этот возврат к среднему и оказывается неверным именно после шока, когда это число нужнее всего. Используйте собственную многошаговую траекторию дисперсии модели.

Во-вторых, распределение многодневной доходности не той же формы, что однодневная инновация. Суммирование нескольких дневных шоков с распределением tt (через нелинейную рекурсию GARCH) не дает распределения tt на горизонте hh дней; чистой замкнутой формы не существует. Для многодневного VaR честный путь — симуляция: сгенерировать траектории инноваций из оцененного стандартизованного распределения, прогнать их через рекурсию GARCH, чтобы получить симулированные траектории доходности, агрегировать в hh-дневные доходности и прочитать эмпирический квантиль. Это также естественным образом обрабатывает случай skew-tt, для которого вообще не существует аналитического многогоризонтного квантиля. Однодневные аналитические формулы в этом посте точны; относитесь к любому многошаговому упрощению как к приближению, которое нужно проверять.

Бэктестинг VaR: Купик и Кристоффersен

Прогноз VaR — это вероятностное утверждение: "убыток превысит этот порог лишь в (1α)(1-\alpha) доле дней". Вы проверяете его, подсчитывая нарушения (дни, когда реализованный убыток превысил прогнозный VaR) на пошаговой (walk-forward) оценке и проверяя две вещи. Во-первых, верна ли частота нарушений? Во-вторых, независимы ли нарушения, или они кластеризуются (что означает, что модель отказывает именно тогда, когда это важнее всего, — во время скачков волатильности)?

Пусть It=1{losst>VaRt}I_t = \mathbf{1}\{\text{loss}_t > \text{VaR}_t\} — последовательность нарушений, N=ItN = \sum I_t — число нарушений за TT дней, а π^=N/T\hat{\pi} = N/T — наблюдаемая частота. Целевая частота p=1αp = 1-\alpha.

Тест безусловного покрытия Купика (1995) проверяет π^p\hat\pi \approx p через отношение правдоподобий:

LRuc=2log ⁣[pN(1p)TNπ^N(1π^)TN]    χ12.LR_{uc} = -2\log\!\left[\frac{p^{N}(1-p)^{T-N}}{\hat\pi^{N}(1-\hat\pi)^{T-N}}\right] \;\sim\; \chi^2_1.

Тест независимости Кристоффersена (1998) проверяет, что сегодняшнее нарушение не предсказывается вчерашним нарушением. Пусть nijn_{ij} считает переходы из состояния ii в состояние jj в последовательности нарушений, π01=n01/(n00+n01)\pi_{01} = n_{01}/(n_{00}+n_{01}), π11=n11/(n10+n11)\pi_{11} = n_{11}/(n_{10}+n_{11}) и π=(n01+n11)/T\pi = (n_{01}+n_{11})/T. Тогда

LRind=2log ⁣[(1π)n00+n10πn01+n11(1π01)n00π01n01(1π11)n10π11n11]    χ12.LR_{ind} = -2\log\!\left[\frac{(1-\pi)^{n_{00}+n_{10}}\,\pi^{\,n_{01}+n_{11}}}{(1-\pi_{01})^{n_{00}}\pi_{01}^{n_{01}}(1-\pi_{11})^{n_{10}}\pi_{11}^{n_{11}}}\right] \;\sim\; \chi^2_1.

Оба теста объединяются в тест условного покрытия LRcc=LRuc+LRindχ22LR_{cc} = LR_{uc} + LR_{ind} \sim \chi^2_2, который одновременно проверяет и правильную частоту, и независимость. Модель может пройти тест Купика (верное число нарушений), но провалить тест Кристоффersена (все они сгрудились в одну неделю обвала) — именно этот режим отказа важнее всего отловить, потому что кластеризованные нарушения — это те, что взрывают счет.

from scipy.stats import chi2

def var_backtest(losses, var, p):
    """
    losses, var: 1D arrays, same length; loss>0 is a loss, var>0 threshold.
    p = 1 - alpha (target violation rate, e.g. 0.01 for 99% VaR).
    Returns Kupiec, Christoffersen-independence, and conditional-coverage LR.
    """
    losses = np.asarray(losses)
    var = np.asarray(var)
    I = (losses > var).astype(int)          # violation indicators
    T = len(I)
    N = int(I.sum())
    pi_hat = N / T

    eps = 1e-12
    ll_null = N * np.log(p + eps) + (T - N) * np.log(1 - p + eps)
    ll_alt  = N * np.log(pi_hat + eps) + (T - N) * np.log(1 - pi_hat + eps)
    LR_uc = -2 * (ll_null - ll_alt)
    p_uc = 1 - chi2.cdf(LR_uc, df=1)

    n00 = np.sum((I[:-1] == 0) & (I[1:] == 0))
    n01 = np.sum((I[:-1] == 0) & (I[1:] == 1))
    n10 = np.sum((I[:-1] == 1) & (I[1:] == 0))
    n11 = np.sum((I[:-1] == 1) & (I[1:] == 1))
    pi01 = n01 / (n00 + n01) if (n00 + n01) else 0.0
    pi11 = n11 / (n10 + n11) if (n10 + n11) else 0.0
    pi   = (n01 + n11) / (n00 + n01 + n10 + n11)

    def _ll(pi01, pi11, pi_pooled, use_pooled):
        if use_pooled:
            a = (n00 + n10) * np.log(1 - pi_pooled + eps)
            b = (n01 + n11) * np.log(pi_pooled + eps)
            return a + b
        return (n00 * np.log(1 - pi01 + eps) + n01 * np.log(pi01 + eps)
                + n10 * np.log(1 - pi11 + eps) + n11 * np.log(pi11 + eps))

    LR_ind = -2 * (_ll(pi01, pi11, pi, True) - _ll(pi01, pi11, pi, False))
    p_ind = 1 - chi2.cdf(LR_ind, df=1)

    LR_cc = LR_uc + LR_ind
    p_cc = 1 - chi2.cdf(LR_cc, df=2)

    return {
        "T": T, "violations": N,
        "obs_rate": pi_hat, "target_rate": p,
        "LR_uc": LR_uc, "p_uc": p_uc,
        "LR_ind": LR_ind, "p_ind": p_ind,
        "LR_cc": LR_cc, "p_cc": p_cc,
    }

Чтобы честно получить данные losses/var, переоценивайте модель (или хотя бы перепрогнозируйте) на расширяющемся или скользящем окне и записывайте однодневный прогноз VaR для каждого дня вне выборки, а затем сравнивайте его с реализованным убытком за тот же день. Никогда не бэктестируйте VaR внутри выборки — модель, оцененная на том же обвале, который ее просят предсказать, будет выглядеть намного лучше, чем есть на самом деле. Это та же дисциплина, что и паритет бэктеста и живой торговли: оценка должна использовать только информацию, доступную на момент принятия решения.

def walk_forward_var(returns, alpha=0.99, start=750, refit_every=25,
                     vol="Garch", o=1, dist="t"):
    """
    Expanding-window one-step VaR. Refit every `refit_every` days
    (refitting daily is correct but slow; every ~25 days is a common
    compromise -- validate the shortcut on your data).
    """
    losses, vars_ = [], []
    res = None
    for t in range(start, len(returns)):
        if res is None or (t - start) % refit_every == 0:
            am = arch_model(returns.iloc[:t], mean="Constant",
                            vol=vol, p=1, o=o, q=1, dist=dist)
            res = am.fit(disp="off")
        fc = res.forecast(horizon=1, reindex=False)
        mu = fc.mean.iloc[-1, 0]
        sig = np.sqrt(fc.variance.iloc[-1, 0])
        dp = [res.params[k] for k in res.params.index
              if k in ("nu", "eta", "lambda", "lam")]
        z_q = float(np.atleast_1d(
            res.model.distribution.ppf(1 - alpha, dp) if dp
            else res.model.distribution.ppf(1 - alpha))[0])
        var_t = -(mu + sig * z_q)
        vars_.append(var_t)
        losses.append(-returns.iloc[t])     # realized loss for that day
    return np.array(losses), np.array(vars_)

losses, vars_ = walk_forward_var(r, alpha=0.99, dist="t")
print(var_backtest(losses, vars_, p=0.01))

Как читать результат: хорошо откалиброванный 99%-й VaR показывает наблюдаемую частоту около 1%, незначимый тест Купика (большое p_uc) и незначимый тест Кристоффersена (большое p_ind) — без кластеризации. На практике честный результат для крипты в том, что GARCH-Normal проваливает тест Купика (слишком много нарушений, p_uc крошечное), в то время как GJR-tt или EGARCH-tt проходят или почти проходят. Этот контраст — весь аргумент этого поста, выраженный в виде статистической проверки гипотезы. Если даже модель tt показывает кластеризованные нарушения (малое p_ind), ваша динамика волатильности все еще неверно специфицирована — часто это признак того, что нужна более длинная память (component/FIGARCH) или слой режимов, что связано с определением режимов через HMM.

Ранжирование моделей по хвостовому убытку, а не только по прохождению теста

Тесты Купика и Кристоффersена дают бинарный вердикт — модель отвергнута или нет. Это необходимо, но грубо: две модели могут обе "пройти", в то время как одна заметно точнее. Чтобы ранжировать конкурирующие прогнозы VaR, оцените их строго согласованной функцией потерь для квантиля — pinball (квантильной) потерей:

Lτ(r,q)=(τ1{r<q})(rq),τ=1α,L_\tau(r, q) = \bigl(\tau - \mathbf{1}\{r < q\}\bigr)\,(r - q), \qquad \tau = 1-\alpha,

где qq — (знаковый) квантиль VaR, а rr — реализованная доходность. Усредненное по дням вне выборки, меньшее среднее значение pinball-потери означает лучше откалиброванный и более точный квантиль; поскольку потеря согласована для τ\tau-квантиля, ее минимизация не вознаграждает модель за то, что она попросту "широка". Чтобы формально сравнить две модели, подайте разности их подневных потерь в тест Diebold-Mariano.

def pinball_loss(returns, var, alpha=0.99):
    tau = 1 - alpha
    q = -np.asarray(var)               # VaR is a positive loss; quantile is negative
    r = np.asarray(returns)
    hit = (r < q).astype(float)
    return np.mean((tau - hit) * (r - q))

Что касается Expected Shortfall, отметим, что ES сам по себе не элиситабелен (не существует функции потерь, минимизатор которой был бы только ES) — это подлинная теоретическая тонкость: вы оцениваете ES совместно с VaR, используя правила оценки Fissler-Ziggel, либо прибегаете к более простой практике — проверке того, что средняя величина нарушения соответствует предсказанному моделью ES. Грубая, но полезная проверка ES: среди дней с нарушением VaR сравните средний реализованный убыток со средним прогнозным ES в эти дни — они должны быть близки.

Регуляторный подход — это подход светофора Базеля: за 250 торговых дней 0-4 нарушения 99%-го VaR — "зеленый" (приемлемо), 5-9 — "желтый" (усиленный контроль), 10+ — "красный" (модель отвергается, и мультипликаторы капитала растут). Это более грубый родственник теста Купика, но именно на этом языке действительно говорят риск-комитеты, и его стоит указывать наряду со статистиками LR.

Практические соображения

Когда дополнительные параметры не окупаются

Честный подход по умолчанию — скепсис к сложности. Каждый добавленный параметр — это ручка, которую оптимизатор может переподогнать, а у асимметричного тяжелохвостого GARCH их несколько. Конкретные рекомендации:

  • Неликвидные или короткие выборки. При нескольких сотнях дневных наблюдений стандартная ошибка γ\gamma и λ\lambda будет большой, и вы будете "обнаруживать" асимметрии, которые на самом деле являются шумом выборки. На новом или тонком альткоине симметричный GARCH-tt часто является самой сложной моделью, которую могут поддержать данные. Подгонка skew-tt EGARCH на 200 днях — это самообман.
  • Член скошенности часто не окупает свою стоимость. На практике переход от Normal к tt — крупное и надежное улучшение (тяжелые хвосты реальны и сильны). Переход от tt к skew-tt часто маргинален — прирост BIC в 1-2 пункта, иногда отрицательный. Добавляйте скошенность только тогда, когда данные явно ее требуют.
  • EGARCH против GJR на дневных данных — обычно паритет. Они кодируют одну и ту же качественную историю разными функциональными формами. Выбирайте по вневыборочному бэктесту VaR, а не по тому, у какой лучше внутривыборочное правдоподобие.
  • Более высокая частота меняет ответ. На часовых или минутных барах доминируют внутридневная сезонность и микроструктура, и обычный дневной GARCH неверно специфицирован независимо от асимметрии. Другая задача, другой инструментарий.

Это тот же урок, что и честная оценка без устойчивого преимущества: более сложная модель, которая не выживает вневыборочное тестирование, хуже простой, которую она заменила, потому что несет иллюзию точности. Сообщайте об отрицательном результате — "скошенность не помогла на ETH" — как о реальной находке, и используйте пошаговую оптимизацию как арбитра, а не внутривыборочный AIC.

Это те самые маргинальные распределения, на которых строится все остальное

Модели из этого поста — не конечная точка; это одномерный строительный блок для совместной риск-машинерии. Пост про копула-модели совместного крипто-риска использует именно EGARCH/GJR-tt в качестве маргинальных распределений GARCH-EVT перед подгонкой вайн-копулы — вы оцениваете асимметричный тяжелохвостый GARCH для каждого актива, извлекаете стандартизованные остатки и только затем моделируете межактивную зависимость. Если ваше маргинальное распределение — симметричный гауссовский GARCH, копула унаследует его ошибки в хвостах независимо от того, насколько хороша модель зависимости. Мусорные маргиналы — мусорный совместный VaR.

Для многомерной задачи волатильности — изменяющихся во времени корреляций, а не подневных дисперсий — см. третью часть, DCC-GARCH, которая надстраивает модель динамической корреляции поверх этих одномерных оценок. А для превращения прогноза волатильности в размер позиции и торговый бэктест четвертая часть о таргетировании волатильности использует прогнозы σt+1\sigma_{t+1} из этих же моделей, чтобы масштабировать экспозицию обратно пропорционально прогнозируемому риску.

Альтернатива без предположений о распределении

Весь раздел про риск опирается на параметрическое предположение: что стандартизованные остатки следуют распределению tt или skew-tt. Это предположение проверяемо и обычно разумно, но оно может не выполняться. Если вы не хотите вообще привязываться к форме хвоста, конформное предсказание дает интервалы прогноза без предположений о распределении с гарантиями покрытия для конечной выборки — подлинно другая философия, не делающая никаких утверждений о распределении инноваций. Два подхода дополняют друг друга: параметрический GARCH-tt дает полную условную плотность (а значит, и ES, который конформные интервалы напрямую не предоставляют), в то время как конформный подход дает покрытие, которое выполняется даже когда ваша плотность неверна. В продакшене использование обоих в качестве перекрестной проверки — дешевая страховка.

Численная и рабочая гигиена

  • Масштабируйте доходности на 100. Оптимизаторы GARCH сходятся гораздо надежнее на процентных доходностях, чем на сырых дробных. Не забудьте пересчитать масштаб VaR/ES обратно, если отчитываетесь в дробных единицах.
  • Следите за персистентностью. Если оценка α+β+12γ\alpha + \beta + \tfrac12\gamma выше ~0.999, модель близка к интегрированной (в духе IGARCH); прогнозы возвращаются к среднему крайне медленно, и долгосрочные прогнозы дисперсии становятся ненадежными. Не обязательно неверно, но стоит пометить.
  • Сбои сходимости на скользящих окнах. Логарифмическая форма EGARCH избегает ограничений положительности, но все равно может не сойтись на патологическом окне. Оберните fit() в try/except и откатывайтесь на параметры предыдущего окна вместо того, чтобы обрушивать живой бэктест.
  • Модель среднего. Мы всюду использовали постоянное среднее. Для большей части дневной крипты условное среднее близко к нулю и подавляется волатильностью; не тратьте сложность модели на его прогнозирование без реальной причины.

Резюме

  • У обычного GARCH(1,1) два структурных дефекта: он симметричен (реагирует на +x%+x\% и x%-x\% одинаково, потому что шоки входят как ε2\varepsilon^2) и предполагает гауссовские инновации (недооценивая тяжелые хвосты крипты). Оба обходятся реальными деньгами через чрезмерно оптимистичный VaR.
  • GJR-GARCH добавляет пороговый член γI(εt1<0)εt12\gamma\,I(\varepsilon_{t-1}<0)\,\varepsilon_{t-1}^2. Значимый γ>0\gamma > 0 — это эффект финансового рычага: плохие новости поднимают волатильность сильнее. Положительность требует α+γ0\alpha+\gamma\ge0; персистентность — α+β+12γ\alpha+\beta+\tfrac12\gamma.
  • EGARCH моделирует logσt2\log\sigma_t^2, поэтому нет ограничений положительности, а стационарность — это просто β<1|\beta|<1. Асимметрия входит через знаковый член γzt1\gamma z_{t-1} (эффект рычага — это γ<0\gamma<0 в этом соглашении), отделенный от члена величины zt1|z_{t-1}|.
  • Кривая news impact — дисперсия следующего периода в зависимости от последнего шока — делает асимметрию видимой и проверяет соглашение о знаке EGARCH одним взглядом.
  • Инновации Student-tt (dist='t') исправляют хвосты через число степеней свободы ν\nu (обычно 3–6 для крипты); скошенное распределение Хансена (dist='skewt') добавляет скошенность λ\lambda для более тяжелого левого хвоста. Переход от Normal к tt — крупный надежный выигрыш; от tt к skew-tt часто маргинален.
  • VaR и ES следуют из оцененного условного распределения: VaRα=(μt+1+σt+1Fz1(1α))\text{VaR}_\alpha = -(\mu_{t+1} + \sigma_{t+1}F_z^{-1}(1-\alpha)), при этом тяжелохвостый квантиль делает риск честно больше гауссовского. ES (когерентный, \approx CVaR) отражает средний убыток за пределами VaR.
  • Бэктестируйте тестами Купика и Кристоффersена. Купик проверяет частоту нарушений; Кристоффersен проверяет, что нарушения не кластеризуются. Модель может пройти один тест и провалить другой — кластеризованные нарушения являются опасным режимом отказа. Бэктестируйте строго вне выборки.
  • Дисциплина важнее сложности. Добавляйте асимметрию/скошенность только тогда, когда они выдерживают проверку BIC и вневыборочный бэктест VaR. На коротких или неликвидных рядах более простая модель обычно побеждает.

References:

  • Nelson, D. B. (1991). Conditional heteroskedasticity in asset returns: A new approach. Econometrica, 59(2), 347-370. DOI
  • Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
  • Bollerslev, T. (1987). A conditionally heteroskedastic time series model for speculative prices and rates of return. Review of Economics and Statistics, 69(3), 542-547. DOI
  • Hansen, B. E. (1994). Autoregressive conditional density estimation. International Economic Review, 35(3), 705-730. DOI
  • Engle, R. F., & Ng, V. K. (1993). Measuring and testing the impact of news on volatility. Journal of Finance, 48(5), 1749-1778. DOI
  • Christoffersen, P. F. (1998). Evaluating interval forecasts. International Economic Review, 39(4), 841-862. DOI
  • Kupiec, P. H. (1995). Techniques for verifying the accuracy of risk measurement models. Journal of Derivatives, 3(2), 73-84. DOI
  • Black, F. (1976). Studies of stock price volatility changes. Proceedings of the American Statistical Association, Business and Economic Statistics Section, 177-181.
  • McNeil, A. J., Frey, R., & Embrechts, P. (2015). Quantitative Risk Management: Concepts, Techniques and Tools (2nd ed.). Princeton University Press.
  • Sheppard, K. (2023). arch: Autoregressive conditional heteroskedasticity models in Python. GitHub.
Дисклеймер: Информация в этой статье предоставлена исключительно в образовательных и ознакомительных целях и не является финансовым, инвестиционным или торговым советом. Торговля криптовалютами сопряжена с высоким риском убытков.

MarketMaker.cc Team

Количественные исследования и стратегии

Обсудить в Telegram
Newsletter

Будьте в курсе событий

Подпишитесь на нашу рассылку, чтобы получать эксклюзивную аналитику по AI-трейдингу и обновления платформы.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.