
ゆうき( @BASEBALLY15 )です^^
Pythonを勉強していて,株価の未来予測をしたいのですが,何かツールはないですか・・・?
便利なツールがありますよ^^
Facebookが提供している予測ツール『Prophet』 を使うと,誰でも簡単に未来予測が出来ます!
そうなんですか!?
是非,使い方を教えてください。
分かりました!
(Anacondaを使用)

目次
Prophetとは?
時系列のデータで,時刻t(1≦t≦T)におけるデータをy(t)としたときに,トレンド関数g(t),周期関数s(t),イベント関数h(t)と誤差 εt に分解して表したモデルのことを言います.
以下に式を載せておきます.
y(t) = g(t) + s(t) + h(t) + εt
(式をクリックすると,引用元を確認できます.)
また. Prophet は,オープンソースで開発されていて,Pythonの他にRでも使うことが出来ます.
それでは, Prophet を使って,Twitterの株価を未来予測してみたいと思います^^
Prophet を使って,Twitterの株価を未来予測してみよう!
Prophet のインストール
今回は,Anaconadaを使います.

まずは,Anacondaに Prophet をインストールします.
Anaconda Promptを開いて,以下のコードを記述します.

conda install -c conda-forge fbprophet
これで, Prophet をインストールすることが出来たので,実際に使っていきたいと思います^^
ライブラリ
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
#可視化のためのライブラリ
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")
%matplotlib inline
今回は,Yahooを使って,Twitterの株価を未来予測したいので,以下のライブラリを追加します.
#Yahooから株価データを受け取るためのライブラリ
import pandas_datareader as pdr
from pandas_datareader import DataReader
また,株価を時系列で取得したいので,以下のコードも追加しておきます.
#日付と時刻を扱うためのライブラリ
from datetime import datetime
そして, Prophet を使うためのライブラリを追加します.
#FacebookのProphetを使うためのライブラリ
from fbprophet import Prophet
次に,未来予測するためのコードをご紹介します.
コード
まずは,取得したい期間を決めます.
今回は,現在から2年前までのデータを使いたいと思います.
#取得する株価の期間を指定(2年間)
end = datetime.now()
start = datetime(end.year-2, end.month, end.day)
次に,Yahooから株価のデータを持ってくるためのコードを記述します.
#Twitterの株価を扱う
twi_stock = "TWTR"
#Yahooのサイトからデータを取得
globals()[twi_stock] = DataReader(twi_stock, "yahoo", start, end)
次に,Yahooから持ってきたデータをデータフレーム化したいと思います.
データフレーム化
データフレーム化することで,データを容易に扱うことが可能になります.
#TWTRを抽出し,DataFrame化.
twi_df = pd.DataFrame(TWTR)
#表示
twi_df
High | Low | Open | Close | Volume | Adj Close | |
---|---|---|---|---|---|---|
Date | ||||||
2018-02-21 | 34.060001 | 32.650002 | 33.029999 | 33.380001 | 29589300 | 33.380001 |
2018-02-22 | 33.450001 | 31.629999 | 33.430000 | 32.110001 | 29184100 | 32.110001 |
2018-02-23 | 32.689999 | 31.969999 | 32.200001 | 32.660000 | 17283400 | 32.660000 |
2018-02-26 | 32.700001 | 31.959999 | 32.700001 | 32.160000 | 15766300 | 32.160000 |
2018-02-27 | 32.209999 | 31.260000 | 31.910000 | 31.320000 | 16544000 | 31.320000 |
すると,このように最高値や終値などが表示されます.
※このデータフレームを見ると,インデックス部分にDateと表示されているのですが, Prophet を使ってグラフを表示する際に,インデックス部分が使えないので, 新たに,Dateという項目を追加します.
#Dateをインデックス部以外に表示(dsでインデックスを指定できないため)
twi_df["Date"] = twi_df.index
#表示
twi_df
High | Low | Open | Close | Volume | Adj Close | Date | |
---|---|---|---|---|---|---|---|
Date | |||||||
2018-02-21 | 34.060001 | 32.650002 | 33.029999 | 33.380001 | 29589300 | 33.380001 | 2018-02-21 |
2018-02-22 | 33.450001 | 31.629999 | 33.430000 | 32.110001 | 29184100 | 32.110001 | 2018-02-22 |
2018-02-23 | 32.689999 | 31.969999 | 32.200001 | 32.660000 | 17283400 | 32.660000 | 2018-02-23 |
2018-02-26 | 32.700001 | 31.959999 | 32.700001 | 32.160000 | 15766300 | 32.160000 | 2018-02-26 |
2018-02-27 | 32.209999 | 31.260000 | 31.910000 | 31.320000 | 16544000 | 31.320000 | 2018-02-27 |
このように,一番右にDateという項目が追加されました.
このデータフレームの中で,今回は『 DATE 』と『 ADJ CLOSE 』のデータを使います.
ADJ CLOSE は,調整後終値と言います.
Twitterの株価を表示
2020年2月21日までのTwitterの株価がどのような流れなのかを確かめるために,株価をグラフで表示してみたいと思います.
#グラフをプロットする
TWTR["Adj Close"].plot(legend=True, figsize=(10,4), color="black")

