LoginSignup
19
25

More than 5 years have passed since last update.

日経平均株価の予測をTensorFlowで機械学習させ精度の向上を試みた 62%から68%位になった

Last updated at Posted at 2017-09-08

はじめに

TensorFlowを投資につかうまで 衝撃のサンプル編 (5)のコードを使用します。
大元はGoogleの財務時系列データを使用した機械学習です。
ここまででは62%位の精度でした。

環境

Tensorflow1.3
python3.5.2
windows10

予測の前提

  • 日経平均株価の当日のcloseが前日のcloseより価格が上か下か予測します。
  • 判断に使用するデータはすべて1日以上前のデータを使用します。
  • 予測のタイミングは当日の取引開始時間の前です。

最初に学習させるデータのインデックスは以下です。
N225 # Nikkei 225, Japan
HSI # Hang Seng, Hong Kong
GDAXI # DAX, German
DJI # Dow, US
GSPC # S&P 500, US
SSEC # Shanghai Composite Index (China)
BVSP # BOVESPA, Brazil

2007-08-23 ~ 2017-08-21の約10年分の日足のヒストリカルデータを使用しています。
最新のヒストリカルデータ80%を学習に使用し、残り20%のヒストリカルデータをテストに使用します。
評価はテストデータからのaccuracyのみ考慮します。

試すもの

Optimizerの変更
学習データの変更
学習回数の変更
隠れ層、ニューロンの数の変更

隠れ層、ニューロンの数について

いまさらですが隠れ層のレイヤーとニューロンの数について概要だけ記載します。

tikz11.png

神経細胞を模した作りで〇がニューロン、矢印がシナプスです。
input layerが入力層、hidden layerが隠れ層、output layerが出力層です。
今回の場合入力層のニューロンの数が学習させたデータの種類数と同じになり出力層のニューロンの数は上がるか下がるかの2つになっています。
また隠れ層は入力層、出力層に関係なくニューロンの数と層の数を変更できます。
これがニューラルネットワークをつかった深層学習と呼ばれているものです。

Optimizerの検証

Optimizerはどのようにニューラルネットワークのニューロンとシナプスの中の数値を調整していくかのアルゴリズムです。
試験するOptimizerは以下になります。
AdamOptimizerが評価が高いそうですが、簡単にためせるものは全部ためし今回の財務時系列データが得意なOptimizerを探します。

  • AdamOptimizer
  • AdadeltaOptimizer
  • AdagradOptimizer
  • GradientDescentOptimizer
  • FtrlOptimizer
  • ProximalGradientDescentOptimizer
  • ProximalAdagradOptimizer
  • RMSPropOptimizer

隠れ層は以下を使います。配列の長さが層の数で数値がニューロンの数です。

  • [] #隠れ層なし
  • [50] #隠れ層1層でニューロン50個
  • [50,25] #隠れ層2層でニューロン50個と25個
  • [10, 20, 10] #隠れ層3層でニューロン10個と20個と10個
  • [25, 50, 25] #隠れ層3層でニューロン25個と50個と25個

80000回学習させます。

[] [50] [50,25] [10,20,10] [25,50,25]
AdamOptimizer 0.601227 0.623722 0.625767 0.631902 0.625767
AdadeltaOptimizer 0.517382 0.623722 0.629857 0.517382 0.517382
AdagradOptimizer 0.517382 0.517382 0.517382 0.517382 0.517382
GradientDescentOptimizer 0.611452 0.625767 0.517382 0.517382 0.517382
FtrlOptimizer 0.517382 0.517382 0.517382 0.517382 0.517382
ProximalGradientDescentOptimizer 0.611452 0.629857 0.517382 0.517382 0.517382
ProximalAdagradOptimizer 0.517382 0.517382 0.517382 0.517382 0.517382
RMSPropOptimizer 0.609407 0.625767 0.654397 0.623722 0.619632

RMSPropOptimizerの[50,25]が65% 次に AdamOptimizerの[10,20,10]が63% なのでこの2つを使用することにします。

