結論
平均して五時間に一回ほど60%の正解率を出すことができた。
理論
学習部分は前回の記事でまとめている方法を使っています。
"""
FXの一分足データから五分後の上昇下落を予想する
https://qiita.com/nanamesincos/items/34b3d7d624a31b06509d
"""
上の記事で正解率はほぼ50%で騰落を予測できているとはあまり言えませんでした。
しかし、出力層で活性化関数をsoftmax関数にしているのでscoreという形で予測の確信度を見ることができると考えました。
行ったことはscoreの値が大きいときほど正解する確率が上がっているのではないかと言うことを可視化することです。
実装
(ソースコードが拙いのは目をつむっていてください。もっとスマートなコード書きたい)
モデルは前回のままなので確認したい方は上のURLから飛んでみてください。
kerasで実装したmodelにはpredictとpredict_classesというメソッドがあります
predictでは活性化関数の値を、predict_classesでは分類されたクラスを表示します。
これをそれぞれlistに格納します。
aa = [] #scoreの値
bb = [] #予測したラベル
for i in range(85910):
y_pred1 = model.predict(X_test[i].reshape(1,len(X_train[i])),verbose = 0)
y_pred2 = model.predict_classes(X_test[i].reshape(1,len(X_train[i])),verbose = 0)
bb.append(y_pred2)
aa.append(float(np.max(y_pred1)))
次にscoreがある一定の値以上のときの正解率を算出します。
ニクラス分類問題であるのと、分類が難しい問題なのでscoreは0.5から大きく離れた値にはなりませんでした。
なので今回は0.02刻みの幅で正解率の変化を見ていきます。
c = np.array([0,0,0,0,0,0,0,0]) #データの個数を格納
d = np.array([0,0,0,0,0,0,0,0]) #正解したデータの個数を格納
for i in range(85910):
for v in range(0, 8):
l_score = v / 50 + 0.5
if l_score < aa[i]:
c[v] += 1
if bb[i] == y_test[i]:
d[v] += 1
最後に出力
for v in range(8):
l_score = v / 50 + 0.5
print(str(l_score) + "の時の正解率")
print(d[v]/c[v]*100)
結果
score =< 0.5の時の正解率
52.098707950180426
score =< 0.52の時の正解率
53.33433399090831
score =< 0.54の時の正解率
55.09140353527723
score =< 0.56の時の正解率
59.51940850277264
score =< 0.58の時の正解率
100.0
score =< 0.6の時の正解率
nan
score =< 0.62の時の正解率
nan
0.64の時の正解率
nan
全データ数85910
各scoreでのデータの個数
[44758, 24873, 7293, 322, 4, 0, 0, 0]
感想
scoreが0.56を超えてくると正解率が約60%になった。その時のデータ数が322なので全体の個数を割ると1/256になる。
256分に一回なので五時間のうち一回は六割の正解率で騰落を予測できている。
また、結果から見てもscoreが上がるに連れて正解率も上がっている。流石に100%はサンプル数が4つしかないので信用出来ないという面もあるが。
流石にまだギャンブルできるほどの確率ではないにしても改善方法に心当たりがあるのでこれから試行錯誤していきます。
参考にさせていただいた記事
https://qiita.com/ishizakiiii/items/3b894b6e987fdf87093e