概要
当記事はARCHモデルがどのような時系列データに適用できるのかを直感的に理解するために、ホワイトノイズとARCHモデルから生成されたシミュレーションのボリンジャーバンドを比較するもの。
要点は
・ARCHとホワイトノイズのデータは一見区別がつかない
・ARCHとホワイトノイズのそれぞれ2乗したものの偏自己相関を見ると、それぞれの違いがわかる
・ARCHから生成されたデータではボラティリティクラスタリングが発生している事がわかる
ARCH modelとは
ARCHモデルとは分散のARモデルのこと。
つまり、時刻tの分散は時刻t-1やそれよりも前の時刻t-nの分散で説明できるとするモデルである。
ARCH(特にGARCH)は金融業界でよく使われるモデルであり、株価収益率やボラティリティの予測などに使われる。
ホワイトノイズとARCHモデルから生成されたシミュレーションデータ
ホワイトノイズは
$y_t = \varepsilon_t, \varepsilon は N(0,1)$
と表現できる。$\varepsilon$は独立同一分布(i.i.d)から生成されるので、時刻tと時刻t-nは関係がない。
ランダムにデータを生成したときの時系列バージョンのこと。
ARCHモデルは
$y_t = \sqrt{h}*v_t, vはN(0,1)$
また、$h = w + a*{y_t}^2 + a2*{y_{t-1}}^2+・・・$
と表現される。$y_t$は過去の分散から求められた係数$h$に比例すること示している。
注意点としてパラメータ$a,a2,・・・$の合計は1以下になる。
では、シミュレーション結果を比較する
2つを目で比較しても差があまりあるようには思えないので、次に偏自己相関を見て2つのデータに差があるか比較する
ホワイトノイズとARCHデータの偏自己相関を確認すると
実はただ偏自己相関を比較しても2つの差はわからない。
次にそれぞれを2乗したものの偏自己相関を確認する
ARCHデータの2乗を確認すると、ARCHから生成されたデータの2乗の値は1期前や2期前と相関があり、予測に使えることがわかる。
ボラティリティクラスタリング
株価や株価収益率などのデータでよく見られる事だが、ボラティリティが高い時期や低い時期がまとまって現れる。これをボラティリティクラスタリングという。
ホワイトノイズとARCHモデルから生成されたデータにボリンジャーバンド(時系列データにおける、過去の一定期間内の標準偏差を可視化したもの、$1\sigma$や$2\sigma$を見る)を可視化する
ARCHのシミュレーションデータはしっかりとボラティリティクラスタリングが見えている事がわかる。
コード
# ホワイトノイズの可視化
size = 300
np.random.seed(42)
wn1 = pd.DataFrame(np.random.normal(0,1,size))
# ボリンジャーバンドの計算
band_size = 25
wn1_band_1_sigma = wn1.rolling(band_size).std()
wn1_mean = wn1.rolling(band_size).mean()
# ボリンジャーバンドのプロット
plt.figure(figsize=(15,6))
for i in [1,2]:
plt.fill_between(wn1_band_1_sigma.index,
wn1_mean[0] + wn1_band_1_sigma[0] * i,
wn1_mean[0] - wn1_band_1_sigma[0] * i,
color='blue', alpha=0.2)
plt.plot(wn1_mean)
# 可視化
plt.plot(wn1, color='red')
plt.show()
np.random.seed(42)
# ARCHモデルのシミュレーションデータ可視化
y = np.zeros(size)
x1 = np.random.normal(0,1,size)
a1 = 0.5
a2 = 0.5
for i in range(1,size):
h = 1 + a1 * y[i - 1] ** 2 + a2 * y[i - 2] ** 2
y[i] = x1[i] * np.sqrt(h)
arch1 = pd.DataFrame(y)
# ボリンジャーバンドの計算
band_size = 25
arch1_band_1_sigma = arch1.rolling(band_size).std()
arch1_mean = arch1.rolling(band_size).mean()
# ボリンジャーバンドのプロット
plt.figure(figsize=(15,6))
for i in [1,2]:
plt.fill_between(arch1_band_1_sigma.index,
arch1_mean[0] + arch1_band_1_sigma[0] * i,
arch1_mean[0] - arch1_band_1_sigma[0] * i,
color='blue', alpha=0.2)
plt.plot(arch1_mean)
plt.plot(arch1,color='red')
参考文献