隠れ層なし[]も隠れ層がある時より精度が高くなっていることはないので排除します。
しかし隠れ層についてはどれがいいのかこれではよくわかりません。後程検証します。

入力データの検証

HSI SSECを除く

前日のデータでの相関の低かったHSI,SSECはノイズになっている可能性があるので無くしてみます。
HSIの当日のデータの相関は0.5程度あり高いですが、時間帯が同じなので予測には使えません。

隠れ層[50],[50,25],[10, 20, 10],[25, 50, 25],[100,50]で30000回学習させます。

HSI,SSEC有

[50] [50, 25] [10, 20, 10] [25, 50, 25] [100, 50]
AdamOptimizer 0.623016 0.626984 0.626984 0.619048 0.623016
RMSPropOptimizer 0.638889 0.638889 0.638889 0.626984 0.621032

HSI,SSEC無

[50] [50, 25] [10, 20, 10] [25, 50, 25] [100, 50]
AdamOptimizer 0.615079 0.632937 0.632937 0.609127 0.611111
RMSPropOptimizer 0.613095 0.628968 0.634921 0.603175 0.607143

オオウ、これはかなり判断しにくいです。
AdamOptimizerはHSI,SSECを除くと性能が上がることがありますが、RMSPropOptimizerはHSI,SSECを除くと性能が明らかに落ちました。
相関の低かったHSI,SSEC有無によって精度が上がるか下がるか一概には判断できずあまり影響がない事がわかりました。

外国為替の情報を入れてみる

隠れ層は[50]で30000回学習させます。
USD/JPY,AUD/JPY,EUR/JPYを順次追加していきます。

USD/JPY USD/JPY AUD/JPY USD/JPY AUD/JPY EUR/JPY
AdamOptimizer 0.632936507937 0.666666666667 0.662698412698
RMSPropOptimizer 0.668650793651 0.676587301587 0.674603174603

ずいぶん精度があがりました。ちびっとですがEUR/JPYを追加すると精度がさがったのでUSD/JPY・AUD/JPYだけ追加します。

もっと前の日のデータも判断材料にいれてみる

元々は1~3日前のデータを判断材料としていれていますがこれを1~5日前まで伸ばしてみます。
隠れ層は[50]で30000回学習させます。

1~3日前 1~4日前 1~5日前
AdamOptimizer 0.666666666667 0.666666666667 0.670634920635
RMSPropOptimizer 0.676587301587 0.686507936508 0.650793650794

1~4日前のRMSPropOptimizerは68%まで改善しました。
5日前までいれるとAdamOptimizerは改善しましたが、RMSPropOptimizerは65%まで下がってしまいました。

2回目

1~3日前 1~4日前 1~5日前
AdamOptimizer 0.644841269841 0.660714285714 0.650793650794
RMSPropOptimizer 0.672619047619 0.668650793651 0.640873015873

Optimizerの話になってしまいますが、ここまでの検証で全体的にRMSPropOptimizerのほうが精度がかなり高く出るタイミングがありますが同様に精度が低くでることもありました。
検証回数も1,2回程度ではだめそうですね。今回は一通り試すのを目的とし日付に関してはあまり根拠にはならないですが、68%の精度の出た1~4日前のデータを使用し判断するとして検証を進めます。

隠れ層の数とニューロンの数の検証

見つけられてないだけかもしれませんが、調べてみると確立したものは無いという理解になりました。
入力層のニューロン数や出力の仕方でも変化するそうなので総当たりするしかなさそうです。

参考 
multi-layer perceptron (MLP) architecture: criteria for choosing number of hidden layers and size of the hidden layer?
How to choose the number of hidden layers and nodes in a feedforward neural network?

以下の2点は共通して参考に書かれていました。
・隠れ層1層でだいたいなんとかなる。
・隠れ層のニューロンの数は(今回の場合)入力層の数より少なくてよい
隠れ層1層から試せという記述もありましたがとりあえず手あたり次第試してみます。

