LSTMでFX予測をやってみよう(機械学習初心者向けチュートリアル)

使っているFX会社はどこ?
テクニカル分析用(チャートが使いやすい) → DMM FX
Python API用(FX APIはここしかない) → OANDA ジャパン
デイトレ用(スプレッドがとにかく狭い) → SBI FXトレード

ディープラーニングでFX予測に人気の高い手法「LSTM(Long Term Short Memory)」で為替予測を行う方法を機械学習初心者向けにまとめました

こんばんは、新米データサイエンティスト(@algon_fx)です。前回の投稿でも触れましたが、最近はLSTMを使ってFX予測にはまっています。

Twitterのフォロワーさんで、FXトレードは上級者だけど…機械学習が初心者なトレード先輩から「機械学習初心者向けにコードを公開して欲しいです」とご要望を頂きました。

私も「新米」データーサイエンティストですので、人様に教えられるほど機械学習の達人ではありませんが…せっかくご要望頂いたのでまとめます!

このチュートリアルの概要

まずはこのチュートリアル記事の概要からです。誰に向けて書いているのか、何が必要なのか諸々まとめます。

大前提としてですが、これはLSTMを使って自動売買bot作ってヒャッハー!な記事ではありません。ノウハウ公開!みたいな話でもないです。これから機械学習を使ってFX予測を頑張ろうと考えている方へ向けた内容です。

チュートリアル概要

・機械学習の初心者を対象としてます
・数学を使った厳密な説明は行いません
・LSTMを使って自分でFX予測をこれからしたいと考えてる方向け
所要時間目安は20分〜120分程度(レベルによる)

この記事で行うこと

OANDA API v1経由で過去のドル円レートデータを取得
・LSTMへの訓練向けにデータの簡単な前処理を行います
・機械学習ライブラリ(Keras)を使ってLSTMを構築
・LSTMモデルの訓練
・モデルの評価とチャートで予測と正解レートの比較

必要な環境とライブラリ

・Python 3.6
・Jupyter Notebook
・Pandas
・Numpy
・Matplotlib
・Seaborn
・Keras
・Oandapy(pip install oandapy)
・pytz(pip install pytz)

Python2を使っている方はPython3へ更新が必要です。自分のPCに上記のライブラリの環境構築がない方はGoogle Colabがオススメです。Google Colabはブラウザとインターネットのみで機械学習の練習が行えます。

Oandapypytzの2つのライブラリは恐らく多くの方が追加でインストールが必要かと思います。pipで簡単にインストール可能です。OandapyはOANDA API v1のPython用ラッパーで、pytzはAPIから取得したレートの日時を処理するライブラリです。

OANDA API v1を使います

為替レートの取得のためOANDA(オアンダ)のAPI接続が必要です。デモ口座でもAPIキーの取得は可能ですし、本番口座もお申し込みから数日で取得可能です。OANDA プロコース以上でAPIが使えますので、これから本格的にやってみようと考えている方は是非どうぞ。

OANDA JAPAN

LSTMとは?なぜFXでLSTMなの?

まずLSTM(Long Short Term Memoryの略)ってそもそも何者なのかのお話について。厳密な説明は割愛して、ざっくりとLSTMがどのような仕組みなのかを説明します。

LSTMはディープラーニングの一種

混乱がないように明記をしておきますが、LSTMはディープラーニング(深層学習とも呼ばれる)の手法の一種です。より正確に言うと「RNN(再起型ニューラルネットワーク)」に改良を加えた手法です。

下記のNavidiaの説明図を見るとわかりやすいですが、人工知能とは大きな分野であり、その中に機械学習が特定の分野として属しています。

引用:Nvidia – 人工知能、機械学習、ディープラーニングの違いとは

さらに機械学習には多種多様な手法/アルゴリズムが存在しますが、その特定の手法/アルゴリズムを総じて「ディープラーニング(深層学習)」と呼びます。

