【Python】【機械学習】Prophetで株価を予測する
ここでは、Facebook社(現Meta社)が開発した予測ライブラリ Prophet を使って株価を予測してみます。
Prophetは、下記のように時系列データを3つの項の和として回帰モデルを構築しています。
$${y(t) = g(t) + s(t) + h(t) + εt}$$$${\\}$$
$${g(t):トレンド(時間によって単調変化)}$$$${\\}$$
$${s(t):季節性(周期性)}$$$${\\}$$
$${h(t):祝日効果(祝日による影響)}$$$${\\}$$
$${εt:誤差項}$$$${\\}$$
Prophetの特徴としては、計算が正確で高速、時間がかかる工程がなく簡単に使える、予測モデルをチューニング可能などがあげられます。
Prophetは非線形のデータを年・週・日単位の周期性や変動点でフィッティングします。Prophetは強い周期性を持つ時系列データやいくつかの周期性を持つデータに対する予測を得意としており、時系列データの間にあるデータの抜けや外れ値に対しても強いようです。
なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。
1.株価データを取得する
下記を参考にOHLCV(始値 / 高値 / 安値 / 終値 / 出来高)形式の日経平均株価(^NKX)データを取得します。データの取得期間は、2018年1月1日から2023年1月/1日までです。
import pandas_datareader.data as web
import datetime
start = '2018/01/01'
end = '2023/01/01'
data = web.DataReader('^NKX', 'stooq', start, end)
2.ライブラリをインポートする
まず、時系列機械学習ライブラリである fbprophet から Prophet をインポートします。
from fbprophet import Prophet
3.Prophetで株価を予測する
今回は、以下の条件で株価予測を行います。
対象:日経平均株価(^NKX)
学習期間:2018/1/1~2023/1/1
予測期間:2023/1/1以降、80日間の終値を予測
Prophetモデルのパラメータ:デフォルト
3. 1 データの整形・前処理
Prophetを用いるには、日付カラム名を ds、予測するカラム名を y にする必要があります。今回は終値 Close を予測データとして扱うので、以下のように加工します。
元々のデータは、日付がインデックスとなっているので、インデックスをリセットし、Date 列の日付データとClose 列の終値データをそれぞれ新たに作った ds 列と y 列に格納します。
# インデックスをリセット
data = data.reset_index()
# 新たに ds列と y列を追加
data['ds'] = data['Date']
data['y'] = data['Close']
data
3. 2 予測モデル作成
以下のように予測モデルを生成します。インスタンス生成からfitの流れです。モデルに手を加えたい場合は、Prophet( ) の ( ) の中に記述します。今回はデフォルトで行うので空です。
model = Prophet() # インスタンス生成
model.fit(data)
3. 3 予測期間の設定と学習モデルによる予測
今回は2023/1/1以降、80日間の予測をしようと思うので、periods=80と設定します。また、freq = ‘d’で予測単位を日単位に設定します。
future = model.make_future_dataframe(periods=80, freq='d') # 予測期間の設定
forecast =model.predict(future) # 学習モデルによる予測
学習モデルによる予測データ forecastの中身をprintで確認してみます。
print(forecast.info())
print(forecast)
<forecastの中身>
4.予測結果の描画
4. 1 予測結果の描画
黒い点が実データです。2023/1/1以降の黒い点がない部分が予測箇所です。
# ラベルをつけてチャートを表示
fig = model.plot(forecast)
# チャートを表示
fig.show()
4. 2 規則性の可視化
plot_components で規則性を可視化できます。グラフは、上から順にトレンド、週周期、年周期です。
model.plot_components(forecast)
今回は、予測ライブラリ Prophet を使って株価を予測するのみとしましたが、別の投稿でパラメータの最適化やモデルの精度検証をしていきたいと考えています。