バイナリーオプションで勝てない。そうだ人工知能さんに教わろう。 Pt.3

BOシグナルツール開発

さて、久しぶりのバイナリオプションAIの記事ですが、なかなかうまく行きませんね。前回の記事では、より細かい為替データを得るために色々やったという話でしたが、なんやかんやあって現在まだ17日分しか集まっていませんし、大統領選挙の影響もあり、おそらく「良い」データとは言えません。そんな状況の中、てけとーな再帰的ニューラルネットワーク(LSTM)を構築して学習を開始してみました。・・・・・・が、成果は何も得られていません。



OS : Ubuntu 16.04 LTS
(3年前に組み立てた自作PC(Win7→Win10)にUbuntuを同居させています。)
CUDA : 8.0
Python : 2.7.12
メモリ : 8GB
CPU : Intel i5-3470
GPU : GeForce GTX 750 Ti


1. 現状

現在、学習せさているネットワークは5秒毎、20分間のデータを順番にLSTMへ入力し、5秒後のレートを予測する。またこの予測を入力に加えて10秒後(前回の出力からプラス5秒)を予測。またこの予測を加えて15秒後・・・・・・としていき、最終的に1分後の為替レートを出力とするという方針です。しかし、この手法で学習させたところ、正解率はランダムとほぼ変わりませんでした。むしろこちらのほうが悪いくらいです。

さらに悪いことに、この方法では1分後の出力を得るために12回もRNNのネットワークの計算をしなければいけません。そのため自分の超低火力環境では結果が出る頃にはすでに時間が数十秒経過していて最終目標であるシグナルツールとしての使い方は一切できません。というわけで、この方法はお蔵入りです。

一応もうひとつ学習アイデアがありまして、自分の超低火力環境のために、20分間で読み込むデータを更に減らし、「0~2分:5秒毎(24個), 2~5分:30秒毎(6個), 5~10分:1分毎(5個), 10~20:2分毎(5個)」の計40個として入力し、1分後の予測を出力とする方針です。仮にこの入力データで為替レート予測が可能なら、実際にシグナルツールとして利用する際にリアルタイムで解析することができます。

……しかしRNNで、このような飛び飛びで一定間隔でもないデータを与えて学習できるの自分にはわかりません。自分が持っているRNNのイメージだと「連続するデータを一定間隔で学習させると効力を発揮する」という感じなので上記のように飛び飛びだと正しく学習できないと思うのです・・・。詳しい方どうかご教授ください。

他にも色々試行錯誤してより良い方法を模索したいところですが、自分の低火力環境ではテストするのにも時間がかかり、ネットワークを少し大きくすると、すぐにGPUのメモリを超えてしまいます。1つ目の方法で示したように5秒毎でレートを入力している理由もこれで、もう少し良いGPUを導入すればよかったとか思っています。

2. 入力データの正規化

さて、ここまでは完全に成果なしの話でしたが、1つだけ成果っぽいものを紹介します。・・・と言っても正規化の話なので、知見のある方なら当然の話になると思います。

上記の実験において、クローリングしてきた為替レートをそのままネットワークの入力とすると出力はほぼほぼ0という結果になってしまいました。この時点でお手上げモードだったのですが、もしかしたら正規化すればいいのでは?と考え、入力する為替レートからその日の開始値を引くということをしました。この処理を行うことで、一応「それっぽい」値が出力されるようになりました(もちろん理由はわかりません)。

後日しらべると、前日の終値を引いている人やその通貨の平均を引いている人なんかもいました。これらは試してはいませんが、なるほどという感じです。しかし平均を引くとなると、為替の国なんかで何かあった時にずっと偏った入力データになりそうですが、それは大丈夫なのでしょうか?という疑問も出てきたりします。

おわりに

というわけで、近況報告兼ねたBOAI記事でした。一応楽しみながらやっているのですが、流石にリアル生活が忙しくなってきたので、そろそろ何かしらの成果がほしいところです。成果がほしいならもっと環境に投資しろと言われそうですが……、さすがに超低火力の環境ではテストするのにも時間がかかっていけませんね。最近何かと出費がかさんでいるので、そのうち改善したいです………………………………。