今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

日経平均の終値が前日より上がるか下がるかをTensorFlowで予測する(2)

この記事について

前回記事の続きです。
日経平均の終値が前日より上がるか下がるかをTensorFlowで予測する(1) - 今日も窓辺でプログラム

このシリーズでは、以下の記事で解説されていることを、日経平均に置き換えて実行しています。
datalab/FinancialTimeSeriesTensorFlow.ipynb at master · corrieelston/datalab · GitHub


前回は世界のマーケット指数を使って、日経平均の終値が前日より上がるか下がるかを6割の精度で予測しました。
今回は、隠れ層の導入、前々日のデータも使う、為替レートの情報も使う、という3つを試した結果、
テストデータでの精度が61.3%から65.8%まで向上したので、その過程をまとめておきます。

隠れ層の導入

記事では、2層の隠れ層を導入することで、精度が65%から72%まで向上していました。
前回のネットワークにも同様に隠れ層を導入して、精度がどうなったか評価してみます。
前回のコードとは、重み、バイアス、そしてモデルを定義する箇所に変更が必要で、コードはこのような形になります。

weights1 = tf.Variable(tf.truncated_normal([num_indices, 50], stddev=0.0001))
biases1 = tf.Variable(tf.ones([50]))

weights2 = tf.Variable(tf.truncated_normal([50, 25], stddev=0.0001))
biases2 = tf.Variable(tf.ones([25]))

weights3 = tf.Variable(tf.truncated_normal([25, 2], stddev=0.0001))
biases3 = tf.Variable(tf.ones([2]))

# This time we introduce a single hidden layer into our model...
hidden_layer_1 = tf.nn.relu(tf.matmul(feature_data, weights1) + biases1)
hidden_layer_2 = tf.nn.relu(tf.matmul(hidden_layer_1, weights2) + biases2)
model = tf.nn.softmax(tf.matmul(hidden_layer_2, weights3) + biases3)

入力(n_indices次元)がノードが50個の1つ目の隠れ層、そしてノードが25個の2つ目の隠れ層へと伝わった後、2つの出力層(N255_positive/N255_negative)へと伝わっていく様子がそのままプログラムに落とされているのがわかります。

結果は次のようになりました。前回(隠れ層なし)の場合と比較してみます。

隠れ層なし 隠れ層あり
Precision 0.7111111111111111 0.6301369863013698
Recall 0.3333333333333333 0.4791666666666667
F1 Score 0.45390070921985815 0.5443786982248521
Accuracy 0.6130653266331658 0.6130653266331658

細かい違いはありますが、精度としてはなんと同じになってしまいました。。

前々日のデータも使ってみる

元の記事では前々日のデータを使用しています。私は前回の記事でほとんど相関がなさそうと理由で前々日のデータは使わなかったので、そのせいかも、と思い、前々日のデータも使って再度挑戦してみました。

隠れ層なし 隠れ層あり
Precision 0.673469387755102 0.6125
Recall 0.34375 0.5104166666666666
F1 Score 0.45517241379310336 0.5568181818181818
Accuracy 0.6030150753768844 0.6080402010050251

隠れ層の導入で少し精度の向上は見られましたが、前々日の結果がない場合より精度は低いです。

相関の低い指数は除いてみる

相関のあまりない前々日のデータを入れたことによって精度が下がってしまったので、今度は逆に相関の低い指数はまったく情報を与えないようにしてみます。
相関が0.1未満だったもの、(HSIとAORD)を取り除いて、再度精度がどうなるか見てみます。隠れ層はあるモデルを使いました。

Precision = 0.6388888888888888
Recall = 0.4791666666666667
F1 Score = 0.5476190476190476
Accuracy = 0.6180904522613065

僅かですが、精度は向上したようです。

為替情報も使ってみる

いまいち精度が向上せず悔しいので、為替情報も入れてみることにします。
マネースクウェア・ジャパンという会社が過去の為替レートの日足データを無料で提供してくださっているので、今回はそれを用いました。
ヒストリカルデータ | マーケット情報 | M2JFX - マネースクウェア・ジャパン

まず、ドル円とユーロ円と日経平均の相関係数を前回と同じ方法で求めてみたところ、それぞれ0.38, 0.19程度でした。まずまずの相関です。
そこで、他の指数(HSIとAORD含む)に加えてドル円のレートも追加して、隠れ層もある隠れ層なしのネットワークで学習させてみたところ、次のような結果になりました。

Precision = 0.6666666666666666
Recall = 0.6534653465346535
F1 Score = 0.66
Accuracy = 0.6582914572864321

65.8%!
前回は61.3%だったので、約4.5%精度が向上しました。


記事ではS&P 500の予測精度が7割を超えているので、日経平均でも7割超えたいですね。
ここからは記事に頼らず自分で精度を上げていかないといけないので、いろいろ勉強したり先人のブログを読み漁ったりして何とか精度向上できないか試してみます。

2016/07/28 追記

65.8%の精度を出したのは、隠れ層ありのデータだと思っていましたが、改めて実行してみたところ、隠れ層なしでの数値のようでした。
隠れ層を追加したモデルで評価した場合は精度60.8%と、むしろ前回より下がるという結果になってしまっていました。
なぜこのような結果になったのか、現時点では全然わからないので、次回記事で少し掘り下げられたら、、と思っています。


次回記事
日経平均の終値が前日より上がるか下がるかをTensorFlowで予測する(2.5) - 今日も窓辺でプログラム