【時系列分析】日経平均株価を予測してみる

時系列分析の実践として、日経平均株価のデータを使ってみたいと思います。
利用したデータは、以下のサイトからCSVで出力できますので、
ぜひ分析される際には、ダウンロードしてみていはいかがでしょうか。

現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~

現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~

目次

  • データの可視化
  • 自己相関の確認
  • 単位根検定

この3つに分けて、お話を進めていきたいと思います。

データの可視化

まずは、ダウンロードしてきたデータをpythonで読み込んで、
可視化することころまでやってみましょう。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('nikkei_stock_average_daily_jp.csv', encoding='shift_jis')
df.head()

どういったデータが入っているか確認しましょう。

f:id:gotto50105010:20180924231339p:plain

いくつかデータが入っているのですが、今回は扱うデータを絞って、
日時と終値のデータのみにします。

事前準備

こんかいの分析で利用するパッケージを事前にインポートしておきましょう。




カラム名の変更
ダウンロードしたばかりのデータは、カラム名が日本語になっているので、
扱いやすいように変更をしましょう。

df = df.iloc[:-1, 0:2]
df.columns = ['date', 'price']

f:id:gotto50105010:20180924231432p:plain

②日時列のデータ変更
元のデータでは、「YYYY/MM/DD」となっているので、
「YYYY-MM-DD」の形に変換をしましょう。

df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

f:id:gotto50105010:20180924231445p:plain

さて、事前準備はこの程度にしておいて、実際にデータを触っていきましょう。

データの可視化

事前準備が完了しましたので、早速可視化に入りましょう。

実際にかしかした際の、スクリプトは以下の通りでございます。

plt.figure(figsize=[10, 4])
plt.style.use('ggplot')
left = np.array(df['date'])
height = np.array(df['price'])
plt.plot(left, height)
plt.title('nikkei Price')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()

f:id:gotto50105010:20180924231509p:plain

Y軸:終値、X軸:日時の簡単なプロットになります。
日経平均を可視化しましたが、いかがでしょうか。

2015年9月頃と2015年12月頃に大きな下落がありました。
それ以降は、上下しつつも上昇傾向にあり、2018年2月ごろに高くなっていると思います。

このプロットを見て、いつ何が発生したのか調べるだけでも 面白そうなグラフですよね。

ガクッと落ちた2015年8月はなにが発生したんでしょうね。
少し調べてみましたが、2015年8月25日に宇宙ステーション補給機こうのとり5号機が
国際宇宙ステーションへの結合が完了したそうです。

いいニュースっぽいですが、日経平均が下がっているんですね。
きっと別のことが影響しているのでしょうね。

さて、少し話がそれてしまいました。

このようにデータをプロットすると色々なことが見えてきます。
時系列に限らず、データを分析する際には可視化をしましょう。

自己相関の確認

時系列のデータですので、各地点のデータが、
他に影響を与えていないか?
例えば、今日高値だった場合は、明日も高値なのか否か
といったように自分自身に影響を与えていないか確認します。

price = df.set_index('date')

# 自己相関
price_acf = sm.tsa.stattools.acf(price, nlags=40)
# 偏自己相関
price_pacf = sm.tsa.stattools.pacf(price, nlags=40, method='ols')

#  自己相関のグラフ
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(price, lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(price, lags=40, ax=ax2)

f:id:gotto50105010:20180924231522p:plain

自己相関と偏自己相関をプロットしてみました。
下のグラフをみても、あまり周期性が内容に見えます。

株価のデータなので周期性があるかなと思っておりましたが、
思ったよりも周期性がないのかもしれませんね。。。

単位根検定

最後に、単位根検定を実施してみましょう。
スクリプトは以下のとおりでございます。

X = df['price']
result = st.adfuller(X)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))

結果

Backend MacOSX is interactive backend. Turning interactive mode on.
ADF Statistic: -1.149502
p-value: 0.694933
Critical Values:
    1%: -3.438
    5%: -2.865
    10%: -2.568

こういった値になりました。
-1.149と示しており、5%よりも大きい値になっております。
帰無仮説の単位根でないが棄却されたので、
単位根があるデータということになります。

さて、今回はここまでとなります。
まだARIMAなどは取り組んでいないのですが、
おいおい取り組んで見たいと思います。