Facebookの時系列予測ライブラリProphetを使って株価予測をやってみた

ブログかなりご無沙汰になってました。

今回は、今年2月にFacebookから公開された時系列予測のためのPythonライブラリProphetを使って、株価データの時系列予測をやってみようと思います。

【環境】
Python 3.6.1(anaconda3-4.4.0)
Mac 10.12.4
※ コードはJupyter環境で書いています

Prophet

https://github.com/facebookincubator/prophet

f:id:hongo35:20170618140557p:plain

まずはpipでProphetをインストールしましょう。

$ pip install fbprophet

ここでもし以下のようなのエラーが発生したら、 pipでPyStanをinstallしてからProphetをインストールしてください。

Command “python setup.py egg_info” failed with error code 1 https://github.com/facebookincubator/prophet/issues/140

$ pip install pystan
$ python setup.py install

データの読み込み

インストールができたら、次はデータを読み込んでいきます。
データは、Yahoo!ファイナンスから取得した株価データを使います。
csvファイルを読み込む形でもできますが、今回はDBにデータを保持しているため、DBから引っ張ってきました。

%matplotlib inline
import pandas as pd
import numpy as np
import MySQLdb as mysql

# mysql
con = mysql.connect(config)
cur = con.cursor(mysql.cursors.DictCursor)

price_data = []

--------------------
# mysqlからデータを取得
(今回は 201611日 ~ 201769日)
price_data.append({'ds': ***, 'y': ***})
--------------------
max_price = max(price_data, key=(lambda x: x['y']))['y']

df = pd.DataFrame(price_data)

モデルの作成

予測モデルは簡単に作成することができます。
モデルを作成するにあたり、以下の点に注意する必要があります。

トレンド(線形、非線形)
時系列トレンドを線形(linear)として予測するか、非線形(logistic)として予測するかの設定です。
今回扱う株価データは非線形なので、growthにlogisticを指定します。また、logisticを指定した場合、上限(キャパシティ)を指定する必要があります。

周期性(週周期、年周期)
曜日に依存するデータか、季節に依存するデータかをそれぞれ設定します。
引数名はそれぞれ、weekly_seasonality, yearly_seasonalityです。

from fbprophet import Prophet

model = Prophet(growth='logitic', weekly_seasonality=False, yearly_seasonality=True)
df['cap'] = max_price # 上限の指定
model.fit(df) # 学習(フィッティング)

予測

予測したい期間を指定し、空のDataFrameを作り、予測をします。

future = model.make_future_dataframe(periods=5)
future['cap'] = max_price
forecast = model.predict(future)

print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())

printの結果は以下のようになります。
(ここでは例として、トヨタ自動車(証券コード: 7203)の結果を記載します)

ds yhat yhat_lower yhat_upper
2017-06-10 5937.594568 5743.531806 6127.172213
2017-06-11 5921.758918 5734.129259 6095.127343
2017-06-12 5902.988836 5699.916425 6092.724544
2017-06-13 5881.427094 5695.766267 6068.017899
2017-06-14 5857.283962 5659.352560 6044.636029

過去の時系列推移から、その後5日分の予測値を出しています。
(実際には10,11日は土日で、取引はないため、6月12日~16日の予測)

実際の株価は以下のようでした。

date price
2017-06-12 5880
2017-06-13 5874
2017-06-14 5859
2017-06-15 5794
2017-06-16 5794

可視化

Prophetにはあらかじめ、plotというメソッドが用意されているので、 そのままplotを呼び出すだけで可視化してくれます。

model.plot(forecast)

トヨタ自動車(証券コード: 7203)の株価時系列推移

f:id:hongo35:20170618140651p:plain

まとめ

時系列分析についてはあまり勉強してこなかったので、 知識がそこまであるわけではないですが、ライブラリ自体が誰でも使えるように作られているので、 簡単に時系列分析をすることができました。

時系列データはそこかしこにあふれているので、 いろいろなデータに対して適用することができ、 分析から知見が得られると思うので、みなさんもぜひ試してみてください。

【参考資料】
Prophet入門 Facebookの時系列予測システム
10分でPandasを学ぶ