畳み込みニューラルネットワークで為替予測してみた

タイトルの通り、為替データを畳み込みニューラルネットワーク(CNN)で読み込んで予測させるまでを、Chainerで実装してみました。

今回は順を追って、データの取得と加工、モデルの構築、学習と予測をしていきます。

コードの全文は下記に置いています。

GitHub: https://github.com/Gin04gh/finance/blob/master/CNN_USDJPY.ipynb

まずは為替のデータの取得です。

Pythonのライブラリ pandas_datareader を使って、日付ごとのドル円価格のデータを取得しました。

期限は適当に区切って、7年分を取得してきています。

いったん様子を確認するため、プロットしてみます。

さて、この時系列のデータから、ある程度、値の動きを読み込ませた後にその次の値は上がるか・下がるかの予測をできるかどうか、モデルを構築して試してみます。

方法としては、ある程度の時系列の長さを決め、その間の値の上がり具合・下がり具合を数値化したものをCNNで読み込んで、次は「上がる」か「下がる」の分類モデルを構築することにします。

まずは原系列から差分系列に変換し、上下の具合を数値化するため、[0,1]区間に正規化します。

次に、CNNで読み込める教師データの形にします。

系列データから決めた時系列の長さ分だけ取得してきて、入力を上下の具合を1次元の画像と見立てたもの、出力を1(上がる)か0(下がる)に変換していきます。

一部データを確認してみたものが上記となります。

上記のように、値がどう動いてきたかを色の濃淡の画像で表す感じになります。

途中とても白い部分がありますが、ここが原系列の中でもかなり大きく値が変動した部分となっているようです。

実際の値を確認してみると、0.90144926がその箇所のようです。

これを分類するCNNをChainerで組んでいきます。

入力する画像(時系列)は縦方向の次元が1次元となっていますので、フィルターの縦サイズは1とし、横サイズは適当に決めることにします。

出力層の次元数は、1(上がる)か0(下がる)なので2です。

上記のように、畳み込み層2層+全結合3層のモデルを用意しました。

これに先ほど作成した教師データから、学習用、テスト用に分割し、学習と予測精度の評価をしてみます。

学習の実装が下記になります。

テストデータに対して、7割近くまで当てられるようになりました。

個人的には、思っていた以上に当たっていて、びっくりしています笑

こうしてニューラルネットワークである程度予測できるということは、やはり何かしら規則的なものがあるのでしょうか。

素人からすると次が上がるか下がるかなんて全く予測できませんが、経験多く積んだ投資家や専門家から見ると、少なくともこの程度の精度以上には当てられるのかもしれません。

株価の世界などで俗に言われるテクニカル分析というものが、レートの形から将来の値動きを予測する手法と言われていますので、何かしら予測する方法があるのだろうと思います。

ところで、今回はCNNを使いましたが、こういった時系列データはむしろ再帰的ニューラルネットワーク(RNN)の方が合っているのではないかと思いますが、実はRNNでも試しており、同程度の予測率が出せることが確認できています。

ただしRNNですと、やはり計算量が大きくなりがちですので、より早いモデルとしてCNNを使った場合はどうなるのかの検証のため、今回はCNNを試してみたといったところです。

フィルターで読み取った上でマックスプーリングして、ある程度、事前の系列を集約してしまった上でも、先ほどのような規則的なものが現れると考えても良さそうです。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です