ニューラルネットで為替レート予測(第一段階)

syusoku

準備編に続き、いろいろやってる。

今、試しているのは、バックプロパゲーションという、ニューラルネットの世界では古典的とも言うべき手法だ。5分毎に取ってきた為替の時系列からn個を抜き出し、n番目の列からm分後の為替データを教師データとする。ものすごく単純な方法だ。

グラフとしては以下の様な感じになる。実践が実際の為替レート、点線が学習後、ニューラルネットが出力したレートだ。

syusoku

こうしてみると、ざっと見る限り一致しているようにみえる。まあ、ニューラルネットでこのようなデータと一致するよう「フィッティングさせて居る」ので一致して居るように見えて当然である。一致して居なかったとしたらプログラムが間違っているというレベル。

問題は、未知の将来の為替レートに対してもそれなりな値を出してくれるかという点で、これが、1日くらいためたデータで学習させると、±0.1円くらいの差が出てしまっていた。数日後のオーダーで予測した結果が0.1円の差であればすごいことだと思うが、これは5分後、10分後といったレベルの話なのでお話にならない。

数日データを集めて再挑戦すると、±0.059円くらいまでは下がった。標準偏差が0.059円であるということである。これがすごいのかダメなのか、私はFXをやったことが無いので知らない。知らないが、まあ、この程度のことはだれでもできるので、すごくないんだろう。

精度向上させるためにどうすればいいか、もう一度グラフを見ると、なんとなく過学習しているような気がする。値の変化が大きく変わるところでオーバーシュートしている箇所がいくつかある。これが、統計データから予測できないような、なにか為替相場に関わる社会的なニュース、そういうのが影響しているのか、それとも過学習なのか、それとも別の何かなのか、知識不足でちょっとわからない。

今後は、とりあえず過学習を抑制するような方法を試してみたいと思う。普通、過学習を抑制するためにはDropoutや、L1/L2正則化といった手法をやるのだけど、今使っているライブラリ(PyBrain)ではどうも不可能みたいだ。となると、自分で改造するしかないのか・・・これは結構な手間だ。

過学習を抑制するため、エラーレートが収束するまえに学習を打ち切ってしまう、というやり方もあるらしいが、これもじゃあどの程度で打ち切れば良いのかもわからない。

という感じで、どれもこれもわからない。まだ暗中模索の段階である。