🎓 レベル:標準 | 重要度:A(必須)
📎 前提:定常性と自己相関(ACF・分散) | 対比:ARMA・ARIMAモデル(条件付き平均) | 数理:確率過程(マルコフ連鎖・ポアソン過程)(統計)
要点(BLUF)
- これまで(ARIMA など)はすべて条件付き平均 をモデル化してきました。本章は条件付き分散 が時間変化する現象を扱います。金融リターンに典型です。
- ARCH():分散を過去のショックの2乗で決める 。GARCH():さらに過去の分散も足す 。GARCH(1,1) が定番です。
- 定常条件は 、そのときの無条件分散は 。真の を仕込んだ系列を
archが復元し、推定ボラティリティが時期で膨らむ様子をコードで確かめます。
1. 条件付き平均から条件付き分散へ
第2〜5章のモデルはすべて、過去から**水準(平均)**を予測するものでした。ARIMA は
と書け、誤差の分散 は時間によらず一定と仮定していました(定常性と自己相関 の弱定常)。ところが金融リターンを見ると、平均はほぼ0で予測不能なのに、変動の大きさ(分散)は時期で大きく変わる——荒れる時期と凪の時期がある。これを捉えるのが本章で、平均ではなく分散そのものを過去の関数にするのが発想の転換です。
は標準化されたノイズ(標準正規など)、 が条件付き標準偏差=ボラティリティ。 を過去のショック や過去の分散 で決める漸化式がモデルの本体です。平均方程式は定数 (リターンはほぼ無相関なので でもよい)で十分なことが多い——主役は分散の方です。
2. ARCH():過去のショックの2乗で分散を決める
Engle (1982) の ARCH()(自己回帰条件付き分散不均一, AutoRegressive Conditional Heteroskedasticity) は、条件付き分散を過去 期のショックの2乗の線形和で表します。
直観は「大きなショック が来た翌期は分散が大きくなる」。 の符号は2乗で消えるので、上げでも下げでも「大きく動いた」こと自体が次の分散を押し上げます。これがボラティリティクラスタリング(ボラティリティクラスタリングと予測)の最小の数式表現です。非負制約は分散が負にならないため。難点は、変動の持続を表すのに** を大きく取る必要がある**こと——AR を MA で近似するような冗長さが出ます。
3. GARCH():過去の分散も足す(倹約版)
Bollerslev (1986) の GARCH()(一般化ARCH) は、ARCH に過去の条件付き分散 を足します。
過去の分散を再帰的に取り込むことで、少ない項で長い記憶を表せます——ARMA が AR を倹約したのと同じ構図(ARMA・ARIMAモデル)。実務の定番は GARCH(1,1):
ここで重要な2つの量があります。
- 定常条件(分散が発散しない):。この和を**持続性(persistence)**と呼び、1 に近いほどボラティリティのショックが長く尾を引きます。
- 無条件分散(長期の平均的な分散):定常なら を取って より
で無条件分散が発散することからも、 が定常性の境界だと分かります。
コード①:真の を GARCH(1,1) で復元
真の (持続性 、無条件分散 )を仕込んだゼロ平均 GARCH(1,1) のリターンを arch で生成し、同じ arch の arch_model で3つのパラメータを復元します。arch は 8.0.0 を使用します。
import numpy as np
from arch.univariate import ZeroMean, GARCH, Normal
from arch import arch_model
# 真の GARCH(1,1): sigma_t^2 = omega + alpha*eps_{t-1}^2 + beta*sigma_{t-1}^2
omega_true, alpha_true, beta_true = 0.2, 0.10, 0.85
# --- 真のパラメータでゼロ平均GARCH(1,1)のリターンを生成 ---
sim_model = ZeroMean()
sim_model.volatility = GARCH(p=1, q=1)
sim_model.distribution = Normal(seed=np.random.default_rng(42)) # 再現用
sim = sim_model.simulate([omega_true, alpha_true, beta_true], nobs=4000)
returns = sim["data"].values
# 定常条件 alpha+beta<1 と無条件分散 omega/(1-alpha-beta)
persistence = alpha_true + beta_true
uncond_var = omega_true / (1 - persistence)
print(f"alpha+beta = {persistence:.3f} (stationary if < 1)")
print(f"unconditional var = omega/(1-alpha-beta) = {uncond_var:.3f}")
print(f"sample var of returns = {returns.var():.3f}")
# --- arch でパラメータを復元 ---
fit = arch_model(returns, mean="Zero", vol="GARCH", p=1, q=1, dist="normal").fit(disp="off")
om = fit.params["omega"]; al = fit.params["alpha[1]"]; be = fit.params["beta[1]"]
print(f"{'param':>8}{'true':>10}{'est':>10}")
print(f"{'omega':>8}{omega_true:>10.3f}{om:>10.3f}")
print(f"{'alpha':>8}{alpha_true:>10.3f}{al:>10.3f}")
print(f"{'beta':>8}{beta_true:>10.3f}{be:>10.3f}")
print(f"est alpha+beta = {al+be:.3f} est uncond var = {om/(1-al-be):.3f}")
出力:
alpha+beta = 0.950 (stationary if < 1)
unconditional var = omega/(1-alpha-beta) = 4.000
sample var of returns = 3.845
param true est
omega 0.200 0.243
alpha 0.100 0.086
beta 0.850 0.851
est alpha+beta = 0.937 est uncond var = 3.863
出力の意味:最尤推定が と、仕込んだ を概ね復元しました( と は相関が強く分離がやや難しいのが GARCH の癖です)。推定された持続性 は真値 に近く、推定無条件分散 は標本分散 とよく一致——「分散が時間変化していても、構造を仮定すればパラメータを当てられる」ことが確認できます。なお res.summary() は記号を含むので、ここでは fit.params['omega'] のように個別の数値だけを取り出しています。
4. 推定したボラティリティを可視化する
推定後、各時点の条件付きボラティリティ は fit.conditional_volatility で取り出せます。これを系列に重ねると、分散が時期によって膨らむ様子(ボラティリティクラスタリング)が目で見えます。
コード②:条件付きボラティリティ を重ねる
同じ擬似 GARCH 系列を推定し、リターンの直下に を描きます。あわせて、ボラティリティが低い時期(下位25%)と高い時期(上位25%)でリターンの大きさ がどれだけ違うかを数値で対比します。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語ラベル用
from arch.univariate import ZeroMean, GARCH, Normal
from arch import arch_model
# 真の GARCH(1,1) を生成(コード(1)と同じ構造)
sim_model = ZeroMean()
sim_model.volatility = GARCH(p=1, q=1)
sim_model.distribution = Normal(seed=np.random.default_rng(42))
returns = sim_model.simulate([0.2, 0.10, 0.85], nobs=4000)["data"].values
# GARCH(1,1) を推定し、条件付きボラティリティ sigma_hat_t を取り出す
fit = arch_model(returns, mean="Zero", vol="GARCH", p=1, q=1, dist="normal").fit(disp="off")
vol = fit.conditional_volatility # 各時点の sigma_hat_t(標準偏差)
uncond_sd = np.sqrt(0.2 / (1 - 0.10 - 0.85)) # 無条件SD = sqrt(4)=2
# 高ボラ・低ボラ期間を数値で対比
print(f"sigma_hat: min={vol.min():.2f} median={np.median(vol):.2f} max={vol.max():.2f}")
print(f"unconditional SD = {uncond_sd:.2f}")
calm = returns[vol < np.percentile(vol, 25)]
turb = returns[vol > np.percentile(vol, 75)]
print(f"|return| mean calm(low-vol)={np.abs(calm).mean():.2f} turbulent(high-vol)={np.abs(turb).mean():.2f}")
fig, ax = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
ax[0].plot(returns, color="gray", lw=0.6)
ax[0].set_ylabel("リターン r_t"); ax[0].set_title("擬似リターン(変動が時期で膨らむ=ボラティリティクラスタリング)")
ax[1].plot(vol, color="C3", lw=1.0, label="推定ボラティリティ sigma_hat_t")
ax[1].axhline(uncond_sd, ls="--", color="k", lw=1, label="無条件SD")
ax[1].set_ylabel("sigma_hat_t"); ax[1].set_xlabel("時点 t"); ax[1].legend()
plt.tight_layout(); plt.show()
出力:
sigma_hat: min=1.25 median=1.87 max=4.06
unconditional SD = 2.00
|return| mean calm(low-vol)=1.29 turbulent(high-vol)=1.95
出力の意味:推定ボラティリティ は から まで動き、無条件SD の周りを揺れます。ボラが低い時期のリターンの大きさは平均 、高い時期は ——荒れる時期は実際に大きく動いている。図では下段の が膨らむ位置で、上段のリターンの振れ幅も大きくなります。これが GARCH が捉えている「分散の時間変化」で、点予測(平均≈0)だけでは表せない情報です。次ノートでは、この性質を検定で確かめ、予測へつなげます(ボラティリティクラスタリングと予測)。
5. 数式の直観
- GARCH(1,1) は分散の指数平滑: を展開すると 。つまり過去のショックの2乗を で指数的に重み付けた加重平均+定数。 が大きいほど古いショックの記憶が長く残ります(指数平滑法(SES・Holt・Holt-Winters) の重み付けと同じ形)。
- 持続性 がショックの寿命を決める: の無条件平均からの乖離は で、 が AR(1) 係数のように効く。 に近いほど高ボラ・低ボラの局面が長続きします。
- 無条件分散は均衡点: は分散の長期的な落ち着き先。多期先のボラ予測はここへ収束します(ボラティリティクラスタリングと予測 のコードで確認)。
⚠️ よくある誤解・落とし穴
- 「平均をモデル化しているのと同じ」ではない:ARIMA は条件付き平均、GARCH は条件付き分散。両者は別物で、しばしば平均(ARMA)と分散(GARCH)を同時に当てます(ARMA-GARCH)。リターンの平均はほぼ予測不能でも、分散は予測できる、というのが要点です。
- 「 でも推定できるからよい」ではない: は非定常(無条件分散が存在しない・IGARCH)。推定値が に張り付くときはデータ長・外れ値・構造変化を疑います。定常を前提とする予測の解釈が崩れます。
- 「非負制約を忘れてよい」ではない: は分散が負にならないための条件。素朴に OLS で当てると負の分散が出るので、最尤推定(
archが内部で実施)が必要です。 - 「正規分布で十分」ではない:実データのリターンは裾が厚い(fat tail)。
dist="t"(Student-t)にすると裾を当てやすく、予測区間の較正が改善することが多い。ここでは真の構造が正規なのでnormalを使っています。 - 「ARCH/GARCH の次数は ACF/PACF で読める」ではない:リターン2乗の ACF/PACF が手がかりですが、GARCH は冗長になりやすく、実務は GARCH(1,1) から始めて AIC/BIC(モデル選択と残差診断)で増減を判断します。
関連ノート
- ボラティリティクラスタリングと予測(リターン2乗のACF・ARCH効果検定・ボラ予測と時変区間)
- 第6章 ボラティリティ 目次
- 定常性と自己相関(分散・ACF・弱定常)
- ARMA・ARIMAモデル(条件付き平均・倹約性の対比)
- モデル選択と残差診断(残差のARCH効果点検・AIC/BIC)
- 指数平滑法(SES・Holt・Holt-Winters)(GARCHは分散の指数平滑という見方)
- 確率過程(マルコフ連鎖・ポアソン過程)(統計・定常過程の土台)
- 時系列分析・予測テキスト 全体目次