3時間後の為替を人工知能で予測する「FXトレードプログラミング」

ここ数年の間で、「人工知能」「AI」という言葉を聞くことが日常になってきていて、「フィンテック」分野での活用も広がってきています。

以前に、

→「「FXトレードプログラミング」に挑戦してみよう!」

という記事では、「Meta Trader」を利用したプログラムの書き方について紹介しましたが、今回は、人工知能を利用して「為替を予測するシステムの開発」に取り組み「どのような結果が出るのか?」を検証していきたいと思います。

今回作成するシステムでは、「機械学習」を用いて予測をしていきたいと思いますが、「学習と予測」を「ある時点」で逐次実行していきます。

今回検証する内容は、「どれくらいのデータ量を学習すると、どれくらいの予測精度になるのか?」です。

あと、「実用できるか」というのも大きなポイントですね。

1分ごとの為替データを取得するプログラム

今回は、「1分ごと」に為替データを取得していきたいと思います。

取得する「通貨ペア」は、

  • ドル/円
  • ユーロ/円
  • ユーロ/ドル
  • ユーロ/ポンド
  • ポンド/円
  • ポンド/ドル

の「6ペア」を選択しました。

選択した通貨の基準は「貨幣流通量」が多く、価格の変動が「ドル/円」に与えそうな影響が大きい通貨ペアを選定しました。

では、どうやってこの6通貨ペアを1分ごとに取得するのかというと、「Meta Trader」を利用し、「Meta Trader」で為替データを取得して「WEBサーバ」へ送信し、「データベース」に通貨ペアのデータを保存していきます。

そのため、WEBサーバには、

  • 「為替通貨ペア」のデータを登録するためのAPI
  • 「為替通貨ペア」のデータを取得するためのAPI

の2つを作る必要があります。

システムイメージ1

「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サーバでは、データベースに「受信した為替データ」を保存しています。

「為替データ」の学習と予測

今回は、機械学習を用いて為替データの「学習」後に、すぐに「予測」を行っていきますが、基準となるのは、「学習開始時点」の時刻です。

過去の「何分のデータ」を学習すると、どれくらいの「予測精度」になるのかを検証していきたいと思います。

システムイメージ2

今回は「機械学習」を用いて「学習と予測」を行っていきたいと思いますが、なぜこのような検証を行おうと思ったのかというと、「学習データが多いほど、予測精度が上がる」という仮説は、「為替レートについては当てはまらないのでは無いのか?」と思ったからです。

「為替レート」に影響を与える因子は「遠い過去では無くて、近い過去の影響がより強くなるのでは無いのか?」と思ったので、その仮説が正しいのかを検証してみることにしました。

「時系列データ」の学習と予測

機械学習で「時系列データ」を予測する方法には、「Recurrent Neural Network(リカレントニューラルネットワーク)」という方法があります。

どのような方法なのかというと、「時系列の中間層」の値を保持したまま学習が行えるとのことで、

システムイメージ3

のようなイメージで、前の時間の「中間層」の影響を考慮して学習を行っていきます。

この方法は、それぞれのデータが独立している場合ではなく、それぞれのデータに「相関関係」がある場合に利用していきます。

例えば、電気信号や音声等の波形データ等、時間的に推移する中でそれぞれのデータが関係性を持っている場合に利用できる「機械学習」の手法の一つです。

「RNN」を理解するためには「Neulal Network」の理解が必要なのですが、興味がある方はぜひ学習してみてください。

「RNN」が利用できる有名なライブラリには、

  • Theano
  • Tensor Flow
  • Deeplearning4J

などがあり、個人の方が作成されているRNNのプログラム等も多数あり、どれを利用すればいいのか迷いましたが、今回は、「Tensor Flow」を利用していきたいと思います。

「Tensor Flow」から「時系列の為替データ」を取得するための「為替レート取得API」を作成し、「Tensor Flow」で為替レートを取得します。

システムイメージ4

予測結果の推移

これまでにご説明してきた方法で「2000分」のデータで50回分の取引の結果を検証してみました。

その結果は・・・

あたり回数:26回(52%)、はずれ回数:24回(48%)

でした。

現在は学習データを「4000分」に増やして検証を続けています。

欲しい結果は「あたり」または「はずれ」が70%以上を目指しているのですが、まだまだ数多く検証を積み重ねていく必要があります。

さらに、「為替」に影響する因子は他にもたくさんあり、例えば「米国雇用統計」の発表時には、為替の急変動が起きやすいなど、「学習データ」には含まれていない事象もたくさんあります。

「為替の時系列データのみ」でどこまで予想できるのか、引き続き予測推移を見守っていきたいと思います。(新しい結果が出たら、随時更新していく予定です。)

HOMEへ