こんにちは。システムトレーダーの卵ことKenKenです。今回も「Python3ではじめるシステムトレード ──環境構築と売買戦略」で勉強したことを簡単にまとめたいと思います。今回は前回の記事の続きになります。前回の記事を読んでない方はぜひそちらもご覧ください。
前回は、日経平均株価のデータについて、ヒストグラムを用いて視覚的に分析しました。今回は、他の視覚化方法を用いて日経平均株価について見ていきたいと思います。
散布図
前回と同様に、時系列の\(j\)日間隔の変化率\(P_t/P_{t-j}-1\)を算出し、それをその\(j\)日間前の変化率\(P_t/P_{t-2j}-1\)と比べてみる。ここで、\(j\)は移動する日数であり、変化率の自己相関を散布図で表現しているのに近い。自己相関が無ければ、散布図は綺麗な円形になるはずである。
1日間隔の変化率
まずは、日経平均株価の1日間隔の変化率について散布図を書いてみる。\(x\)軸が\(t-1\)日の変化率、\(y\)軸が\(t\)日の変化率である。散布図の右側には、標本自己相関のコレログラムを書いている。
import statsmodels.api as sm fig = plt.figure(figsize=(8, 4)) # 散布図 ax1 = plt.subplot(1, 2, 1) plt.scatter(chg_N225, chg_N225.shift(1), color='gray', alpha=0.05) # 散布図を描写 plt.xticks([-0.2, 0, 0.2]) # x軸のメモリ plt.title('1 days') plt.xlabel('$P_{t-1}/P_{t-2}-1$') plt.ylabel('$P_{t}/P_{t-1}-1$') plt.hlines([0], -0.1, 0.1) # 平行線を描写 plt.vlines([0], -0.1, 0.1) # 垂直線を描写 # 標本自己相関のコレログラム ax2 = plt.subplot(1, 2, 2) fig = sm.graphics.tsa.plot_acf(chg_N225.squeeze(), lags=5, ax=ax2, color='gray')

散布図を見てみると、全体として完全な円形ではなく、若干のひずみが見られる。中央部分は、ひし形に近い。これは、変化率が大きな日の次の日には小さな変化率の日が生じやすい現象を表している。同様に、変化率の小さな日の次の日には大きな変化率の日が来ることを表している。右側のコレログラムからは、自己相関がみられない。散布図は、コレログラムでは得られない情報を見ることができる。
250日間隔の変化率
次に前回同様に、250日間隔の変化率\(P_t/P_{t-250}-1\)についてみてみる。比較対象は、\(P_{t-250}/P_{t-500}-1\)とする。これは、変化率の算出に用いるデータに重複が無いようにするためである。
# 250日変化率 chg250_N225 = N225.pct_change(250).dropna() fig = plt.figure(figsize=(8, 4)) # 散布図 ax1 = plt.subplot(1, 2, 1) plt.scatter(chg250_N225, chg250_N225.shift(250), color='violet', alpha=0.05) # 散布図を描写 plt.title('250 days') plt.xlabel('$P_{t-250}/P_{t-500}-1$') plt.ylabel('$P_{t}/P_{t-250}-1$') plt.hlines([0], -0.8, 1) # 平行線を描写 plt.vlines([0], -0.8, 2) # 垂直線を描写 # 標本自己相関のコレログラム ax2 = plt.subplot(1, 2, 2) fig = sm.graphics.tsa.plot_acf(chg250_N225.squeeze(), lags=500, ax=ax2, color='gray')

散布図を見てみると、大きな変化率の後には小さな変化率の期間が表れてるという現象が更に強調されている。250日間で価格が動かなかった次の250日間では価格は-50%~+150%まで動く可能性があることがわかる。また、250日間で50%で下落した後には次の250日間で50%下落・上昇する可能性が無いことも読み取れる。250日間で50%上昇した後は、次の250日間で-50%~100%の可能性があり、幅広い。この散布図から特徴を結論付けるのは困難だが、様々な特徴を見ることができた。
コレログラムについてみてみる。コレログラムでは、250日の変化率が1日ごとに移動していくので、250日までは重複したデータを用いている。250日付近からは自己相関自己相関がゼロである可能性が見て取れる。つまり、コレログラムによると、重複のない250日間隔の変化率には自己相関がない。散布図では、コレログラムでは見ることができない相関について読み取ることができる。
バブル崩壊前後の変化率
これまでの記事で見てきたように、バブル崩壊前と後で価格の動きのメカニズムに変化があるのであれば、散布図の分析でも違いが出るはずである。まずは、1日間隔の散布図を書いてみる。
fig = plt.figure(figsize=(8, 4)) # 散布図( バブル崩壊前) before = chg_N225[:'1989/12/31'] ax1 = plt.subplot(1, 2, 1) plt.scatter(before, before.shift(1), color='gray', alpha=0.05) plt.title('before bubble crush') plt.xlabel('$P_{t-1}/P_{t-2}-1$') plt.ylabel('$P_{t}/P_{t-1}-1$') plt.hlines([0], -0.1, 0.1) # 平行線を描写 plt.vlines([0], -0.1, 0.1) # 垂直線を描写 # 散布図( バブル崩壊語) after = chg_N225['1989/12/31':] # バブル崩壊後 ax2 = plt.subplot(1, 2, 2) plt.scatter(after, after.shift(1), color='gray', alpha=0.05) plt.title('after bubble crush') plt.xlabel('$P_{t-1}/P_{t-2}-1$') plt.ylabel('$P_{t}/P_{t-1}-1$') plt.hlines([0], -0.1, 0.1) # 平行線を描写 plt.vlines([0], -0.1, 0.1) # 垂直線を描写