LSTMはディープラーニングに属する手法ですので、非常に曖昧かつ広い意味で捉えれば「人工知能」なんですが…人工知能使ってますとか胸張って言うと少し恥ずかしいです。(個人の意見)

LSTMは時系列データが得意

LSTMはディープラーニングの一種と説明しましたが、次はなぜFX予測で使うのか?を説明します。端的に言うと「LSTMは時系列データを扱う目的のために開発」された手法だからです。

では、そもそも時系列データって何よ?って話ですよね。時系列データとは「時間の経過に従って測定されたデータ」のことです。時系列データの事例を見ると解り易いです。

・トマトの観察記録
・文章
・株価や為替

一番最初のトマトの観察記録ですが、例えば種を植えた0日目は0cm、1日目は0.5cm、2日目は1.2cmといった具合に時間の経過ごとにデータを取得したものが時系列データです。

2番目の説明の「文章」は一見解りづらいですが、これもLSTMが本領を発揮する立派な時系列データです。例えば、いきなり友達に「いつやるの?」と言われたとしましょう。

林先生のおかげで恐らく9割以上の日本人は「今でしょ!」と答えてしまうはずです。つまり「いつやるの?」の後には「今でしょ!」がデータとして紐づくわけですよね?かなり荒い説明ですが、LSTMではこの「いつやるの?今でしょ!」のようなルールを学習するわけです。

為替や株価も時系列データですよね。これは説明なくてもわかるかと思います。LSTMは時系列データを予測することを前提として考えられた機械学習の手法です!

LSTMのざっくりとした仕組み

次にLSTMがどのような仕組みかを極力簡単に説明します。一番理解しやすいのは、LSTMがどのようにして生まれたかを理解することです。

LSTMを祖父は「ニューラルネットワーク」と呼ばれます。これは人間の脳神経の仕組みをコンピューターで簡易的に模擬した機械学習手法の一つです。

このニューラルネットワークには、過去の出来事を考慮出来ないという大きな弱点がありました。例えば今私のブログの記事を皆さんは読んでいますよね?理解ができるのは、ここまでに書いてきた内容を皆さんは覚えており、それを踏まえて新しい文章を読むことで意味を理解できます。ニューラルネットワークはこれが出来ませんでした。

この弱みを解決するために生まれた子供が「RNN(再起型ニューラルネットワーク)」です。RNNは計算処理に「ループ」を加えたことで、過去の出来事を考慮して予測をすることが可能になりました。過去の出来事を考慮することで、様々な問題や予測の精度が向上したのです!RNNすごい!

ところが…そんなRNNにも弱点がありました。それは…長い期間の出来事を覚えるのが苦手なのです。簡単な例題で考えてみましょう。例えば下のような文章があります。

下線にはどのような言葉が入るか予測できますか?100kgのダンベルとあるので、下線部分は「重い」と容易に想像ができますよね。このようにRNNは100kgダンベルと文脈の過去を読み取り「重い」を予測してくれます。

では下の例を考えてみてください。

どうでしょうか?下線に入る言葉は予測できますか?人間の私たちは文脈を読み取って、イタリアに30年住んでいるのであれば下線部は「イタリア語」だなと理解できます。

ところが・・・RNNは短い記憶を覚えるのは得意なんですが、長い記憶をうまく活用するのが苦手なんです。なのでRNNが仮にこれを予測したとすると、下線部には何かしらの言語が入るのは予測できますが、それが「イタリア語」だとは解りません。なぜなら「30年間イタリアに住んでいた」を覚えていないのです。

さて、これでは困りました…ってことで誕生したのが我らが「LSTM」です!LSTMはこのRNNの弱点を克服して、長期間の記憶(Long Term)も上手に活用することができるようになったのです。すごい、我らがLSTM!I Love LSTM!

LSTMがどれだけ凄いやつか解りましたか?長い記憶もしっかりと活用してくれる頭の良い子なんです。んで、LSTMはどうやってFX予測するのよ?

