【質問#15】ニューラルネットで為替レート予測(第一段階)に関しまして

質問・悩み相談の回答です。

質問

初めまして**** (※伏せました)と申します。
楽しく拝見しております。
現在、pybrainでの為替予想等をしようと考えwithpop様の
「Pybrainでsin関数を学習させるサンプル」等を参考に為替データを落として
何度かパラメーターを変更して試しているのですが、上手くフィッティングできません。
「ニューラルネットで為替レート予測(第一段階)」では綺麗に
フィッティングされていたのですがどのようなソフトや手法で行ったのでしょうか?色々と調べましたがなんとも煮詰まってしまいました。。コードとは言えないのですが^^;何か参考になるような事をご教授いただけないでしょうか。

ちなみに、sim関数でのRNNでは上手く予想してくれました。でもそれは周波数的な単純な特性なら予想可能という感じなのでしょうか?
以上、不躾なご質問ではありますが、ご回答の程よろしくお願い致します。

回答

まずはじめにお伝えしたいのが、私は機械学習についてはまだまだ勉強中でして、残念ながら有益な回答は出来ないであろうと言う事です。ですが、せっかく質問して頂いてそれでは失礼ですので、何とか考えてみたいと思います。

一口にフィッティングできないと言っても多数の原因が考えられます。ニューラルネットではパラメータの調整が肝であり、その決定方法は経験的・発見的な方法で手探りで求めているのが現状です。が、計算機科学の最先端の領域でありながらまだまだ職人技が必要とされるのは面白い事だと私は思います。(本質問には関係ないですが)

次にお伝えしたいのは、あれ(過去の記事)はうまくフィッティングしているように見えますが、実際のところは「前回値からそこまで大きい差でない値を出力する出力器」としてしか機能していません。もうすこし具体的に言うと、前回値比±1%の値を出力している機械、程度の精度です。

良くフィッティングしているように見えるのは、長いスパンで大きな値動きとして眺めているからであって、よりミクロな視点で見れば全然合っていません。FX取引で重要になるのはミクロな視点、つまり、数時間から数日というスパンなので全然意味がありません。

また、長期的な予測も無理だと思います。多層パーセプトロンの単純なフィードフォワードネットワークでは時系列データを扱えません。実際、予測したデータを次々入力に入れていくようなことをやってみましたが、すぐに値が発散してしまいました。

現在の私の認識では、ニューラルネットをはじめとする機械学習で為替相場を予想するというのはかなり困難です。どんなにうまくやっても、せいぜい、テクニカル指標を見て人間が取引するのと同程度の成績しか上げられないのではないでしょうか(つまり長期的な成績は複数資産に分散投資してじっくり待つのと大差ないということになると思います)。もしそれが正しければ、機械学習で相場を予測するというのは統計学の基礎を勉強する手間が省けるという程度のメリットしかありません。因みに、機械学習を学習するうえで統計の知識が少なからず必要になるという皮肉付きです。

以上を踏まえまして、ようやく回答です。

なぜフィッティングしないか
実はあの記事を公開してから、何通も同様のメールをいただきました。そこで、「値がフィットしない」という原因のほとんどが活性化関数にシグモイド関数を使っているのに、入力が0~1で正規化されていない、という点でした。レガシーなNNで活性化関数に良く用いられるシグモイド関数は0~1の値域を取るので、必然的に出力も0~1になります。この場合は入力値を0~1の範囲で正規化して扱うか、それ以上の値域を持つ活性化関数を使わなければなりません。

過去の記事では、シグモイド関数を使い、為替を0~1の範囲で正規化する方法を取りました。ただ、この方法は今回のような用途に適しているとはとても言い難いです。

その他、考えられる原因としては隠れ層とパーセプトロンの数でしょうか。ここは増やすとか減らすとかして試行錯誤で求めるしかありません。

RNN(Recurrent neural network)だとうまく行くかもしれない
そもそも為替変動のような時系列データは単純なフィードフォワードネットワークで扱う事が難しいです。時系列データを扱うのに適しているのがRNNです。ですので、RNNでうまく行くのは当然と言えば当然だと思います。あとは、使用しておられるライブラリが良くわかりませんが、こちらではデフォルトでReLuなどの活性化関数が選ばれていたとかいう理由もあるかもしれません。

ちなみに過去の記事でなぜRNNを使用しなかったかというと、その当時私が存在自体を知らなかっただけです。ですので、あの記事の内容はきれいさっぱり忘れてください。現在の状況であの記事から得られるものは何もないと思います。したがいまして、現在RNNでうまく行っているのであれば、私の記事のことは忘れてRNNでチャレンジしていくのが良いと思います。

周波数的な単純な特性なら予測可能なのでしょうか

「周波数的な単純な特性」というのはフーリエ変換した時に数個のピークしか無いような波形、というのを指しているのでしょうか。だとすれば、為替相場の予測はそれよりも難しいと言えることは確実だと思います。というか、ニューラルネットの学習能力の見積もりは非常に難しいのでそもそもそういう知見はまだあまり無いのではないでしょうか。ですので、一般的な回答をするとニューラルネットは為替相場の予測が出来る程度に優れているかどうか分からないと言う事になると思います。現時点での私の認識というか予測は上で述べたとおりです。

また、周波数という言葉で思い出した一つの事実がありますので、紹介します。

値動きの本質はなにか4~コイン投げのシミュレーション

上記記事では、値動きを周波数分析すると1/fゆらぎパターンと一致することを指摘しています。特定の周波数を含まないので、値動きはランダムであると言えます。ランダムであるならば、ある単一の銘柄の値動きだけを見て予測を行う事は本質的に無理だと言えます。

ではどうするかというと、たとえば原油価格の高騰や下落に影響されて株価が上がったり下がったりして、そこから安全資産である円に退避するとか債権が買われるとか、為替取引以外のお金の動きを調べると一定の規則が見いだせそうです。私は、このあたりまで含めればある程度の予測は可能ではないかと考えています。では、具体的にどうするか…というアイディアは何もありませんが。

頑張りましょう

以上、あまり参考にもならなそうですが書いてみました。。

為替変動やその他の相場を読み取ってうまいこと金を稼ぐというのは資本主義経済下に生きる人々の夢でもあります。ただし残念なことに、そのような方法が見つかったとしても公になることはないでしょう。皆が同じ戦略を取るならば成り立たないからです。

従って、個々の組織や個人がそれぞれに固有の方法を見つけなければならないという厳しい戦いになります。同じ目標を持ちながら本質的に協力はしにくいという悲しい運命です。それでもゴロゴロ寝てても金が振ってくるその日までぜひとも頑張っていきましょう。