見出し画像

【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の中身>

ds:日付データ
trend:データのトレンド性
yhat_lower:データ予測の下限
yhat_upper:データ予測の上限
trend_lower:トレンド予測の下限
trend_upper:トレンド予測の上限
additive_terms:周期性部分のトータル(weeklyとyearlyの和)
additive_terms_lower:additive_termsの下限
additive_terms_upper:additive_termsの上限
weekly:1週間の周期性
weekly_lower:1週間の周期性の下限
weekly_upper:1週間の周期性上限
yearly:1年間の周期性
yearly_lower:1年間の周期性の下限
yearly_upper:1年間の周期性上限
multiplicative_terms:増加する周期性
multiplicative_terms_lower:multiplicative_termsの下限
multiplicative_terms_upper:multiplicative_termsの上限
yhat:データ(株価)予測値、yの青い線

4.予測結果の描画

4. 1 予測結果の描画
黒い点が実データです。2023/1/1以降の黒い点がない部分が予測箇所です。

# ラベルをつけてチャートを表示
fig = model.plot(forecast)

# チャートを表示
fig.show()

4. 2 規則性の可視化
plot_components で規則性を可視化
できます。グラフは、上から順にトレンド、週周期、年周期です。

model.plot_components(forecast)


今回は、予測ライブラリ Prophet を使って株価を予測するのみとしましたが、別の投稿でパラメータの最適化やモデルの精度検証をしていきたいと考えています。

この記事が気に入ったらサポートをしてみませんか?