LSTMにはWindowと呼ばれる「窓」という考えがあります。これは「どれくらいの期間を基に予測をするか?」をさしています。

本チュートリアルでは窓を10日間としてコーディングをこれからやっていきます。つまり、言葉で言い換えれば、LSTM君は10日間の為替レートのデータを1セットとして、それを何セットも学習することで、新しい10日間のデータから未来の為替レートを予測してくれる訳です!

では次のセクションからLSTMのモデル訓練をやってみましょう!

ステップ1 必要なライブラリをインポートしよう

では実際にコーディングをやってみましょう。Jupyterを立ち上げて一緒にコードを打っていきましょう。冒頭でも記載しましたが、個別にライブラリのインストールが必要です。またOANDAのAPIを使って為替レートを取得しますので、オアンダジャパンでの口座開設も必要です。

数日でAPIキーが発行されます(既に口座開設してAPIキーがあれば不要)

準備が整いましたらまずはライブラリのインポートから始めましょう。Jupyterの最初のセルに下記のコードを入力して実行(Enter + Shift)をしてください。

ステップ2 OANDAのAPIへ接続しよう

次にAPIへの接続を行います。本来であればセキュリティを考えて、APIのアクセスキーと口座番号はconfigファイルで別管理を行うべきですが、今回は練習ですので直接ノートブックに記入しましょう。(後日、より安全への接続方法をまとめます)

下記はダミーですので各自のAPIキー(ACCESS_TOKEN)と口座ID(ACCOUNT_ID)に差し替えてください。口座IDはオアンダのWEB管理画面へログインすれば、すぐに見つかります。APIキーは口座開設後にAPIの使用を申請する必要があります。

では、実際にAPIへ接続をしましょう。

ステップ3 過去レートをAPIから取得する

APIへの接続が完了しましたので、次はAPI経由でドル円1日足の過去レートを取得してみましょう。

 granularity とありますが、これはレートの期間を指定するパラメータです。Dと指定してありますが、こちらは1日を表します。他にもS5(5秒)やM1(1分)などの調整が可能です。

API経由で取得したresponseですが、こちらは辞書型となります。これでは機械学習で扱うには少し不便ですので、Pandasのデータフレーム型へ変換をしてあげましょう。

APIからドル円のレートが取得できていますね。ただデータを見てみると不要なカラム(列)やtime(日付)の値などの処理が必要なのがわかります。

ステップ4 データの前処理を行おう

次は機械学習のプロセスで言う「前処理」を行ってあげましょう。データクレンジングとも呼ばれる工程で、要は機械学習のアルゴリズムがデータをより上手く「学習」できるようにデータを整えたり調整したりする作業です。

前のセクションでデータを軽く確認しましたがtimeの値が少し特別なのに気づきましたか?一般的にAPIで扱う日付は世界基準に統一することが多く「ISO 8601」が採用されます。OANDAも同様です。

ただ、これでは使いづらいので日付をまずは日本時間に変換をしましょう。今回は下記のコードでISOの文字列からdatetimeへ。さらにdatetimeから表示用の文字列へ変換する関数を作ります。

ではこちらの関数を使って、データフレームの日付をわかりやすい値へ変更してあげましょう。

大丈夫そうですね。変更前のtimeの値は「2016-08-01T21:00:00.000000Z」とISO形式で訳わかりませんでしたが、これで日本時間へ変換が行われています。

日付の処理が完了したので、データを確認しながら次の処理を行なっていきましょう。まずはデータのサイズとカラムを確認しましょう。

(500, 11)

Index([‘closeAsk’, ‘closeBid’, ‘complete’, ‘highAsk’, ‘highBid’, ‘lowAsk’,
‘lowBid’, ‘openAsk’, ‘openBid’, ‘time’, ‘volume’],
dtype=’object’)

