【Keras, fx】RNNを使って為替の予測をしてみる

機械学習の一手法であるリカレントニューラルネットワークを使ってFXの予測をしてみます。

具体的に本記事でやったことは、

  1. OANDAPYを使って為替データの取得
  2. 取得したデータを学習用データに加工
  3. Kerasを使ってモデルの作成、学習、評価

になります。

基本事項

OANDA APIとOANDAPY

OANDAとは

OANDAはアメリカのfx会社です。
OANDA Japan

pythonから使えるapiを提供しているので、
pythonでfx関連のことをしようとする人はよく使うと思います。
今回はoandaからデータを取得して、ローソク足チャートをプロットするので
oandaの口座を持っている人前提の記事になります。

apiを使うためにはoandaで口座を作る必要があります。
口座を作るだけなら無料できます。以下のリンクからoandaのページにいき口座を作成してから以下をお読みください。


oandapyとは

oandapyはOANDA APIをpythonから簡単に利用できるようにしたライブラリです。

oanda/oandapy
Python wrapper for the OANDA REST API. Contribute to oanda/oandapy development by creating an account on GitHub.

本記事ではoandapyを使って実装していきます。

インストール方法はシンプルで

Kerasとリカレントニューラルネットワーク

Kerasとは

Kerasは、ニューラルネットワークを非常にシンプルに構築できるライブラリです。

Home - Keras Documentation
Documentation for Keras, the Python Deep Learning library.

TensorFlow等で書くとかなり長くなってしまうコードがKerasを使うことでシンプルなコードとなります。

RNN(リカレントニューラルネットワーク)とは

RNNとは再帰型ニューラルネットワークとも呼ばれ、
時系列の関係がある入力にも対応できるニューラルネットワークです。

以下はイメージ図、

図からわかるとおり、
現在の入力\({\bf x}\)1つ前の出力\({\bf h}\)を用いることで、入力間の関係性も学習させようというアプローチです。

ちなみに図の右のようにすることをアンロールするといいます。
図の中の\(h_t\)は記憶セルセルと呼び、1つ前の状態の内容(内部状態)を保存します。
\(h_t\)は数式で表現すると次のようになります。

$$\begin{aligned}
h_t = f(h_{t-1}, x_t)
\end{aligned}$$

実装(OANDAPYとKerasを使って)

必要なモジュールのimportと定数を設定します。

定数からわかる通り、今回はUSD/JPYの30足のデータを用います。

1.データの取得

では、OANDA APIからデータを取得します。
以前の記事で挙げたように5000件以上のデータを取得するテクニックを用いました。

ページが見つかりませんでした – 豆腐メンタル院卒フリーターの記録

2行目のaccess_tokenは自分のaccess tokenに変更してください。
あとは以前の記事と同じコードになります。

これで、今回使うデータを取得できました。

2.データの成形

次にRNNに学習させるためにデータを加工していきます。
時刻tからinput_len前までのデータを見て時刻t+1の為替のデータを予測させます。

なので、データ先程取得したデータも[t1, t2, t3, t4, t5]→t6となる組み合わせを作成します。

MinMaxScalerで0〜1に値を変換しています。

加工したデータを学習用とテスト用のデータに分割します。

これで、学習とテストに使うデータを作成できました。

3.モデルの構築と学習

RNNのモデルの構築と学習をしていきます。

まずRNNモデルを生成します。

そして、学習させます。

これで学習することができました。

評価

では、学習し終えたデータを使って評価していきましょう。
テスト用に残しておいたデータを使って評価してみます。

まず、test_xデータでの誤差を見てみます。
evaluateメソッドを使って評価できます。

思ったより誤差が小さくなっています・・・
ほんとに大丈夫なのか?

次に折れ線をプロットして、予測がどんな感じになっているかを見てみます。

まず、正解データのプロットを行います。

次に予測値を出力し、プロットします。

以下、出力

きれいに出来ているように見えます。
ただ、かなりシンプルなRNNでやっているので、かなり不安です。
(何か間違えていたらすいません)

感想

簡単なRNNで思ったより良い結果が出てびっくりしています。
今回の結果を使って実際に取引をすると問題点が浮き彫りになると思うので
デモトレードなんかでやっていこうと思います。

参考文献

Kerasで単純なRNN(リカレントニューラルネットワーク)を試す
前回はKerasを使って多クラス分類などを行いました。今回はRNN(リカレントニューラルネットワーク)を試してみようと思います。本記事は最低限のpythonの操作はできることを想定しています。プログラミングの独学が苦手な方は以下のプ...
タイトルとURLをコピーしました