Deep Learningを使った株価予想のプログラミングをサックと実行する

2022年8月14日日曜日

Python備忘録

t f B! P L

2022年8月14日 更新履歴

入力と出力データを学習データとテストデータに分類

前回、入力データと出力データを作ったところで一息ついて元気満々。

今回は、前回作った入力データと出力データを元に、人口知能が学習するための学習データと、学習した結果をチェックするテストデータを作るところから再開しよう!

説明しやすくするため図を作ってきましたよ!

しょーた、やるわね♡

今回は、前回の作った入力データと出力データ株価データを使って、人工知能を動かしてみます。

その前に、人口知能へ与えるデータの構成を理解することが大切になります。図をご覧ください。

  • 入力データを、学習用とテスト用の2種類の入力データに分ける。
  • 2種類の比率は、3:1程度(特に決まりはない)
  • 出力データも、同じ比率で学習用とテスト用の出力データに分ける。
  • 最終日の入力データに対して、人口知能が答える場所を用意する。

これを実現したのが以下のコードになります。

学習データ、テストデータ、予測データを実際に作る

  • in_learning : 人口知能が学習するための入力データ
  • out_learning : 人口知能が学習するための出力データ
  • in_test : 人口知能が学習した結果を自らテストするための入力データ
  • out_test : 人口知能が学習した結果を自らテストするための答え合わせデータ
  • in_predictions : 予測する時に使う入力データ

n = int( ( len(training_in) * 3 ) / 4 )

in_learning, out_learning = training_in[0:n], training_out[0:n]
in_test,  out_test  = training_in[n:-2], training_out[n:-2] 
in_predictions = training_in[-10:]
    

予測するデータは最終日の1日だけでいい訳ですが、何故か10個以上求められてエラーが出るので10日分与えています。実際に使うのは、最後の1日分だけになります。

いよいよ人口知能を動作させる

実行は、TensorFlowのバックエンド実装をもつkerasライブラリを使って行います。kerasは、機械学習のコンペを企画しているKaggleでも人気のライブラリとなっています。

ここでは、人口知能を動かすことを目的としてますので、詳細な説明は省略します。


from tensorflow import keras
from tensorflow.keras import layers

input_number = len(in_learning[0])
output_number = len(out_learning[0])

model = keras.Sequential([
    layers.Dense(32, activation="relu",input_shape=(input_number,)),
    layers.Dense(8, activation="relu"),
    layers.Dense(output_number, activation="sigmoid")
])
model.compile(optimizer="rmsprop",
              loss="binary_crossentropy",
              metrics=["accuracy"])
model.fit(in_learning, out_learning, epochs=10, batch_size=512)
score = model.evaluate(in_test, out_test)
print('loss=', score[0])
print('accuracy=', score[1])
    

fitが学習、evaluateが検証(テスト)となっています。実行してみます。


Epoch 1/10
4257/4257 [==============================] - 1s 271us/sample - loss: 0.6499 - acc: 0.7200
Epoch 2/10
4257/4257 [==============================] - 0s 20us/sample - loss: 0.6307 - acc: 0.7934
Epoch 3/10
4257/4257 [==============================] - 0s 25us/sample - loss: 0.6145 - acc: 0.79350s - loss: 0.6177 - acc: 0.795
Epoch 4/10
4257/4257 [==============================] - 0s 24us/sample - loss: 0.5986 - acc: 0.7935
Epoch 5/10
4257/4257 [==============================] - 0s 23us/sample - loss: 0.5825 - acc: 0.7935
Epoch 6/10
4257/4257 [==============================] - 0s 25us/sample - loss: 0.5673 - acc: 0.7935
Epoch 7/10
4257/4257 [==============================] - 0s 24us/sample - loss: 0.5527 - acc: 0.7935
Epoch 8/10
4257/4257 [==============================] - 0s 23us/sample - loss: 0.5385 - acc: 0.7935
Epoch 9/10
4257/4257 [==============================] - 0s 18us/sample - loss: 0.5268 - acc: 0.7935
Epoch 10/10
4257/4257 [==============================] - 0s 20us/sample - loss: 0.5176 - acc: 0.7935
1418/1418 [==============================] - 0s 168us/sample - loss: 0.4737 - acc: 0.8202
loss= 0.47368605500047734
accuracy= 0.82016927
    

損出率が約47%正解率が約82%となっています。損出率が47%ってことは半分近いデータが「上がるか?下がるか?」の判断に役にたっていないことを示しており、ここを改善することが次のステップになります。

損出率が47%なのに「何故正解率が82%もあるのか?」と疑問が出てくると思いますが、今回は「株が1%以上上がるか?それ以外か?」という識別であって、ほとんどの場合は「それ以外([0,1])」であり、[0,1]と答えた時の正解率だと推測されます。

正解率は、限りなく100%に近づけないと使い物になりません!

それでもスタートでloss: 0.6499が、最後にはloss: 0.4737まで努力してくれた。ここに人口知能の末恐ろしさを感じます。

人口知能に予測させてみる

次に今日の株価の動きから、翌日の終値で株を購入して、次の日の終値で株を売却した時の利益が1%以上になるかどうか?を人工知能に予測させてみます。


predictions = model.predict(in_predictions)
print(predictions)
    

これを実行すると、下記の通りリストアップされました。


[[0.17256394 0.7688614 ]
 [0.16903111 0.78166974]
 [0.18832695 0.761232  ]
 [0.19436413 0.76677096]
 [0.20419547 0.7718004 ]
 [0.21474555 0.77165115]
 [0.2200217  0.7730968 ]
 [0.22310361 0.770841  ]
 [0.22536698 0.76845694]
 [0.22752383 0.7612653 ]]
    

最後の行が予測値になります。2日後に株価が1%以上上がる確率は22.7%で、それ以外は76.1%というのが人工知能がはじき出した予測になります。

この結果をどう入力データへフィードバックするか?ここがプログラマーとしての腕の見せ所よ!

泉の如くアイデアが湧き出てくる

時間軸を加えて2次元の入力データにするとか、

MACDにRSIのテクニカル分析を加えるとか、

金融緩和時と金融引き締め時とで分けるとか、

個別銘柄の相関性を調べて先行指数を探すとか、

あら、しょーた、先行指数を見つけたら別に人口知能で調べる必要ないんじゃないの?

撃沈………

更新履歴

2022.8.14
新規作成

QooQ