500行11列のデータです。OANDA API経由で取得したデータですが、レートを取得した時間から500個前までのレートを取得しています。今回は日足なので500日分のドル円データという訳です。またカラム名で確認できますが、レートには終値(Close)やオープン(Open)、さらにAsk(売値)とBid(買値)があります。

今回は練習ですのでAsk(売値)を採用してLSTMのモデル訓練を行います。APIから取得したデータから必要なカラムだけ切り取りましょう。

次はLSTMのモデル訓練に使う「訓練データ」と評価に使う「テストデータ」へ分割してあげましょう。機械学習では訓練データとテストデータへの分割は標準のプロセスです。モデルは訓練データを「学習」して、全く見たことのない新しいテストデータを使って予測を行うことで評価が正しく出来るわけです。

本来であれば8:2や7:3の割合で訓練とテストの分割を行いますが、今回は全レコードが500券ありますので訓練400件、テスト100件の割合で分割を行います。まずはデータフレームを確認して、400:100で分割できるポイントを確認しましょう。

こちらのデータですがAPIから取得した日付で異なるので注意してください。私の場合は400件目が「2018/02/19 07:00:00」ですので、こちらの日付でデータを分割します。加えて今回は日付は不要ですのでデータフレームから落としてあげましょう。

((400, 5), (100, 5))

訓練データとテストデータが分割されているのが確認できます。これで基本的なデータの前処理が完了しました。次はLSTMへ訓練させるための前処理を行いましょう。

ステップ5 LSTMモデルへ訓練させるための前処理

LSTMとは?のセクションでも説明をしましたが、LSTMは時間を細切りに区切って学習を重ねて予測を行います。今回は10日間を一つの期間(Window = 窓)として予測を行わせましょう。

まずはWindowを作りましょう。

次に訓練データとテストデータをWindow(10日間)区切りでまとめます。また「正規化」と呼ばれる処理も同時に行いましょう。

「正規化」とはアルゴリズムへデータを学習させる前にデータを整えて上げることで、アルゴリズムがデータを学習しやすくするための処理です。「データを整える」とありますが、この整え方には様々な方法があり、アルゴリズムの種類によっても「整え方」が異なります。

今回は10日間のWindow毎に各特徴量の変動幅となるようにデータを整えてあげましょう。詳しくは下のコードを見てください。

最後にPandasのデータフレーム型からNumpy配列へ変換を行います。

これで必要なデータ前処理が完了しました。次のステップではLSTMのモデルを構築して訓練させてみましょう!

ステップ6 LSTMのモデル構築&訓練

いよいよLSTMのモデルへの訓練を行いましょう。今回は機械学習ライブラリの「Keras」を利用してモデル構築を行います。KerasですがバックエンドでTensorFlow(テンソルフロー)を使います。

TensorFlowをインストールして、その後に別途Kerasのインストールが必要です。未だ環境構築されていない方はこちらのリンクを参照にインストールを行いましょう。

機械学習関連のライブラリの大半は英語のドキュメントのみですが、Kerasは数少ない日本語ドキュメントが用意されているライブラリです!公式ドキュメントで大半のことは勉強することが可能です。初めて使う方は一度読むことをお勧めします。

ではKerasを使ってモデルの構築を行いましょう。必要なコンポーネントをKerasからインポートして、LSTMにモデルの設定を行います。

これでOKです!LSTMのモデルの詳細ですが、公式ドキュメントに詳しく記載がありますので、そちらでご確認ください。

ではいよいよ訓練データを使ってモデルの訓練を行いましょう!epochsを50と設定してありますので、50回の反復処理が行われます。私のMac Bookで5分程度で掛かりました。

Epoch 1/50
– 5s – loss: 0.0301
Epoch 2/50
– 4s – loss: 0.0191
Epoch 3/50
– 4s – loss: 0.0128

[中略]

Epoch 49/50
– 4s – loss: 0.0058
Epoch 50/50
– 4s – loss: 0.0055

