非対称・厚裾GARCH: EGARCH、GJR、そしてStudent-t
このシリーズのPart 1では、GARCH(1,1)をゼロから構築した。ボラティリティ・クラスタリングの直観、条件付き分散の再帰式、最尤推定、予測、そしてarchライブラリを用いた標準的な残差診断である。まだ読んでいない場合はそちらから始めてほしい——本稿は、通常のGARCH(1,1)をすでにフィットさせて解釈できることを前提としており、基礎を再導出することはしない。
通常のGARCH(1,1)は良いベースラインではあるが、最終的な答えとしては不十分である。バックテストでは無視しても安く済むが、実資金を運用する際には無視すると高くつく構造的欠陥が2つある。第一に、このモデルは対称的である。ショックは分散の再帰式にその二乗としてのみ入るため、モデルはの日にもの日にも全く同じように反応する。二乗を取ることで符号の情報が失われる。第二に、このモデルはガウス型イノベーションを仮定している。GARCHがボラティリティ・クラスタリングを吸収した後でも、BTCやETHの標準化残差は明らかに厚い裾を持っており、ガウス尤度は体系的に裾のリスクを過小評価する。GARCH(1,1)-正規分布による99% VaRは、想定される1%をはるかに超えて破られることになる。
本稿ではこの両方の欠陥を修正する。GJR-GARCHとEGARCHで非対称性を追加し、Student-分布とHansenの歪んだ分布(skew-)イノベーションで厚裾を追加する。そして実際に資金を守る作業——フィットさせた条件付き分布を1期先のバリュー・アット・リスクと期待ショートフォール予測に変換し、その予測をKupiecテストとChristoffersenテストで誠実にバックテストする——を行う。リスクテストをしないボラティリティモデルは単なる飾りにすぎない。
レバレッジ効果、そして暗号資産がより厄介な理由
株式市場ではこの非対称性には名前と物語がある。レバレッジ効果(Black, 1976)だ。企業の株価が下落すると負債資本比率が上昇し、株式は機械的にリスクが高くなり、ボラティリティが増加する。悪いニュースは、同じ大きさの良いニュースよりも将来のボラティリティをより大きく引き上げる。実証的には、これは株式ボラティリティ研究において最も頑健な定型化された事実の1つである。
暗号資産には企業会計上の意味での株式もバランスシート・レバレッジも存在しないが、それでもレバレッジ効果に似た非対称性はほとんどの場合現れる——ただしその駆動力は会計処理ではなく強制的なデレバレッジである。BTCが急落すると、過剰担保のローンが清算され、パーペチュアル先物のロングポジションが強制決済され、ファンディングレートが反転し、そのカスケードがボラティリティを増幅させる。したがってメカニズムは異なるが、符号はしばしば株式市場と一致する。下落の方がボラティリティをより大きく急騰させるのだ。
重要な注意点として、暗号資産はより厄介であり、非対称性は法則ではなく実証的な問いとして扱うべきである。激しい上昇の動き——ショートスクイーズ、レバレッジに煽られた急騰、ETF承認によるギャップアップ——もまた実現ボラティリティを急騰させることがある。資産や標本期間によっては、推定される非対称性が強い場合、弱い場合、あるいは「間違った」符号になる場合もある。本稿が求める規律は、非対称モデルをフィットさせ、非対称性パラメータが統計的に有意で、かつ想定される方向にあるかを確認し、追加パラメータがその価値に見合う場合にのみ採用することである。株式市場の物語がそのまま転用できると仮定してはならない。検証せよ。
モデル化する前に非対称性を検定する
上述の方針は「非対称性は実証的に扱う」というものだった——したがって非対称モデルをフィットさせる前に、そもそも非対称性が存在するかどうかの安価な形式検定を行うべきである。Engle-Ng符号バイアス検定(1993)はまさにこれを行う。まず対称GARCH(1,1)をフィットさせ、その標準化残差の二乗を取り、前期ショックの符号と大きさの指標に回帰する。
ここで、である。論理はこうだ。対称モデルがすでに全てを捉えているなら、前日のショックの符号と大きさは今日の残差二乗を予測できないはずであり、したがってとなる。個別の検定はそれぞれ符号バイアス()、負の大きさバイアス()、正の大きさバイアス()検定と呼ばれ、この3つを合わせた同時検定がオムニバス検定である。またはが有意であれば、負のショックが対称モデルによって体系的に誤って価格付けされていることを意味し、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"])
同時検定が有意でなければ、対称モデルにとどまり2つのパラメータを節約する実証的な根拠がある。有意であれば——BTC/ETHではよくある結果だが——GJR/EGARCHへ自信を持って進んでよい。ノイズを追いかけているのではなく、実在する特徴をモデル化していると分かっているからだ。これが冒頭で求めた実証的な規律である。株式のレバレッジ物語を仮定するのではなく、検証せよ。
GJR-GARCH: 閾値項による非対称性
Glosten-Jagannathan-Runkleモデル(1993)——TGARCHや閾値GARCHとも呼ばれる——は、悪いニュースと良いニュースに異なる効果を持たせるための、GARCH(1,1)への最小限の変更である。Part 1で示した対称な条件付き分散の再帰式を思い出そう。
GJRは1つの閾値項を追加する。負のショックの後にのみオンになる、追加の分散量である。
ここでは次の指標関数である。
場合分けでこの再帰式を読んでみよう。正のショック()の後は指標関数がゼロになり、二乗ショックが次期分散に与える影響は単にである。負のショックの後は指標関数が1になり、その影響はとなる。パラメータは非対称性の物語をたった1つの数値に凝縮したものである。
- : 負のショックは同じ大きさの正のショックよりもボラティリティを大きく引き上げる。これがレバレッジ効果であり、BTC/ETHでほとんどの場合見られると予想されるものである。
- : モデルは対称GARCH(1,1)に戻る。したがってに対する尤度比検定または検定は、そもそも非対称性が存在するかどうかの直接的な検定となる。
- : 正のショックがボラティリティをより大きく引き上げる——暗号資産の急騰局面でときおり見られる状況である。稀ではあるが、先験的に排除すべきではない。
正値性と定常性
は依然として加法的に構築されているため、各項が非負を保つ必要がある。十分な正値性の条件は次の通りである。
である限り、自体は負であってもよいことに注意されたい。これにより、悪いニュースの後の影響が負になることはない。
共分散定常性については、イノベーションがゼロを中心とした対称分布で標準化されていると仮定する。するととなり、指標関数は平均してを寄与する。定常性条件は次のようになる。
このとき無条件(長期)分散は次のようになる。
これはPart 1の結果のGJR版であり、追加の項がレバレッジ半減期の平均的な寄与を説明している。イノベーション分布が歪んでいる場合(後述のHansenのskew-)、このはとなる実際の確率に置き換わるが、報告されるパーシステンスの標準的な参照値としてはが用いられる。
EGARCH: 対数分散のモデル化、正値性制約なし
GJRは分散正値性という制約に縛られたままである。すべてのパラメータの組み合わせを不等式制約に照らして確認する必要があり、最適化の際には煩わしく、ローリング再推定の際にはウィンドウが時折実行不可能な領域に迷い込むため、さらに厄介になる。Nelsonの指数GARCH(1991、Exponential GARCH)は、条件付き分散の対数をモデル化することでこれを完全に回避する。は任意の実数を取りうるため、パラメータがどのような値であってもは自動的に正になる。課すべき制約は何もない。
標準化イノベーションを用いて再帰式を書くと次のようになる。
ショックを運ぶ項は2つあり、それらを分離することがこのモデルの核心である。
- 大きさの項は、符号を除いたショックの大きさに反応する。を差し引くことで中心化され、平均的な大きさのショックは何も寄与しないようになる。標準正規分布の場合であり、標準化Student-分布の場合、期待絶対値はそれより小さくに依存するが、
archが内部でこれを処理する。 - 符号の項が非対称性を表す。これは符号付きイノベーションに関して線形なので、負のは正の場合とは反対方向にを押しやる。
符号の慣習には注意が必要で、誤解を招きやすい。このパラメータ化では、レバレッジ効果(悪いニュースがボラティリティを引き上げる)はに対応する。負のショックのときとなり、対数分散を増加させるからだ。これはGJRのとは逆の符号である。記憶に頼らず、常にモデル自身のドキュメントで慣習を確認すべきである。archはEGARCHを独自の符号で報告するため、後述するニュース・インパクト曲線で検証することにする。
すべてが対数において加法的であるため、EGARCH(1,1)のパーシステンスはに対する単一の自己回帰係数によって支配される。定常性の要件はのみである。これはGJRの不等式条件よりもはるかに単純であり、ローリングウィンドウで再フィットする際に実質的な利点となる。
述べておくべき微妙な点として、EGARCHのショックに対する反応は(最後に指数を取るため)イノベーションに関して指数的であるのに対し、GJRは二次的である。したがってEGARCHは大きなショックに対してより激しく反応する——テールイベントこそが重要な暗号資産では長所となるが、同時に外れ値の日の後に非現実的なほど大きな分散予測を出してしまうことがある理由でもある。どちらが普遍的に優れているということはなく、アウトオブサンプルのフィットとリスクバックテストによって選択する。それがこのシリーズ全体の主眼である。
ニュース・インパクト曲線
対称GARCH、GJR、EGARCHの違いを目で見る最も明快な方法がニュース・インパクト曲線(Engle and Ng, 1993)である。を長期水準に固定し、次期の条件付き分散を直前のショックの関数としてプロットする。これは「このサイズと符号のショックが与えられたとき、モデルは明日のボラティリティをどれだけ引き上げるか」という問いに答えるものである。
- 対称GARCHはゼロを中心とした対称な放物線を描く。とのショックは同じ高さに着地する。これがまさに我々が修正している欠陥である。
- GJRはゼロで折れ曲がった放物線を描く——のとき、右側(正のショック)より左側(負のショック)の方が急である。左右それぞれの曲率はとである。
- EGARCHは非対称な指数関数的V字型を描く。両腕は項のために異なる傾きを持ち、最終的な指数化のために全体が放物線よりも速く上向きに湾曲する。
これら3つを実装セクションでフィット済みパラメータからプロットする。非対称性が何をもたらすかを伝えるうえで最も有用な診断図である。
厚裾: Student-tと歪んだt分布のイノベーション
非対称性はモデルのショックの符号に対する反応を修正する。しかしショック自体の分布については何もしない。通常のGARCHはを仮定しており、この仮定は暗号資産に対してはほぼ常に誤りである。GARCHがボラティリティ・クラスタリングを除去した後でも、標準化残差は過剰尖度を保持している——つまり裾が厚いのである。分布の肩の部分をフィットするガウス尤度は、4シグマ、5シグマ、あるいは6シグマの標準化された日が実際にどれほどの頻度で発生するかを過小評価する。
これがリスクに与える影響は直接的である。ガウス型99% VaRは分位点を用いるため、と予測する。もし真の標準化分布が自由度のStudent-であれば、真の1%分位点は付近であり、ガウス型VaRはその信頼水準でおよそ楽観的である。想定される1%をはるかに超える頻度でVaRが破られ、「あり得ない」日に体系的に驚かされることになる。これは暗号資産特有の奇妙さではない。Bollerslev(1987)はまさに株式やFXの残差が同じ厚い裾を示していたためにt-GARCHを導入した。暗号資産は同じ問題のより極端な版にすぎない。
標準化Student-t分布
Student-密度は、裾の厚さを制御する自由度パラメータを持つ。小さいは厚い裾を意味し、のとき分布はガウス分布に収束する。注意すべきは、生の分布の分散がであることだ。したがってイノベーションとして使う前に単位分散へと標準化する必要がある——さもなければGARCH再帰式中の「」は実際には条件付き標準偏差にならない。
単位分散を持つ標準化Student-イノベーションの密度は次の通りである。
内部のに注目してほしい——これが標準化であり、となるよう再スケーリングしている。GARCHの条件付き分散とが与えられたとき、1観測あたりの対数尤度の寄与は次のようになる。
の項はからへの変換のヤコビアンであり、Part 1のガウスGARCH尤度で見たのと同じ項である。変わるのは形状のみである。をGARCHパラメータとについて同時に最大化することが、dist='t'を渡したときにarchが行っていることそのものである。
推定された自体が有益な情報である。BTC/ETHの日次リターンでは典型的にの範囲に収まる——厚い裾ではあるが、(が必要な)有限分散を持ち、通常は(が必要な)有限尖度を持つ。フィットしたが4を下回る場合、モデル上では標本尖度が技術的には無限大になり、一部の推定量が不安定になることがあるため注意されたい。外れ値とデータ品質を厳しく確認する合図である。
Hansenの歪んだt分布(skew-t)
Student-は厚い裾を持つが依然として対称である——左右の裾は等しく厚い。暗号資産のリターン残差はしばしば歪んでもいる。左裾(暴落)が右裾より厚いのである。Hansenのskew-分布(1994)は、に加えて歪度パラメータを導入することで標準化分布を一般化する。
ここで定数、、は、有効なのすべてに対してが平均ゼロ・分散1になるよう選ばれている。分布はで分岐し、それぞれの部分で異なるスケーリングを用いて片方の裾により多くの質量を曲げ込む。
解釈すると、は左に歪んだ分布(下方がより厚い)を与える。これは暗号資産で通常見られる結果であり、レバレッジ効果と組み合わさることが予想される。は対称Student-に戻るため、の検定は歪み項が何かをもたらしているかどうかを教えてくれる。archではこれはdist='skewt'であり、との両方を推定する。その見返りは、左裾の分位点が右裾の分位点よりも誠実に厚いVaRである——生き残ろうとしている損失が非対称であるときにまさに欲しいものだ。これは、ポジションの結果における損失と利益の非対称性と直接つながっている。のドローダウンから回復するにはを超えるリターンが必要であるため、左裾のモデル化を誤ることは右裾を誤ることよりも高くつくのである。
Python実装
ここからはarchライブラリでこれらすべてをフィットさせる。セットアップはPart 1を踏襲する。日次リターンを取得し、数値的な安定性のために100倍にスケーリングし(GARCHオプティマイザはリターンがのとき挙動が悪くなる)、定数平均でフィットする。日中データや異なる平均モデルを使いたい場合も、仕組みは同一である。
セットアップとデータ
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時間365日取引されるため、252ではなく365で年率換算する——暗号資産のシャープレシオやボラティリティを株式デスクの数字と比較する際に、小さいながらも繰り返し混乱を招く点である。
4つのモデルをフィットする
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引数が非対称項()を制御し、p/qが大きさとラグの項を制御する。o=1, p=1, q=1が標準的なEGARCH(1,1)である。1つ注意点として、archにおけるEGARCHのパラメータ名は同じ文字だが、非対称項の符号の慣習はNelsonのものであるため、負の推定値がレバレッジ効果を意味する。これは記憶に頼らずニュース・インパクト曲線から検証する。
GJRのフィット結果を読む
GJR-のパラメータ表はおおよそ次のようになる(例示的な数値であり報告された実験結果ではない——各自のデータで再フィットすること)。
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で値が3を超えているのは、統計的に有意なレバレッジ効果である。負のショックの後、二乗ショックの影響はになり、正のショックの後は単にである。悪いニュースは、同じ大きさの良いニュースのおよそ倍このモデルのボラティリティを動かす。nu = 4.3は厚い裾を裏付けている——ガウス分布()からは程遠く、4次モーメントがぎりぎり有限であるほど低い。このシリーズに対するガウス型VaRは著しく楽観的になるだろう。- パーシステンスはであり、日次の暗号資産では通例通り非常に高い。ショックの減衰は遅く、ボラティリティは強くクラスタリングしている。
確認すべき最も重要な行はの行である。そのp値が大きければ、非対称項はこの資産とウィンドウにおいてその価値に見合わず、よりシンプルな対称モデルを選ぶべきである。これは飾りではなく、モデル選択の規律である——詳しくは以下で述べる。
情報量基準によるモデル比較
対数尤度はパラメータを追加すると常に改善するため、対数尤度だけでは選択できない。パラメータ数にペナルティを課す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))
経験則としての解釈は次の通りである。ベースラインに対して6以上のBIC改善は、追加の構造が本物であることの強い証拠である。1〜2の差はノイズである。もしGJR-tがGARCH-NをBICで30ポイント以上上回るが、GJR-skewtがGJR-tをわずか1ポイントしか上回らないなら、を維持し歪みを捨てるべきである——このデータでは歪みパラメータは元が取れていない。AIC/BICをアウトオブサンプル検証の代替として読んではならない。これらは複雑さで調整したイン・サンプルのフィットに報酬を与えるものであり、必要条件ではあるが十分条件ではない。本当の検定はVaRバックテストであり、最終的にはウォークフォワード評価である。
ニュース・インパクト曲線をプロットする
これが成果を示すプロットである。非対称性を可視化し、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曲線はゼロを中心とした綺麗な放物線になる——とのショックは同じ分散を与える。GJR-tは原点で折れ曲がった放物線で、左側の腕の方が高い。EGARCH-tは指数関数的なV字型であり、左側の腕が右側の腕より上にあれば、一目でレバレッジ効果と符号の慣習の両方が確認できたことになる。もしEGARCHの左腕が右腕の下にあるなら、が正に推定された(上昇ボラティリティ局面)か、符号が逆になっているかのいずれかであり、このプロットが推測なしにどちらかを教えてくれる。
4つのモデルの並列比較
リスクの議論に移る前に、4つのモデルを並べて見ておくと有用である。各行は設計上の決定であり、各列はその決定が何を犠牲にし、何をもたらすかを示している。
| 特性 | GARCH-N | GJR-t | EGARCH-t | GJR-skewt |
|---|---|---|---|---|
| 非対称性(ショックの符号) | なし | 閾値 | 符号付き | 閾値 |
| イノベーションの裾の形状 | ガウス分布 | Student- | Student- | skew- |
| イノベーションの歪み | なし | なし | なし | あり() |
| 正値性制約 | あり | あり() | なし(対数形式) | あり |
| 定常性条件 | ||||
| ベースラインに対する追加パラメータ | 0 | |||
| 暗号資産における典型的な評価 | VaRバックテストで失敗 | 強く頑健 | 強く頑健 | GJR-tに対して限界的 |
内在化すべきパターンは、列1から列2への飛躍——非対称性と厚裾を同時に追加すること——にリスク較正の改善のほぼすべてが宿っているということだ。それ以降の洗練(EGARCHの関数形式、歪み項)は本物ではあるが二次的であり、多くの暗号資産の系列ではノイズの範囲内に収まる。モデリングの予算は最初の飛躍に費やし、残りには懐疑的であるべきだ。
リスク応用: VaRと期待ショートフォール
より凝ったボラティリティモデルをフィットする価値があるのは、それが意思決定を改善する場合のみである。改善すべき最もクリーンな意思決定は、1期先のテールリスク予測である。明日はどれほど悪くなりうるか。フィットさせたGARCH-/skew-予測から直接、1日先のバリュー・アット・リスクと期待ショートフォール(HRP/CVaRポートフォリオ・パイプラインが目的関数として使う条件付きVaRとも呼ばれる)を算出する。
条件付き分布からVaRへ
GARCHの仕組みは、条件付き平均と条件付き標準偏差の1期先予測を与える。リターンはとしてモデル化され、はフィットさせた標準化分布(ガウス、、またはskew-)から引かれる。したがってリターンの分位点は、標準化分布の分位点のアフィン変換に他ならない。
ここでは標準化イノベーションの分位点(逆累積分布関数)であり、先頭のマイナス符号はVaRを正の損失額とする慣習に従っている。99% VaRの場合、でありを代入する。/skew-の恩恵はここに全て現れる。はガウスのよりも負に大きく、したがってVaRは誠実に大きくなる。
期待ショートフォール
VaRは閾値を教えてくれるが、破られたときにどれほど悪いかについては何も語らない。期待ショートフォール——VaRを超過した条件での平均損失——はそれを教えてくれるうえ、コヒーレント(劣加法的)である。これがCVaR最適化の背後にあるリスク尺度である理由であり、Baselがこれに移行した理由でもある。位置尺度モデルの場合、
条件付きテール期待値の項は標準的な分布に対して閉じた形を持つ。ガウス分布の場合、として、
ここでは標準正規分布の確率密度関数である。自由度を持つ標準化Student-分布の場合、(標準化スケール上)として、テール期待値は
ここでは標準化分布の確率密度関数である。分布の期待ショートフォールはガウス分布のそれをVaR以上に上回る。なぜなら分布の裾は単に遠くにあるだけでなく、より厚いため、閾値を超えた平均損失は不釣り合いに大きくなるからである。この余分な差こそが、ガウスモデルがあなたから隠している数字である。
フィットしたarchモデルからVaRとESを計算する
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列がすべてを1つの数値で物語っている。ガウスモデルはを使い、の分布は付近の値を使い、skew-は左の分位点をさらに押し出しつつ右の分位点を引き寄せる。同じに対して、VaRは実質的に大きくなる。もし暗号資産でガウス型VaRを運用してきたなら、これがあなたが静かに吸収してきたギャップである。
1期先とマルチステップ: 注意点
これまでの内容はすべて1日先の予測であり、GARCH VaRが最もクリーンに機能する範囲である。より長いホライズンでは2つの点が事態を複雑にするため、外挿する前に知っておくべきである。
第一に、分散予測は平均回帰する。定常GARCHの期先条件付き分散は、が大きくなるにつれて無条件水準に向かって収束し、累積日分散は各期予測の合計である——ボラティリティが長期平均にある場合を除き、にはならない。単純な「時間の平方根」スケーリングはこの平均回帰を無視しており、まさにショックの後——その数字が最も必要とされるときに間違っている。モデル自身のマルチステップ分散パスを使うべきである。
第二に、複数日リターンの分布は1日イノベーションと同じ形にはならない。複数の分布に従う日次ショックを(非線形なGARCH再帰式を通じて)合算しても、日ホライズンで分布にはならない。きれいな閉じた形は存在しない。複数日VaRに対する誠実なアプローチはシミュレーションである。フィットさせた標準化分布からイノベーションのパスを引き、GARCH再帰式に通してシミュレートしたリターンパスを得て、日リターンに集約し、経験分位点を読み取る。これはskew-のケースも自然に扱う。skew-には解析的なマルチホライズン分位点がそもそも存在しないからだ。本稿の1期先解析公式は厳密であり、マルチステップの近似は検証すべき近似として扱うべきである。
VaRのバックテスト: KupiecとChristoffersen
VaR予測は確率的な主張である。「損失がこの閾値を超えるのはの日にちのみである」というものだ。これを検証するには、ウォークフォワード評価にわたって違反(実現損失が予測VaRを超えた日)を数え、2つのことを確認する。第一に、違反率は正しいか。第二に、違反は独立しているか、それともクラスタリングしているか(これはモデルがボラティリティ急騰時、まさに重要な局面で失敗することを意味する)。
を違反系列、を日間の違反回数、を観測された違反率とする。目標率はである。
Kupiecの無条件被覆検定(1995)は、尤度比を用いてを確認する。
Christoffersenの独立性検定(1998)は、今日の違反が昨日の違反によって予測されないことを確認する。を違反系列における状態から状態への遷移回数、、、とする。すると、
この2つを組み合わせると条件付き被覆検定が得られ、正しい率と独立性を同時に確認できる。モデルはKupiec検定(正しい違反回数)に合格しながらChristoffersen検定(すべてが1回の暴落週に集中していた)に失敗しうる——これはあなたが最も捕まえたい失敗パターンである。クラスタリングした違反こそが口座を吹き飛ばすものだからだ。
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の入力を誠実に生成するには、拡大ウィンドウまたはローリングウィンドウで再フィット(あるいは少なくとも再予測)を行い、アウトオブサンプルの各日について1期先の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%に近く、Kupiec検定が非有意(p_ucが大きい)、Christoffersen検定も非有意(p_indが大きい)——クラスタリングなし、となる。実際には、暗号資産における誠実な結果としてGARCH-Normalモデルは Kupiec検定に失敗する(違反が多すぎ、p_ucが小さい)一方で、GJR-またはEGARCH-は合格するか、それに近いことが多い。この対比こそが、本稿の主張全体を仮説検定として表現したものである。もしモデルでさえクラスタリングした違反を示すなら(p_indが小さい)、ボラティリティ動学は依然として誤って定式化されている——しばしばより長い記憶(コンポーネント/FIGARCH)やレジーム層が必要な合図であり、これはHMMによるレジーム検出とつながっている。
合否だけでなくテール損失でモデルを順位付けする
KupiecとChristoffersenは二値の判定を与えてくれる——モデルは棄却されるか、されないかである。それは必要ではあるが粗い。2つのモデルがどちらも「合格」しつつ、一方が意味のある差でシャープであることがある。競合するVaR予測を順位付けするには、分位点に対して厳密に一貫した損失関数であるピンボール(分位点)損失でスコアリングする。
ここでは(符号付き)VaR分位点、は実現リターンである。アウトオブサンプルの日にわたって平均を取ると、平均ピンボール損失が低いほど較正がよくかつシャープな分位点であることを意味する。この損失は分位点に対して一貫しているため、それを最小化してもモデルが単に幅広くなることへの報酬にはならない。2つのモデルを形式的に比較するには、日次の損失差を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))
期待ショートフォールについて特筆すべきは、ESは単独では誘発可能(elicitable)ではない(最小化するとES単独が得られるような損失関数は存在しない)という点である。これは本物の理論的な難点であり、Fissler-Ziegelスコアリングルールを用いてVaRと同時にESを評価するか、あるいは平均違反幅がモデルの予測ESと一致するかを確認するというよりシンプルな実務に頼るしかない。粗いが有用なESの確認方法として、VaR違反日の中で、実現損失の平均値をそれらの日のES予測の平均値と比較するというものがある——両者は近い値であるべきだ。
規制上の枠組みはBaselのトラフィックライト方式である。250取引日にわたって、99% VaRの違反が0〜4回であれば「グリーン」(許容範囲)、5〜9回であれば「イエロー」(精査対象)、10回以上であれば「レッド」(モデルは棄却され資本乗数が上昇する)。これはKupiec検定の粗い親戚だが、リスク委員会が実際に使う言葉であり、LR統計量と並べて報告する価値がある。
実務上の留意点
追加パラメータが元を取らない場合
誠実なデフォルトは複雑さに対する懐疑である。追加するすべてのパラメータは、オプティマイザが過剰適合できるつまみであり、非対称厚裾GARCHにはいくつもある。具体的な指針は次の通りである。
- 流動性が低い、あるいは短い標本。 日次観測が数百程度しかない場合、との標準誤差は大きくなり、標本ノイズにすぎない非対称性を「検出」してしまうだろう。新しい、あるいは薄いアルトコインでは、対称GARCH-がデータの支持できる最も複雑なモデルであることが多い。200日のデータにskew- EGARCHをフィットするのは自分を欺いているだけである。
- 歪み項はしばしばそのコストを回収できない。 実務では、正規分布から分布への移行は大きく信頼できる改善である(厚い裾は実在し強い)。分布からskew-分布への移行はしばしば限界的で、BICの改善が1か2、時には負であることもある。データが明確に求める場合にのみ歪みを追加すべきである。
- EGARCH対GJRは日次データではほぼ引き分けであることが多い。 どちらも同じ質的な物語を異なる関数形式で符号化している。イン・サンプルの尤度がどちらがきれいかではなく、アウトオブサンプルのVaRバックテストで選ぶべきである。
- より高い頻度では答えが変わる。 時間足や分足では日中の季節性とマイクロストラクチャーが支配的になり、非対称性の有無にかかわらず通常の日次スタイルのGARCHは誤って定式化されている。問題が異なれば、道具立ても異なる。
これは頑健なエッジが存在しない場合の誠実な評価と同じ教訓である。アウトオブサンプル検証を生き残らないより複雑なモデルは、それが置き換えたシンプルなモデルよりも劣る。精密さの幻想を伴うからである。「歪みはETHでは役立たなかった」という否定的な結果を実在する発見として報告し、イン・サンプルAICではなくウォークフォワード最適化を裁定者として使うべきである。
これらは他のすべてが依拠する限界分布である
本稿のモデルは終着点ではなく、同時リスクの仕組み全体の単変量の構成要素である。暗号資産の同時リスクのためのコピュラモデルの記事では、ヴァインコピュラをフィットする前のGARCH-EVT限界分布として、まさにEGARCH/GJR-を使っている。資産ごとに非対称厚裾GARCHをフィットし、標準化残差を抽出し、その後初めて資産間の依存関係をモデル化するのである。もし限界分布が対称ガウスGARCHなら、依存モデルがどれほど優れていても、コピュラはその裾の誤差を引き継いでしまう。限界分布がゴミなら、同時VaRもゴミである。
多変量ボラティリティの問題——資産ごとの分散ではなく時間変化する相関——については、これらの単変量フィットの上に動的相関モデルを重ねるPart 3、DCC-GARCHを参照されたい。そして、ボラティリティ予測をポジションサイジングとトレーディング・バックテストへと変換する方法については、Part 4のボラティリティ・ターゲティングが、まさにこれらのモデルの予測を使って予測リスクに反比例させてエクスポージャーをスケーリングしている。
分布に依存しない代替手法
リスクのセクションのすべては、標準化残差が分布またはskew-分布に従うというパラメトリックな仮定に基づいている。この仮定は検証可能であり通常は妥当だが、失敗することもある。裾の形状に一切コミットしたくない場合、コンフォーマル予測は有限標本での被覆保証を持つ分布に依存しない予測区間を与えてくれる——イノベーション分布について何の主張もしない、根本的に異なる哲学である。この2つのアプローチは補完的である。パラメトリックなGARCH-は完全な条件付き密度を与えてくれる(したがってコンフォーマル区間が直接提供しないESも与えられる)一方、コンフォーマルは密度が間違っていても成り立つ被覆を与えてくれる。実運用では、両方をクロスチェックとして使うのは安価な保険である。
数値・ワークフロー上の衛生管理
- リターンを100倍にスケーリングする。 GARCHオプティマイザは、生の小数リターンよりもパーセントリターンの方がはるかに信頼性高く収束する。小数単位で報告する場合はVaR/ESのスケールを戻すことを忘れないこと。
- パーシステンスに注意する。 の推定値が~0.999を超える場合、モデルはほぼ単位根に近い状態(IGARCH的)にある。予測は極めて緩慢にしか平均回帰せず、長期の分散予測は信頼できなくなる。必ずしも誤りではないが、フラグを立てておくべきである。
- ローリングウィンドウでの収束失敗。 EGARCHの対数形式は正値性制約を回避するが、それでも病的なウィンドウでは収束に失敗しうる。
fit()をtry/exceptで包み、実運用のバックテストをクラッシュさせるのではなく、前のウィンドウのパラメータにフォールバックすべきである。 - 平均モデル。 本稿全体を通じて定数平均を使用した。ほとんどの日次暗号資産では条件付き平均はゼロに近くボラティリティに埋もれるため、本当に理由がない限り、それを予測することにモデルの複雑さを費やすべきではない。
まとめ
- 通常のGARCH(1,1)には2つの構造的欠陥がある。 対称的である(ショックがとして入るためとに同じ反応をする)ことと、ガウス型イノベーションを仮定する(暗号資産の厚い裾を過小評価する)ことである。どちらも楽観的なVaRを通じて実際の損失につながる。
- GJR-GARCHは閾値項を追加する。有意なはレバレッジ効果である。悪いニュースはボラティリティをより大きく引き上げる。正値性にはが必要であり、パーシステンスはである。
- EGARCHはをモデル化するため、正値性制約はなく、定常性は単にである。非対称性は符号付きの項(この慣習ではレバレッジは)を通じて入り、大きさの項と分離されている。
- ニュース・インパクト曲線——次期分散を直前のショックに対してプロットしたもの——は非対称性を可視化し、EGARCHの符号の慣習を一目で検証する。
- Student-イノベーション(
dist='t')は自由度(暗号資産では典型的に3〜6)を介して裾を修正する。Hansenのskew-(dist='skewt')はより厚い左裾のために歪度を追加する。正規分布から分布への移行は大きく信頼できる改善であり、分布からskew-分布への移行はしばしば限界的である。 - VaRとESはフィットさせた条件付き分布から導かれる。であり、厚裾の分位点によりリスクはガウス分布より誠実に大きくなる。ES(コヒーレント、 CVaR)はVaRを超えた平均損失を捕捉する。
- KupiecとChristoffersenでバックテストする。 Kupiecは違反率を確認し、Christoffersenは違反がクラスタリングしていないことを確認する。モデルは一方に合格しながらもう一方に失敗しうる——クラスタリングした違反こそ危険な失敗パターンである。厳密にアウトオブサンプルでバックテストすべきである。
- 複雑さより規律を優先する。 非対称性/歪みは、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
クオンツ・リサーチ&戦略