- 問題
- 答え
- 解説
a + b(alpha[1] と beta[1] の和)が1に近いことから何がわかりますか?
Python コード:
import numpy as np
from arch import arch_model
np.random.seed(0)
y, h = np.zeros(1000), np.ones(1000)
for t in range(1, 1000):
h[t] = 0.1 + 0.1*y[t-1]**2 + 0.85*h[t-1]
y[t] = np.sqrt(h[t]) * np.random.randn()
res = arch_model(y, mean='Zero').fit(disp='off')
print(res.params.round(3))
print(f"a + b = {res.params.iloc[1:].sum():.3f}")
回答の選択肢:
(A) 平均が時間とともに上昇し続けるトレンドがある
(B) 系列に単位根があり、差分を取る必要がある
(C) 値そのものの自己相関が強く、次の値の符号を予測しやすい
(D) 変動の大きさが長く持続し、大きな変動の後には大きな変動が続きやすい
omega 0.098 alpha[1] 0.085 beta[1] 0.860 Name: params, dtype: float64 a + b = 0.946
正解: (D)
このコードは、GARCH(1,1)モデルに従うデータを生成し、arch_modelでパラメータを推定しています。GARCH(1,1)では、各時点の条件付き分散(ボラティリティ)h_tが「前期の値の二乗(ショック)」と「前期の条件付き分散」で決まります。alpha[1]はショックへの反応の強さ、beta[1]は前期の分散がどれだけ引き継がれるかを表します。その和\alpha+\betaはボラティリティの持続性を表す指標です。
推定値の和は0.946で、真の値0.95(0.1+0.85)にほぼ一致しています。1に近いということは、一度大きな変動が起きると分散の高い状態がなかなか元に戻らないことを意味します。これが金融データでよく見られるボラティリティ・クラスタリング(大きな変動の後には大きな変動が、小さな変動の後には小さな変動が続く現象)です。
回答の選択肢:
(A) 平均が時間とともに上昇し続けるトレンドがある
(B) 系列に単位根があり、差分を取る必要がある
(C) 値そのものの自己相関が強く、次の値の符号を予測しやすい
(D) 変動の大きさが長く持続し、大きな変動の後には大きな変動が続きやすい
- コードの解説
-
このコードは、GARCH(1,1)モデルに従う時系列データを生成し、そのパラメータを推定しています。
import numpy as np from arch import arch_model np.random.seed(0) y, h = np.zeros(1000), np.ones(1000) for t in range(1, 1000): h[t] = 0.1 + 0.1*y[t-1]**2 + 0.85*h[t-1] y[t] = np.sqrt(h[t]) * np.random.randn() res = arch_model(y, mean='Zero').fit(disp='off') print(res.params.round(3)) print(f"a + b = {res.params.iloc[1:].sum():.3f}")詳しく説明します。
ライブラリのインポート
numpy:数値計算を行うためのライブラリです。ここでは乱数生成と配列操作に使用しています。arch.arch_model:ARCH/GARCH系モデルを推定するための関数です。archライブラリはpip install archでインストールできます。
データの生成
y:観測される系列です。株価のリターン(変化率)などをイメージしてください。h:各時点の条件付き分散です。初期値は1としています。h[t] = 0.1 + 0.1*y[t-1]**2 + 0.85*h[t-1]:今期の分散を、定数(ω=0.1)、前期の値の二乗(α=0.1)、前期の分散(β=0.85)で決めています。これがGARCH(1,1)の分散式です。y[t] = np.sqrt(h[t]) * np.random.randn():標準正規乱数に標準偏差\sqrt{h_t}を掛けて、今期の値を生成しています。平均は0で、変動の大きさだけが時間とともに変わります。
モデルの推定
arch_model(y, mean='Zero'):平均を0とし、分散をGARCH(1,1)とするモデルを定義します。分散モデル(vol='GARCH'、p=1、q=1)はデフォルト値なので省略しています。.fit(disp='off'):最尤法でパラメータを推定します。disp='off'で最適化の途中経過の表示を抑えています。res.params:推定されたパラメータomega、alpha[1]、beta[1]です。res.params.iloc[1:].sum():先頭のomegaを除いたalpha[1]とbeta[1]の和を計算しています。
出力の読み方
omega(0.098):分散の定数項です。真の値は0.1です。alpha[1](0.085):前期のショック(値の二乗)への反応の強さです。真の値は0.1です。beta[1](0.860):前期の分散の引き継ぎ度合いです。真の値は0.85です。a + b(0.946):ボラティリティの持続性です。真の値は0.95です。
- 選択肢の解説
-
(A) 平均が時間とともに上昇し続けるトレンドがある → ×
GARCHモデルのパラメータalphaとbetaは、平均ではなく分散の動きを表します。今回はmean='Zero'で平均を0に固定しており、トレンドはありません。(B) 系列に単位根があり、差分を取る必要がある → ×
単位根は「値そのもの」の非定常性の話です。\alpha+\betaが1に近いのは「分散」の持続性が高いという意味で、値の水準が非定常であることを示すものではありません。なお、\alpha+\beta=1となる場合はIGARCH(和分GARCH)と呼ばれ、分散の過程が単位根に似た性質を持ちます。「1に近い=単位根」という連想が、この選択肢の引っかけです。(C) 値そのものの自己相関が強く、次の値の符号を予測しやすい → ×
GARCHでは、値そのもの(y)はほぼ無相関のまま、値の二乗(変動の大きさ)に自己相関が生じます。次の値が上がるか下がるかは予測できず、予測できるのは「どのくらい大きく動きそうか」です。(D) 変動の大きさが長く持続し、大きな変動の後には大きな変動が続きやすい → ○
正解です。\alpha+\betaは、分散へのショックがどれだけゆっくり減衰するかを表します。1に近いほどショックの影響が長く残り、ボラティリティ・クラスタリングが顕著になります。 - GARCH(1,1)のモデル式
-
GARCH(1,1)モデルは、次の2本の式で表されます。
$$
y_t = \sqrt{h_t}\,\varepsilon_t, \quad \varepsilon_t \sim N(0,1)
$$$$
h_t = \omega + \alpha\, y_{t-1}^2 + \beta\, h_{t-1}
$$第1式は、観測値y_tが標準正規分布に従う撹乱項\varepsilon_tを、その時点の標準偏差\sqrt{h_t}で拡大・縮小したものであることを表します。第2式は、条件付き分散h_tの更新式です。
- \omega:分散の下支えとなる定数項(\omega>0)
- \alpha:前期のショックy_{t-1}^2への反応(ARCH項)
- \beta:前期の分散h_{t-1}の引き継ぎ(GARCH項)
\alpha+\beta \lt 1のとき、分散は長期的に次の無条件分散へ回帰します。$$
\sigma^2 = \frac{\omega}{1-\alpha-\beta}
$$今回の推定値から計算すると0.098/(1-0.946)\approx 1.79となり、データの標本分散1.80とよく一致します。
- α+βと持続性(半減期)
-
\alpha+\betaの大きさは、分散へのショックの半減期(影響が半分になるまでの期間)に換算すると直感的に理解できます。
$$
\text{半減期} = \frac{\ln 0.5}{\ln(\alpha+\beta)}
$$α+β 半減期(期) 解釈 0.50 1.0 ショックはすぐに消える 0.90 6.6 数期にわたって影響が残る 0.95 13.5 今回の真の値。影響が長く残る 0.99 69.0 非常に長く持続する 1.00 ∞ IGARCH。ショックが永続する 今回の推定値0.946では半減期は約12.4期です。日次データであれば、ボラティリティの急上昇が収まるまでに2〜3週間程度かかるイメージです。株式や為替の日次リターンでは、\alpha+\betaが0.95〜0.99程度と推定されることがよくあります。
また、\alphaと\betaの内訳にも意味があります。\alphaが大きいとショックに敏感に反応して分散が急上昇します。\betaが大きいと分散の変化が滑らかで、ゆっくり推移します。
- 値の自己相関と二乗の自己相関
-
GARCHの特徴は、「値そのものは予測できないが、変動の大きさは予測できる」という点です。今回生成したデータで、値
yと二乗y**2の自己相関(ラグ1〜5)を確認すると、次のようになります。from statsmodels.tsa.stattools import acf print(acf(y, nlags=5)[1:].round(3)) print(acf(y**2, nlags=5)[1:].round(3))
[-0.027 0.006 0.023 -0.053 -0.005] [ 0.108 0.124 0.098 0.169 0.08 ]
値そのものの自己相関はほぼ0ですが、二乗の自己相関はすべて正の値になっています。これが選択肢(C)が誤りである理由であり、ボラティリティ・クラスタリングを数値で確認したものです。
この「二乗の自己相関」を検定するのがARCH検定(ARCH効果の有無の検定)です。実務では、まずARCH検定でARCH効果があるかを確認し、効果があればGARCHモデルで分散の動きをモデル化する、という流れが一般的です。
ARCHとGARCHの違い
ARCH(q) GARCH(p,q) 分散の説明変数 過去のショックの二乗のみ 過去のショックの二乗+過去の分散 長い持続性の表現 多数のラグが必要 少ないパラメータで表現できる ARMAとの対応 分散のMA的な構造 分散のARMA的な構造 ARCHモデルで長い持続性を表すには多くのラグが必要ですが、GARCHでは前期の分散h_{t-1}を加えることで、GARCH(1,1)の3パラメータだけで表現できます。
- 実務での注意点
-
価格ではなくリターンに当てはめる
GARCHは平均が安定した系列の分散の動きを捉えるモデルです。株価などの価格系列はそのまま使わず、対数差分や変化率(リターン)に変換してから当てはめます。また、archライブラリは値のスケールが小さすぎると最適化が不安定になるため、リターンを100倍して%単位で扱うのが一般的です。平均モデルを確認する
今回はmean='Zero'としましたが、デフォルトは定数平均(mean='Constant')です。リターンに自己相関が残っている場合は、mean='AR'とlagsで平均側にARを組み込みます。平均の構造を取りこぼすと、分散の推定にも影響します。裾の厚い分布を検討する
金融データは正規分布より極端な値が出やすい(裾が厚い)ことが多く、dist='t'(t分布)などを指定すると当てはまりが改善することがあります。非対称性(レバレッジ効果)
株価では、上昇より下落のほうがボラティリティを高めやすい傾向があります。この非対称性は、arch_model(y, o=1)によるGJR-GARCHや、vol='EGARCH'によるEGARCHで表現できます。α+βが1に極めて近いとき
\alpha+\betaが0.99を超えるような場合、真に持続性が高い可能性のほかに、期間中の構造変化(分散の水準自体の変化)を持続性と誤認している可能性があります。期間を分けて推定し、結果が安定しているかを確認するとよいでしょう。分散の予測
推定したモデルからは、将来の分散を予測できます。res.forecast(horizon=10).variance
予測された分散は、先に進むほど無条件分散へ近づいていきます。リスク管理(VaRの計算など)では、この分散予測が活用されます。