出力層は上がるか下がるかの2ニューロン、入力層は以下の40ニューロンになっています。

AORD_1,AUDJPY_1,BVSP_1,DJI_1,GDAXI_1,GSPC_1,HSI_1,N225_1,SSEC_1,USDJPY_1,AORD_2,AUDJPY_2,BVSP_2,DJI_2,GDAXI_2,GSPC_2,HSI_2,N225_2,SSEC_2,USDJPY_2,AORD_3,AUDJPY_3,BVSP_3,DJI_3,GDAXI_3,GSPC_3,HSI_3,N225_3,SSEC_3,USDJPY_3,AORD_4,AUDJPY_4,BVSP_4,DJI_4,GDAXI_4,GSPC_4,HSI_4,N225_4,SSEC_4,USDJPY_4

*アンダーバー数値は何日前の意味です。

今回は一通り動きが見たくて隠れ層の変更と学習回数は手あたり次第1個ずつやっていきました。
学習の経過をグラフで出してくれるtensorboardを使用して学習途中でテストすれば早くできると思います。

結果

隠れ層は1層で十分な精度がでていました。
隠れ層1層のニューロンの数は20~50で試験しましたがあんまり変わんなそう。
それぐらいしかわかりませんでした。
元々の精度が66%程度と低いからかそんなに頑張る必要なさそうです。
90%から96%に改善する場合やもっと複雑な出力の時に必要になるのでしょうか。

テスト結果を置いておきます。グラフにしようと思ったらバラバラ過ぎてまとまりませんでした。

