0
0

More than 1 year has passed since last update.

【時系列解析】ARCHモデルから生成されるデータとホワイトノイズを比較

Posted at

概要

当記事は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以下になる。

では、シミュレーション結果を比較する

ホワイトノイズ
スクリーンショット 2023-07-13 23.35.48.png
ARCH model
スクリーンショット 2023-07-13 23.36.39.png

2つを目で比較しても差があまりあるようには思えないので、次に偏自己相関を見て2つのデータに差があるか比較する

ホワイトノイズとARCHデータの偏自己相関を確認すると

ホワイトノイズの偏自己相関
スクリーンショット 2023-07-13 23.39.04.png

ARCHモデルから生成されたデータの偏自己相関
スクリーンショット 2023-07-13 23.39.14.png

実はただ偏自己相関を比較しても2つの差はわからない。

次にそれぞれを2乗したものの偏自己相関を確認する

ホワイトノイズの2乗
スクリーンショット 2023-07-13 23.42.45.png

ARCHデータの2乗
スクリーンショット 2023-07-13 23.42.51.png

ARCHデータの2乗を確認すると、ARCHから生成されたデータの2乗の値は1期前や2期前と相関があり、予測に使えることがわかる。

ボラティリティクラスタリング

株価や株価収益率などのデータでよく見られる事だが、ボラティリティが高い時期や低い時期がまとまって現れる。これをボラティリティクラスタリングという。

ホワイトノイズとARCHモデルから生成されたデータにボリンジャーバンド(時系列データにおける、過去の一定期間内の標準偏差を可視化したもの、$1\sigma$や$2\sigma$を見る)を可視化する

ホワイトノイズ
スクリーンショット 2023-07-13 23.55.02.png

ARCH
スクリーンショット 2023-07-13 23.55.19.png

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')

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0