左側がバブル崩壊前で、右側がバブル崩壊後である。バブル崩壊後は、価格の変動が大きくなっており、その影響で円が大きくなっている。また、バブル崩壊前の分布の形状についてみてみると、やや右に偏っており、正のフィードバックがかかっているように思われる。
次に250日間隔の変化率を見てみる。
fig = plt.figure(figsize=(8, 4)) # 散布図( バブル崩壊前) before = chg250_N225[:'1989/12/31'] ax1 = plt.subplot(1, 2, 1) plt.scatter(before, before.shift(250), color='gray', alpha=0.05) plt.title('before bubble crush') plt.xlabel('$P_{t-1}/P_{t-2}-1$') plt.ylabel('$P_{t}/P_{t-1}-1$') plt.hlines([0], -0.8, 1.8) # 平行線を描写 plt.vlines([0], -0.8, 2) # 垂直線を描写 # 散布図( バブル崩壊語) after = chg250_N225['1989/12/31':] # バブル崩壊後 ax2 = plt.subplot(1, 2, 2) plt.scatter(after, after.shift(250), color='gray', alpha=0.05) plt.title('after bubble crush') plt.xlabel('$P_{t-1}/P_{t-2}-1$') plt.ylabel('$P_{t}/P_{t-1}-1$') plt.hlines([0], -0.8, 1.8) # 平行線を描写 plt.vlines([0], -0.8, 2) # 垂直線を描写

250日間隔では、先ほどとは異なった印象を受ける。バブル前では、上昇トレンドであったこともあり、プラス方向に偏っている。一方、バブル崩壊後は、穏やかな価格の動きの後には、上昇トレンドや下降トレンドが発生している可能性が見られる。また、バブル崩壊後では、250日間隔の価格変化が比較的小さいことがわかる。1日間隔の変化率では、バブル崩壊後の方が価格の変化が大きかったが、250日間隔の変化率では対照的な結果となった。
チャート(変化率の最大と最小値)
価格変化率の対象を1日~250日として、それぞれの価格の推移について特徴を見てみる。異なる期間の一連の変化率の特性を、最大値、最小値、平均値により表現してみる。時間の経過とともに価格が動ける範囲は広がるため、大きく上昇・下落することができる。
plt.figure() high = [] low = [] ave = [] for i in range(250): change = N225.pct_change(i) high.append(change.max()) low.append(change.min()) ave.append(change.mean()) plt.plot(high, label='high', linestyle='--') plt.plot(low, label='low', linestyle='--') plt.plot(ave, label='ave', linestyle='--') plt.legend(loc='upper left') plt.title('all data') plt.xlabel('$t$') plt.ylabel('$P_{t}/P_{t-1}-1$')

理論的に価格がランダムウォークに従えば、時間の経過に比例して価格の動ける範囲は広がるはずである。価格が下落する際は、lowについてみてみると、その様子が見られる。しかし、上昇する際は、highについてみると、広がる時期と停滞する時期に分かれているように見える。
次に、バブル崩壊前の様子を見てみる。
plt.figure() high = [] low = [] ave = [] for i in range(250): change = N225[:'1989/12/31'].pct_change(i) high.append(change.max()) low.append(change.min()) ave.append(change.mean()) plt.plot(high, label='high', linestyle='--') plt.plot(low, label='low', linestyle='--') plt.plot(ave, label='ave', linestyle='--') plt.legend(loc='upper left') plt.title('before buble crush') plt.xlabel('$t$') plt.ylabel('$P_{t}/P_{t-1}-1$')

最大値のグラフについては、先ほどとほぼ同じ形状が描かれた。つまり、先ほどのグラフは、バブル崩壊前の特性を強く反映していたものとなっていたことがわかる。下落に関しては、バブル崩壊後の影響を受けていそうである。
そこで、次にバブル崩壊後について同様のグラフを書いてみた。
plt.figure() high = [] low = [] ave = [] for i in range(250): change = N225['1989/12/31':].pct_change(i) high.append(change.max()) low.append(change.min()) ave.append(change.mean()) plt.plot(high, label='high', linestyle='--') plt.plot(low, label='low', linestyle='--') plt.plot(ave, label='ave', linestyle='--') plt.legend(loc='upper left') plt.title('after buble crush') plt.xlabel('$t$') plt.ylabel('$P_{t}/P_{t-1}-1$')

バブル崩壊後では、最小値の下落は急激に起こり、最大値の上昇は半年間かけておこるが、それ以降は停滞してしまうことがわかる。平均はほぼ一直線となった。
まとめ
今回は、散布図やチャートを用いて日経平均株価の変化率の特徴を見ました。散布図では、コレログラムでは見ることのできない特徴を捉えることができました。また、最大値・最小値によるチャートでは、価格変化の期間構造についてみることができました。また、前回のヒストグラムでの分析を含めて、変化率の期間幅を変えることで異なった特徴を見ることができました。
前回と今回の2回に分けて視覚的に金融データの特徴を分析しましたが、改めてグラフによりデータの構造・特性を把握することは重要であることがわかりました。今後の分析に役立てていきたいです。
以上