Edited at

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

More than 1 year has passed since last update.


はじめに

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ができあがりました。

落ち着け自分。まだあわてるような時間じゃない。