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
まずは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からデータを取得 (今回は 2016年1月1日 ~ 2017年6月9日) 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)
まとめ
時系列分析についてはあまり勉強してこなかったので、 知識がそこまであるわけではないですが、ライブラリ自体が誰でも使えるように作られているので、 簡単に時系列分析をすることができました。
時系列データはそこかしこにあふれているので、 いろいろなデータに対して適用することができ、 分析から知見が得られると思うので、みなさんもぜひ試してみてください。