テストデータでの正確さ 隠れ層 Optimizer 学習回数
0.688492063 [40] RMSPropOptimizer 32000
0.688492063 [50,20] RMSPropOptimizer 32000
0.68452381 [10,20,10] AdamOptimizer 33000
0.680555556 [30] RMSPropOptimizer 31000
0.680555556 [20] AdamOptimizer 32000
0.680555556 [40] RMSPropOptimizer 33000
0.678571429 [50] AdamOptimizer 31000
0.678571429 [30] RMSPropOptimizer 32000
0.678571429 [50] RMSPropOptimizer 32000
0.676587302 [50,20] RMSPropOptimizer 28000
0.676587302 [30,10] RMSPropOptimizer 30000
0.676587302 [30] AdamOptimizer 32000
0.676587302 [50] AdamOptimizer 32000
0.676587302 [30] AdamOptimizer 33000
0.676587302 [30] AdamOptimizer 33000
0.676587302 [30] RMSPropOptimizer 33000
0.674603175 [50] RMSPropOptimizer 19000
0.674603175 [50] RMSPropOptimizer 19000
0.674603175 [30,10] RMSPropOptimizer 24000
0.674603175 [40] AdamOptimizer 28000
0.674603175 [40] RMSPropOptimizer 30000
0.674603175 [50,20] RMSPropOptimizer 31000
0.674603175 [40] AdamOptimizer 33000
0.674603175 [40,20] RMSPropOptimizer 33000
0.672619048 [50] RMSPropOptimizer 21000
0.672619048 [50] RMSPropOptimizer 21000
0.672619048 [30,10] RMSPropOptimizer 26000
0.672619048 [50] RMSPropOptimizer 28000
0.672619048 [40] AdamOptimizer 31000
0.672619048 [20] AdamOptimizer 33000
0.670634921 [10,20,10] RMSPropOptimizer 30000
0.670634921 [15,30,15] RMSPropOptimizer 30000
0.670634921 [40] AdamOptimizer 24000
0.670634921 [40,20] RMSPropOptimizer 24000
0.670634921 [40] AdamOptimizer 26000
0.670634921 [50,20] RMSPropOptimizer 26000
0.670634921 [20] AdamOptimizer 28000
0.670634921 [30,10] RMSPropOptimizer 28000
0.670634921 [10,20,10] RMSPropOptimizer 28000
0.670634921 [30] RMSPropOptimizer 30000
0.670634921 [50] RMSPropOptimizer 30000
0.670634921 [30] AdamOptimizer 31000
0.670634921 [40] RMSPropOptimizer 31000
0.670634921 [20] RMSPropOptimizer 32000
0.670634921 [10,20,10] AdamOptimizer 32000
0.670634921 [20] AdamOptimizer 33000
0.670634921 [20] RMSPropOptimizer 33000
0.670634921 [40,20] RMSPropOptimizer 33000
0.668650794 [30] RMSPropOptimizer 24000
0.668650794 [10,20,10] AdamOptimizer 24000
0.668650794 [40,20] RMSPropOptimizer 26000
0.668650794 [30] AdamOptimizer 28000
0.668650794 [20] AdamOptimizer 30000
0.668650794 [40] AdamOptimizer 30000
0.668650794 [30,10] RMSPropOptimizer 32000
0.668650794 [30] RMSPropOptimizer 33000
0.668650794 [30,10] RMSPropOptimizer 33000
0.666666667 [50] RMSPropOptimizer 22000
0.666666667 [50] RMSPropOptimizer 22000
0.666666667 [40] RMSPropOptimizer 24000
0.666666667 [20] AdamOptimizer 26000
0.666666667 [30] RMSPropOptimizer 26000
0.666666667 [40] RMSPropOptimizer 26000
0.666666667 [40,20] RMSPropOptimizer 30000
0.666666667 [40,20] RMSPropOptimizer 32000
0.666666667 [20] RMSPropOptimizer 33000
0.66468254 [10,20,10] RMSPropOptimizer 30000
0.66468254 [10,20,10] RMSPropOptimizer 20000
0.66468254 [20] RMSPropOptimizer 24000
0.66468254 [50,20] RMSPropOptimizer 24000
0.66468254 [20] RMSPropOptimizer 26000
0.66468254 [50] RMSPropOptimizer 26000
0.66468254 [20] RMSPropOptimizer 28000
0.66468254 [30] RMSPropOptimizer 28000
0.66468254 [50] AdamOptimizer 28000
0.66468254 [50] AdamOptimizer 30000
0.66468254 [50,20] RMSPropOptimizer 30000
0.66468254 [50] AdamOptimizer 33000
0.66468254 [30,10] RMSPropOptimizer 33000
0.66468254 [50,20] RMSPropOptimizer 33000
0.662698413 [50] RMSPropOptimizer 20000
0.662698413 [40] AdamOptimizer 20000
0.662698413 [40] RMSPropOptimizer 22000
0.662698413 [30] AdamOptimizer 24000
0.662698413 [50] RMSPropOptimizer 24000
0.662698413 [10,20,10] RMSPropOptimizer 30000
0.662698413 [50] RMSPropOptimizer 33000
0.662698413 [40] RMSPropOptimizer 33000
0.662698413 [50] AdamOptimizer 33000
0.660714286 [50] RMSPropOptimizer 30000
0.660714286 [10,20,10] RMSPropOptimizer 21000
0.660714286 [10,20,10] RMSPropOptimizer 21000
0.660714286 [20] AdamOptimizer 22000
0.660714286 [20] AdamOptimizer 24000
0.660714286 [50] AdamOptimizer 26000
0.660714286 [20] RMSPropOptimizer 30000
0.660714286 [30] AdamOptimizer 30000
0.660714286 [50] RMSPropOptimizer 31000
0.660714286 [40] AdamOptimizer 32000
0.660714286 [50,20] AdamOptimizer 33000
0.660714286 [40] AdamOptimizer 33000
0.660714286 [50] RMSPropOptimizer 33000
0.658730159 [50] RMSPropOptimizer 30000
0.658730159 [50] RMSPropOptimizer 18000
0.658730159 [10,20,10] RMSPropOptimizer 22000
0.658730159 [10,20,10] AdamOptimizer 18500
0.658730159 [40] AdamOptimizer 19500
0.658730159 [50] AdamOptimizer 20000
0.658730159 [50,20] RMSPropOptimizer 33000
0.656746032 [20] RMSPropOptimizer 30000
0.656746032 [20,40,20] RMSPropOptimizer 30000
0.656746032 [10,20,10,5] RMSPropOptimizer 30000
0.656746032 [15,30,15] RMSPropOptimizer 22000
0.656746032 [10,20,10] RMSPropOptimizer 24000
0.656746032 [10,20,10] RMSPropOptimizer 26000
0.656746032 [40,20] RMSPropOptimizer 28000
0.656746032 [40,20] AdamOptimizer 30000
0.656746032 [20] RMSPropOptimizer 31000
0.656746032 [10,20,10] RMSPropOptimizer 32000
0.654761905 [15,30,15] RMSPropOptimizer 19000
0.654761905 [50] RMSPropOptimizer 30000
0.654761905 [10,20,10] RMSPropOptimizer 30000
0.654761905 [15,30,15] RMSPropOptimizer 19000
0.654761905 [30] RMSPropOptimizer 20000
0.654761905 [30] AdamOptimizer 22000
0.654761905 [40,20] RMSPropOptimizer 22000
0.654761905 [50] AdamOptimizer 24000
0.654761905 [40] RMSPropOptimizer 28000
0.654761905 [10,20,10] RMSPropOptimizer 33000
0.652777778 [50,25] RMSPropOptimizer 30000
0.652777778 [5,10,5] RMSPropOptimizer 30000
0.652777778 [10,20,10] RMSPropOptimizer 19000
0.652777778 [10,20,10] RMSPropOptimizer 19000
0.652777778 [20] AdamOptimizer 18500
0.652777778 [40] AdamOptimizer 18500
0.652777778 [50] RMSPropOptimizer 18500
0.652777778 [20] AdamOptimizer 19500
0.652777778 [10,20,10] AdamOptimizer 19500
0.652777778 [20] AdamOptimizer 20000
0.652777778 [50,20] RMSPropOptimizer 22000
0.652777778 [30] AdamOptimizer 26000
0.652777778 [50,20] AdamOptimizer 28000
0.652777778 [10,20,10] AdamOptimizer 28000
0.652777778 [30,10] AdamOptimizer 33000
0.650793651 [15,30,15] RMSPropOptimizer 21000
0.650793651 [10,20,10] RMSPropOptimizer 18000
0.650793651 [15,30,15] RMSPropOptimizer 21000
0.650793651 [30,10] RMSPropOptimizer 19500
0.650793651 [40] RMSPropOptimizer 20000
0.650793651 [50] RMSPropOptimizer 20000
0.650793651 [30,10] RMSPropOptimizer 20000
0.650793651 [30] RMSPropOptimizer 22000
0.650793651 [50] RMSPropOptimizer 22000
0.650793651 [30,10] RMSPropOptimizer 22000
0.650793651 [30,10] AdamOptimizer 24000
0.648809524 [50] RMSPropOptimizer 40000
0.648809524 [30] RMSPropOptimizer 18500
0.648809524 [30,10] RMSPropOptimizer 18500
0.648809524 [30] AdamOptimizer 19500
0.648809524 [40,20] RMSPropOptimizer 19500
0.648809524 [10,20,10] AdamOptimizer 20000
0.648809524 [20] RMSPropOptimizer 22000
0.648809524 [30,10] AdamOptimizer 26000
0.648809524 [10,20,10] RMSPropOptimizer 33000
0.646825397 [20] RMSPropOptimizer 18500
0.646825397 [30] AdamOptimizer 18500
0.646825397 [40] RMSPropOptimizer 18500
0.646825397 [50,20] RMSPropOptimizer 18500
0.646825397 [40,20] RMSPropOptimizer 18500
0.646825397 [30] RMSPropOptimizer 19500
0.646825397 [40] RMSPropOptimizer 19500
0.646825397 [50] AdamOptimizer 19500
0.646825397 [50] RMSPropOptimizer 19500
0.646825397 [40,20] AdamOptimizer 20000
0.646825397 [40,20] RMSPropOptimizer 20000
0.646825397 [40] AdamOptimizer 22000
0.64484127 [50,20] RMSPropOptimizer 19500
0.64484127 [50] AdamOptimizer 22000
0.64484127 [10,20,10] AdamOptimizer 26000
0.642857143 [50] RMSPropOptimizer 15000
0.642857143 [20] RMSPropOptimizer 19500
0.642857143 [30] AdamOptimizer 20000
0.642857143 [30,10] AdamOptimizer 20000
0.642857143 [10,20,10] RMSPropOptimizer 22000
0.640873016 [50,100,50] RMSPropOptimizer 30000
0.640873016 [50] AdamOptimizer 18500
0.640873016 [30,10] AdamOptimizer 18500
0.640873016 [20] RMSPropOptimizer 20000
0.640873016 [50,20] RMSPropOptimizer 20000
0.640873016 [30,10] AdamOptimizer 33000
0.638888889 [10,20,10] RMSPropOptimizer 18500
0.638888889 [30,10] AdamOptimizer 28000
0.638888889 [10,20,10] AdamOptimizer 33000
0.636904762 [25,50,25] RMSPropOptimizer 30000
0.636904762 [10,20,10] RMSPropOptimizer 19500
0.636904762 [10,20,10] RMSPropOptimizer 20000
0.634920635 [40,20] AdamOptimizer 18500
0.634920635 [40,20] AdamOptimizer 19500
0.634920635 [40,20] AdamOptimizer 22000
0.634920635 [40,20] AdamOptimizer 26000
0.634920635 [40,20] AdamOptimizer 28000
0.634920635 [40,20] AdamOptimizer 33000
0.634920635 [40,20] AdamOptimizer 33000
0.632936508 [10,20,10] RMSPropOptimizer 40000
0.632936508 [10,20,10] RMSPropOptimizer 15000
0.632936508 [30,10] AdamOptimizer 22000
0.632936508 [10,20,10] AdamOptimizer 22000
0.632936508 [40,20] AdamOptimizer 24000
0.632936508 [40,20] AdamOptimizer 32000
0.630952381 [50,20] AdamOptimizer 19500
0.630952381 [50,20] AdamOptimizer 32000
0.628968254 [50,20] AdamOptimizer 18500
0.628968254 [30,10] AdamOptimizer 19500
0.628968254 [50,20] AdamOptimizer 20000
0.628968254 [50,20] AdamOptimizer 22000
0.628968254 [50,20] AdamOptimizer 24000
0.628968254 [50,20] AdamOptimizer 26000
0.628968254 [50,20] AdamOptimizer 30000
0.628968254 [10,20,10] AdamOptimizer 30000
0.626984127 [50,20] AdamOptimizer 31000
0.626984127 [50,20] AdamOptimizer 33000
0.623015873 [30,10] AdamOptimizer 30000
0.619047619 [50] RMSPropOptimizer 10000
0.619047619 [30,10] AdamOptimizer 32000
0.613095238 [10,20,10] RMSPropOptimizer 10000

まとめ

学習させるデータを変更したのが一番精度があがったので学習させるデータを探すのが一番重要そうです。まあ当たり前のような気もします。
その後隠れ層は1層で試験しAdamかRMSPropOptimizerを使っていこうと思います。今回のようなAIの場合ニューラルネットワーク自体の調整はさほど変なことしなければ大丈夫という感じを受けました。
今回やった検証内容は試したいことの一部でしたが不確定な要素も多く判断しにくかったです。
フェイスブックがAI同士で会話させていたようにAIの精度をかってに上げてくれる仕組みも考えなければならなそうです。

68%の正確さをもつAIができあがりました。
落ち着け自分。まだあわてるような時間じゃない。

19
25
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
25