時系列予測システムProphetを使って2017年の株価を予測する

時系列予測ツールProphetの応用例として日経平均株価を予測してみましょう。
いきなりカネ儲けの話で恐縮ですが、だって誰もが『予測』という単語から一番初めに連想する数字でしょう?

元データは株価データサイトから取ってきました。
日ごとの終値を予測対象のデータとし、過去4年分を学習データに使います。
使用データ

#R
library(prophet)
library(dplyr)
nikkei.original <- read.csv("nikkei.csv", header=TRUE)
nikkei <- nikkei.original %>% rename(ds = ymd, y = end) %>% select(ds, y)
nikkei %>% arrange(ds) %>% head(7)
#       ds        y
#1 2013-01-04 10688.11
#2 2013-01-07 10599.01
#3 2013-01-08 10508.06
#4 2013-01-09 10578.57
#5 2013-01-10 10652.64
#6 2013-01-11 10801.57
#7 2013-01-15 10879.08

今の水準から見れば恐ろしく低い数字ですが、アベノミクスで加速しかかっているときです。買うならこのときだった。安倍総理を信じていれば・・・

株価の時系列分析を行うときはまず週末の扱いが面倒です。
週末は市場が休みのため株価がありません。
上の例でいうと2013年1月12日、13日が土日のためデータが入っていません。
また14日は成人の日でハッピーマンデーという分析者を苛立たせる移動祝日のためデータが入っていません。
伝統的には、欠損値が生じるのは仕方がないので前後の数字(ここでは1月11日と15日)から平均するなりしてとにかく埋めてやる、という方法が取られることが多いですが、これでいいのかという合理的な説明は難しいです。

Prophetはスプラインをモデルとして用いて分析するため欠損値に影響を受けません。
微妙にやっかいなうるう年も完全に無視できます。そのまま予測モデルにつっこみましょう。
ただし株価は比で動くので対数変換します。

#R
nikkei <- nikkei %>% mutate(y = log(y))
m <- prophet(nikkei)
future <- make_future_dataframe(m, prediods = 365) #365日先まで予測
future <- future[!(weekdays(future$ds) %in% c("Sunday", "Saturday")),] #週末は予測しない
forecast <- predict(m, future)
plot(m, forecast)

図1:日経平均株価過去4年分の学習とその先一年の予測(対数)。黒丸が実績値で青が予測値

ふむ、ぱっと見たところそれなりに学習できているように見えます。
Prophetは2017年後半に大きな上昇があると予測しているようです。
その理由を確認してみましょう。

#R
prophet_plot_components(m, future)

図2:Prophet予測要因分解

Prophetは2016年以降はゆるやかな回復基調を見込んでいます。
さらに周期性として10月から11月にかけて上昇するとモデルが学習していることが年末の株価上昇予測の根拠のようです。
なお、土日のデータは欠損しているためweekly seasonalityの土日部分が飛び出ているのは無視しましょう。

振り返って図1を見なおします。
確かに2013年、14年、15年、16年と10月から11月あたりの年末で大きな上昇が確認できます。
これだけ続いていればyearly seasonalityの年末での上昇は納得できます。

図2の2015年のトレンドの学習結果に注目しましょう。非常にガタガタしています。
これはトレンドの変化点がたくさん設定されていることを意味します。
Prophetが2015年の実績データを学習するのに苦労したことが分かります。
このような場合、周期性モデルだけではうまく予測できなかった、現実と合わなかったということを意味していますので、おそらく予測していたとしても精度は高くなかったでしょう。
ただ、他の年は比較的シンプルなトレンド成分を持っていますので、そこそこうまく説明できているようにも見えます。

生データと予測とを比べてみます。

#R
nikkei %>%
   filter(
      !(weekdays(ds) %in% c("Sunday", "Suturday")),
       ds > as.Date("2016-01-01")
   ) %>%
   with(plot(ds, exp(yhat))
nikkei.original %>%
   filter(ymd > as.Date("2016-01-01")) %>%
   with(points(ymd, end, col="blue"))

日経平均株価のProphetによる予測と実績値との比較

うーん、こういう風に見せつけられると上がる気がしてしまいますね。

【結論】

ということで、日経平均株価は今年は10月末から11月頭にかけて大きな上昇がある。
さあ、当たるも八卦当たらぬも八卦!

免責事項:本サイトの情報を元に大損こいても責任は取りません。


予測の結末

関連記事

コメントを残す