3時間後の為替を人工知能で予測する「FXトレードプログラミング」
ここ数年の間で、「人工知能」「AI」という言葉を聞くことが日常になってきていて、「フィンテック」分野での活用も広がってきています。
以前に、
という記事では、「Meta Trader」を利用したプログラムの書き方について紹介しましたが、今回は、人工知能を利用して「為替を予測するシステムの開発」に取り組み「どのような結果が出るのか?」を検証していきたいと思います。
今回作成するシステムでは、「機械学習」を用いて予測をしていきたいと思いますが、「学習と予測」を「ある時点」で逐次実行していきます。
今回検証する内容は、「どれくらいのデータ量を学習すると、どれくらいの予測精度になるのか?」です。
あと、「実用できるか」というのも大きなポイントですね。
1分ごとの為替データを取得するプログラム
今回は、「1分ごと」に為替データを取得していきたいと思います。
取得する「通貨ペア」は、
- ドル/円
- ユーロ/円
- ユーロ/ドル
- ユーロ/ポンド
- ポンド/円
- ポンド/ドル
の「6ペア」を選択しました。
選択した通貨の基準は「貨幣流通量」が多く、価格の変動が「ドル/円」に与えそうな影響が大きい通貨ペアを選定しました。
では、どうやってこの6通貨ペアを1分ごとに取得するのかというと、「Meta Trader」を利用し、「Meta Trader」で為替データを取得して「WEBサーバ」へ送信し、「データベース」に通貨ペアのデータを保存していきます。
そのため、WEBサーバには、
- 「為替通貨ペア」のデータを登録するためのAPI
- 「為替通貨ペア」のデータを取得するためのAPI
の2つを作る必要があります。
「Meta Trader」のプログラムは、例えば「ドル/円」を取得するプログラムは、
// 初期化処理 int OnInit() { EventSetTimer(60); // 60秒ごとに「OnTimer」メソッドを実行 return(INIT_SUCCEEDED); } // 完了処理 void OnDeinit(const int reason) { EventKillTimer(); } // 60秒ごとに実行する処理 void OnTimer(){ SendPOST(); } // 「ドル/円」データをサーバへ送信 int SendPOST() { int WebR; string URL = "ドメイン/regist_rate.php"; int timeout = 5000; string cookie = NULL,headers; char post[],FTPdata[]; string str= "&rate="+Ask +"&rate_type=usd_jpy" +"&api_key=xxxxxxxxxx"; StringToCharArray( str, post ); WebR = WebRequest( "POST", URL, cookie, NULL, timeout, post, 0, FTPdata, headers ); return(WebR); }
という形になり、「Meta Trader」で利用する言語は「MQL」というオリジナル言語なのですが、「OnInit」関数の中で実行している「EventSetTimer」関数で、為替データを取得する間隔を60秒に指定しています。
60秒ごとに実行されるのが「SendPOST」関数で、この中では、「WEBサーバの為替取得用API」に送信する「データの生成」と「送信」が行われています。
WEBサーバに送るデータは、
- rate
- 登録する為替レート
- rate_type
- 登録する「通貨ペア」
- api_key
- 為替取得用APIの「API KEY」
です。
WEBサーバに送るデータを用意したら、MQL言語の「WebRequest」関数を利用してデータを送信しています。
WEBサーバでは、データベースに「受信した為替データ」を保存しています。
「為替データ」の学習と予測
今回は、機械学習を用いて為替データの「学習」後に、すぐに「予測」を行っていきますが、基準となるのは、「学習開始時点」の時刻です。
過去の「何分のデータ」を学習すると、どれくらいの「予測精度」になるのかを検証していきたいと思います。
今回は「機械学習」を用いて「学習と予測」を行っていきたいと思いますが、なぜこのような検証を行おうと思ったのかというと、「学習データが多いほど、予測精度が上がる」という仮説は、「為替レートについては当てはまらないのでは無いのか?」と思ったからです。
「為替レート」に影響を与える因子は「遠い過去では無くて、近い過去の影響がより強くなるのでは無いのか?」と思ったので、その仮説が正しいのかを検証してみることにしました。
「時系列データ」の学習と予測
機械学習で「時系列データ」を予測する方法には、「Recurrent Neural Network(リカレントニューラルネットワーク)」という方法があります。
どのような方法なのかというと、「時系列の中間層」の値を保持したまま学習が行えるとのことで、
のようなイメージで、前の時間の「中間層」の影響を考慮して学習を行っていきます。
この方法は、それぞれのデータが独立している場合ではなく、それぞれのデータに「相関関係」がある場合に利用していきます。
例えば、電気信号や音声等の波形データ等、時間的に推移する中でそれぞれのデータが関係性を持っている場合に利用できる「機械学習」の手法の一つです。
「RNN」を理解するためには「Neulal Network」の理解が必要なのですが、興味がある方はぜひ学習してみてください。
「RNN」が利用できる有名なライブラリには、
- Theano
- Tensor Flow
- Deeplearning4J
などがあり、個人の方が作成されているRNNのプログラム等も多数あり、どれを利用すればいいのか迷いましたが、今回は、「Tensor Flow」を利用していきたいと思います。
「Tensor Flow」から「時系列の為替データ」を取得するための「為替レート取得API」を作成し、「Tensor Flow」で為替レートを取得します。
予測結果の推移
これまでにご説明してきた方法で「2000分」のデータで50回分の取引の結果を検証してみました。
その結果は・・・
あたり回数:26回(52%)、はずれ回数:24回(48%)
でした。
現在は学習データを「4000分」に増やして検証を続けています。
欲しい結果は「あたり」または「はずれ」が70%以上を目指しているのですが、まだまだ数多く検証を積み重ねていく必要があります。
さらに、「為替」に影響する因子は他にもたくさんあり、例えば「米国雇用統計」の発表時には、為替の急変動が起きやすいなど、「学習データ」には含まれていない事象もたくさんあります。
「為替の時系列データのみ」でどこまで予想できるのか、引き続き予測推移を見守っていきたいと思います。
FXの「AI予測の結果」はYouTube「FX AI予測チャンネル」で公開しています。