ご覧の通り毎回のエポック毎にlossが少なくなっているのが確認できます。上のKerasのLSTMの設定でも確認できますが、今回はlossをMAEを指定しています。MAEとはMean Absolute Error(平均絶対誤差)と呼ばれる指標で、意味としては「予測と実際の値がどれだけ離れているか」を指標化したものです。

つまりMAEが高いと=予測がうまくできていない、MAEが低いと=予測と実際の値が近いことを意味しています。では訓練させたLSTMのMAEを確認してみましょう。

X軸がepochsでY軸がMAE(予測と実際の誤差)です。少し歪なグラフですが反復計算をするたびに誤差(MAE)が少なくなっているのが確認できます。

ステップ7 訓練データを使って予測

ではLSTMのモデル訓練が出来ましたので、まずは訓練データを使って予測をしてみましょう。先ほども説明しましたが「訓練データ」とはモデルの学習に使ったデータです。つまりモデルは既にこのデータを見たことがある(学習した)ものです。

Kerasの予測にはpredict()を使います。既に前のステップでyen_modelとして訓練データを学習させたモデルがありますので、そちらへtrain_lstm_in(訓練データの特徴量を前処理したデータ)を渡します。

少し横着ですが…訓練データで予測を行ない、同時に正解データ(正しい終値のレート)をチャートに落とし込みましょう。下のコードの「Acutual」が実際の終値のレートで「Predicted」がLSTMモデルが予測したレートです。

さすが我らがLSTM先生!青が実際の終値レートで赤がLSTMが予測した終値レートです。概ねそれっぽく予測されているのが確認できます。

ただ何度も書いていますがこれは「訓練データ」を使った予測結果です!LSTMのモデルはこれらのデータを学習している訳ですので、本当の意味での「予測」ではないですよね。

ステップ7 テストデータを使って予測

(ドラムロール・・ドコドコドコドコドコドコ

ではいよいよ!!待ちに待ったテストデータでの予測をしてみましょう!おそらくLSTMを使った為替予測を私は既に数百回以上(数千回届くかも・・)試行錯誤を繰り返していますが…テストデータを使って予測をするのは毎回ドキドキするもんです。

では、また少し横着ですが予測をしながら実際のレートと予測レートをチャートに落とし込んでみましょう。

おおおおっと!テストデータを使った予測でもそれっぽいチャートが出来ています。青色のチャートが本当の価格で、赤色のチャートがLSTMが予測したレートとなります。

ただ、これでは100%実際のFXトレードで使うと負けます。激しく負けます。(実体験談です。

まとめと次の課題

いかがでしたでしょうか?とても長い記事にはなりましたが、機械学習初心者向けになるべく厳密な数学的説明をはしょりながら、LSTMでFXを予測するチュートリアルをまとめてみました。

この記事が機械学習のFX予測の最初の一歩のお役に立てれば嬉しいです!もしこの先を進めたい方がいれば、下記の課題をやってみるとより理解が深まると思います。(後日、また詳しい記事も書く予定です)

(課題1)特徴量の追加/編集して見る

今回は非常にシンプルな特徴量(始値や高値など)を使って予測を行いました。テクニカル指標や為替レートの予測に役に立ちそうな指標/数値を織り交ぜてLSTMのモデル訓練を行うことで、より予測の精度が上がります。(参照:Pythonでテクニカル指標を計算シリーズ)

(課題2)ハイパーパラーメータを調整する

機械学習の多くの手法にはハイパーパラメータと呼ばれる「人間が設定する数値」などが存在します。今回は初心者向けでしたのでLSTMのハイパーパラメータに関しては深追いはしませんでしたが、Epoch(反復回数)やバッチサイズなど設定をするべき箇所は多々あります。

以上となります!ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

【人気記事】

私の機械学習の開発環境&トレード環境

 

FX 機械学習

Posted by algon