Prophet(Python)で株価の予測結果はどれくらい当たっているのか見てみた【バックテスト】

4月 24, 2021

以前,Facebook社の時系列予測ライブラリ『Prophet』を使ってコカ・コーラ(KO)の株価予測をやってみました.

Facebook製時系列予測「Prophet」で株価を予測してみました【Python】

2015/1/1~2021/1/1のデータを使って予測してみたところ,2021/1/1以降の250日間の予測結果は以下のようになりました.

そして,この記事を書いている現在は2021/4なので,この予測と実際の結果を比較することができます.

今回は,Prophetの予測はどれくらい当たっていたのか?について検証したいと思います.

ただし,予測はProphetのデフォルト設定で行っており,モデルの調整は行っていないことに注意してください.調整を行うことで,未来予測はより当たりやすくなるかもしれません.

とりあえず重ねてみる

厳密な評価は後にして,実際の株価を先ほどのグラフに載せてみます.

やり方ですが,Prophetでは便利な描画関数が用意されているものの,データの形の仕様が厳しくていじりにくいです.実際のデータを重ねたいだけなのに,すんなりとはいかないです.

とはいえ各データカラムを取り出して加工して改めてプロットするのも面倒です.

(この辺が分からないひとは,以前の記事を参考にしてみてください)

そこで,Prophetでモデル生成からやり直して,予測部分は前のデータを用いることで,さらっとプロットしてみます.

※ここではコードの一部しか紹介しないので,実際に実行したい方は記事の最後に記載されたいるまとめコードをご覧ください.

まず,現在までの株価を改めて取得します.

#改めて現在までのデータを取得
end = datetime.date.today()
data2 = web.DataReader('KO', 'yahoo', start, end) #データの取得

次に,以前と同様にProphetに合わせて株価データを加工します.

#Prophetのためにデータを加工
data2['ds'] = data2.index
data2 = data2.rename({'Adj Close':'y'},axis=1)

そして,モデルを作りなおします(ここでdata2が入ります).

#モデルの生成
model2 = Prophet()
model2.fit(data2)

最後に,描画します(ここで,予測部分forecast_dataは以前のものを使っていることに注意).forecast_dataには,予測データy_hat,その上限と下限yhat_lower,yhat_upperが入っています.

#株価データと予測のプロット
fig = model2.plot(forecast_data)

これで,以下のグラフが得られます(これを描画するまとめコードは記事の一番下に記載しています).

さて,この結果をみると,思いっきり外れている感じがしますね

まあ,そんなに簡単に当たったらPythonを使えるだけで億万長者ですから.そんなに甘くないという話です.

ただし,コロナショック付近(2020/1~2020/3)でも予測範囲から外れていますから,決めつけはよくありません.たまたま外れているだけかもしれませんから.実際,よく見てみると予測の直後の1か月ほどは当たっています.

予測は未来になるほど外れやすいことはデータ分析の観点で認めていますし(参考:Prophetで生成した株価モデルの精度を確認する),なにより急激な株価の変化についていけるわけがないので,Prophetによる予測は穏やかなトレンドにしか効果がないことが伺えます(というか,機械学習全般).

結論としては,「株価が荒波のように動いているときは時系列予測によるテクニカル分析は役に立たない」ということですね.

コロナ後の予測は,世界情勢などからするべきで,テクニカル分析で行うのは無理がありました.

ドメイン知識も入れてませんからね.

コロナショック以前で比較してみる

というわけで,コロナショック以前までで比較しましょう.

2018/1/1までのデータでモデル調整を行い,それ以降の250日間で予測と実際の株価を比較してみます.

…微妙ですね.まあ,こんなものでしょう.

上昇トレンドは抑えているという感じでしょうか.いったん下がって上がるという『形』はあっているので,シフトすればほぼピッタリ合いそうではありますね.

結論:Prophetで未来予測はできるか

やる前から分かってはいましたが,未来予測をするというのはなかなか難しいですね.

個人的には,今回のようなProphetによる予測はほとんどあてにしていません.

(今回はかなり雑にProphetを使ってしまったので,もう少しモデルや期間を丁寧に調整すれば,信頼性は上がるのかもしれませんが…)

ただし,これはテクニカル分析が意味ないというわけではなく,トレンドを分析したりパターンを認識することはデータ分析の範囲内で統計的には十分な意味を持つことは間違いないです.

「得られた分析結果をどう使うのか」が株価予測のカギを握ると思います.

例えば,個人的にはテクニカル分析指標であるMACDボリンジャーバンドは統計的な意味を持つので,株価の売買をするときに参考にしています.一方で,未来予測,パターン認識の部分は自分の感覚に頼っています

予測結果に現在までのデータを重ねて描画するコード

※詳細は本分を参考にしてください

from fbprophet import Prophet
import pandas_datareader.data as web
import datetime

start = datetime.date(2015,1,1)
end = datetime.date(2021,1,1)

data = web.DataReader('KO', 'yahoo', start, end) #データの取得

#Prophetのためにデータを加工
data['ds'] = data.index
data = data.rename({'Adj Close':'y'},axis=1)

#モデルの生成
model = Prophet()
model.fit(data)

#未来予測
future_data = model.make_future_dataframe(periods=250, freq = 'd')
forecast_data = model.predict(future_data)

#改めて現在までのデータを取得
end = datetime.date.today()
data2 = web.DataReader('KO', 'yahoo', start, end) #データの取得

#Prophetのためにデータを加工
data2['ds'] = data2.index
data2 = data2.rename({'Adj Close':'y'},axis=1)

#モデルの生成
model2 = Prophet()
model2.fit(data2)

#株価データと予測のプロット
fig2 = model2.plot(forecast_data)