次に, Prophet を使って,将来,上のグラフからどのように変化するのかを予測してみたいと思います.
実際にProphet を使って,株価を予測
まずは,使うデータをdsとyに分けたいと思います.
#date型に変換
twi_df["ds"] = pd.to_datetime(twi_df["Date"]).dt.date
#データの変化が大きいため,対数変換する→精度が向上する
twi_df["y"] = np.log(twi_df["Adj Close"])
次に,予測モデルを作成します.
#デフォルト設定でモデルを作成する
twi_model = Prophet()
twi_model.fit(twi_df)
これで,予測モデルを作成することが出来たので,次はそのモデルを使って,実際に予測をしたいと思います.
今回は,5か月間の株価の変動を予測したいと思います.
#モデルをもとに予測する
#periodに期間を入れる.5か月(=150)を入れる
twi_future = twi_model.make_future_dataframe(periods=150)
#予測
twi_forecast = twi_model.predict(twi_future)
#予測結果を表示
twi_forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail()
ds | yhat | yhat_lower | yhat_upper | |
---|---|---|---|---|
649 | 2020-07-16 | 4.260388 | 3.652522 | 4.858112 |
650 | 2020-07-17 | 4.254667 | 3.626282 | 4.868626 |
651 | 2020-07-18 | 4.120888 | 3.489478 | 4.733211 |
652 | 2020-07-19 | 4.116304 | 3.486457 | 4.752610 |
653 | 2020-07-20 | 4.239247 | 3.609321 | 4.855716 |
『YHAT』が予測した値になります.
それでは,この結果をグラフで表示させたいと思います.
#予測モデルをグラフで表示
twi_model.plot(twi_forecast);

黒い点が実際の株価の変動を表し,青い線が Prophet を使って予測した結果となります.
このグラフを見ると,2019年の11月くらいから株価が上昇し,2020年の7月くらいまで続くことが予測されます.(※あくまで,予測なので過信しないようにお願いします.)
最後に,今回予測したモデルがどのような構成になっているのかを確かめたいと思います.
予測モデルにどのような傾向があるのかを確かめよう!
予測モデルのトレンドや曜日ごとの傾向を確かめるためには,以下のコードを記述します.
#予測モデルの構成要素
#トレンドや周期性を表示
twi_model.plot_components(twi_forecast);

『yearly』のグラフを見ると,1月から7月にかけては株価が上昇し,7月以降になると株価が下落していることが分かります.
このグラフを見ると,どのタイミングで株価が変動しているのかが一目瞭然ですね^^
終わりに
今回は,Facebookが提供している Prophet という予測ツールを使って,Twitterの株価を未来予測してみました.
Prophet を使うと,年ごとの変動だけでなく,季節や曜日ごとの変動も見ることが出来るので,すごく便利ですね^^
ぜひ,皆さんも Prophet を使って,未来予測してみてください.
それでは・・・