概要
前回、TensorFlowを使い、国際線の旅客数の推移を予測してみました。
結果は、これはいける!という感じです。
そこで、今回は実際の株価を予測してみましょう。
やってみようと思うこと
以下の通りです。
実際には、前回、国際線の旅客数の推移を予測してみた時と、ほぼ一緒です。
要するに、データだけ変えてみた感じです。
- フレームワークにTensorFlowを使ってみる
- 再帰型ニューラルネットワークである、RNN(Recurrent Neural Network)を使ってみる
- 自分自身の過去のデータを学習することで、未来を予測する
- RNNの実装として、LSTMを使う
NNの構築
パラメータチューニングが難しいことは周知の事実ですから、とりあえず適当なパラメタでNeural Networkを組んでみましょう。
# 隠れ層のノード数
nunit=8
# dropの比率
droprate=0.9995
# 入力層
net = tflearn.input_data(shape=[None, steps_of_history, 1],name="input_layer")
# 隠れ層(1層目)
net = tflearn.lstm(net, n_units=nunit, activation='relu', name="hidden_layer_1", return_seq=True, return_state=False)
net = tflearn.dropout(net, droprate, name="dropout_1")
# 隠れ層(2層目)
net = tflearn.lstm(net, n_units=nunit, activation='relu', name="hidden_layer_2", return_seq=False, return_state=False)
net = tflearn.dropout(net, droprate, name="dropout_2")
# 出力層
net = tflearn.fully_connected(net, 1, activation='linear',name="output_layer")
それでは機械学習開始
では学習させてみましょう。
net = tflearn.regression(net, optimizer="adam", learning_rate=0.001, loss="mean_square")
model = tflearn.DNN(net, tensorboard_verbose=0, tensorboard_dir="log")
model.fit(trainX, trainY, show_metric=False, validation_set=0.1, batch_size=3, n_epoch=20)
いろいろとパラメータがありますが、最終的によく合ったように見えたものを使っています。
早速結果
それでは、結果を見てみましょう。
東証一部上場のH社の終値を、期間内で最小値を0、最大値を1となるように規格化してあります。
期間中の前半の80%を訓練データ、残りの直近部分20%を予測(評価)に使っています。
結果のグラフ
黒破線:実際のデータ
青実線:学習期間のデータによる再現値
赤実線:学習期間外のデータによる予測値
なお、この結果は、予測点の予測は、その前の2点から予測を行っています。
すなわち、2日分のデータから、次の日の予測を行っていることになります。
全体感
かなりいい感じの再現、予測ができていると思います。
みなさんは、どう思われるでしょうか。
それでも、大きく外れているポイントがある
以下のタイミングは、実際の値(黒点線)と予測値(赤実線)で大きくずれています。
- 2017年2月頃
- 2017年7月頃
- 2017年10月頃までか?
なぜか、大きく下に外れるものの、上へのずれ方はそれほどおかしくないですね。
一方で、ピークの位置も悪くないです。
すなわち、「いつ」上がるのか下がるのかは、予測できていると言えそうです。
最後に
これをさらに精度を上げていきたいですね。
特に期待するのは、以前に取り組んだこれ、やこれのように、twitterのデータを取り込むことをやってみたいです。
ただ、どう取り込むかは難しいですね。
以前のように、twitterのつぶやきを愚直にそのままベクトル化しても効果は薄そうです。
- どのアカウントを使うか
- いつの内容を使うか
- どのように加工するか
- データ間で演算する
- データを解釈して新たなベクトルや値をつくる
こんな工夫が必要そうです。まだまだ、先は長そうだなぁ。。。