プログラミングを少し使ってFXの検証を自動化してみた

###はじめに
CAMPFIREでエンジニアをしている堤です。
今回アドベントカレンダー（クリスマスへのカウントダウンイベント）用の記事の投稿です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/bf9083b9-edad-5f15-3c1c-5ecd9bbf72de.png)
自分がプログラミングに興味を持ったきっかけは、20代半ばの頃に<b>「FXトレードを自動化できないだろうか？」</b>と考えたことでした。
それから独学でプログラミング（MQL4）を学習し、個人でFX自動売買ソフト（通称EA）の開発をしてきました。

今回は自作したFX自動売買ソフト（MT4用のEA）の一つを題材に、プログラミングを少し使って検証作業を自動化する方法をご紹介します！

[補足]
・随所にある【用語説明】は、ぱぱっと書いたのでざっくりした内容になっています。
・FX・MT4について基礎知識があれば十分理解できる内容になっていますので、興味を持った方は是非少し勉強してみてください。

<details><summary>用語説明</summary><div>
・【FX】：Foreign Exchangeの略で「外国為替証拠金取引」のこと。
　　例えば、1ドル=100円の時に1ドル買って1ドル=110円の時に売れば10円の利益になり、
　　逆に、1ドル=100円の時に1ドル売って1ドル=90円の時に買い戻せば10円の利益になる。

・【MT4】：メタトレーダー4の略語。FXで最も使われている売買プラットフォーム
・【EA】：エキスパートアドバイザー（Expert Advisor）の略語。MT4専用の自動売買ソフト(MQL4という言語)
</div></details>
###検証するFX自動売買ソフトのロジック
多通貨型両建て変則ナンピンマーチン手法（毎月末での時限全決済）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/98712516-bb3e-a324-9d74-bdff8c792076.png)
[補足]
・含み損益があっても毎月末で全決済する
・通貨ペアのスプレッドとボラティリティに応じて仕掛幅を調整
・8つのMT4（運用口座）を使用し、資金を分割し同時破綻リスクを低減
・保険会社のように一定率の破綻を前提として、トータルで収益をあげる想定（※注1）

※ 今回の主旨ではないので、ロジックの詳細は割愛します。

<details><summary>用語説明</summary><div>
・【ナンピン】：相場が予想と逆行した時に追撃する投資手法
　（例：1ドル=100円で買って90円に下がって含み損になっているが、更に1ドル買うなど）
・【マーチン】：マーチンゲール法。負けた際に掛け金を上乗せし、負け分を一気に取り戻す手法
　（例：1ドル=100円で1ドル買って90円に下がって10円損したが、90円で2ドル購入し、95円以上での売却で挽回を狙う）
・【スプレッド】：売買する際のFX業者に支払う為替手数料。買値と売値の差のこと。
・【ボラティリティ】：変動率、値動きの大きさのこと

・【含み損】：未確定の損失　
　（例：1ドル=100円で1ドル買い、1ドル=90円に下がった時は含み損といい、1ドル=110円に上がった時は含み益という）
</div></details>
***
※注1
8口座で20万円ずつ合計160万円を運用し、年間破綻率12.5％（1/8口座が破綻）、破綻しなかった口座の平均年利30％の場合

・破綻しなかった7つの口座の収益：7口座×20万万円×年利30％ = +42万円
・破綻した1つの口座の損失：1口座×20万円×-100％ = -20万円
　　
8つの口座のトータル損益：42万円-20万円= +22万円（22万/160万=年利13.75％）
***
###検証対象の通貨ペア
28通貨ペア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/eb9617f1-ee45-aa8d-3be7-ac53c04de8a4.png)
[補足]
・FX業者のFXDD、XMで取り扱っている通貨ペアにそれぞれ〇を記入
・80％：時間帯などにより変動するスプレッドの内、80％がこの数値以下であるということ
・総数など：計測した波の件数と平均値幅、最大値幅、標準偏差、3σ（確か1時間足）
・仕掛け幅：それぞれの数値から設定したナンピンの仕掛け幅

###検証期間
2015年7月～2020年8月の約5年間（バックテスト期間を月別に設定し、62ヵ月）

<details><summary>用語説明</summary><div>
・【バックテスト】：指定した過去の期間においてトレードした場合のシュミレーションを行うこと
</div></details>

###検証環境
XM社のMT4

<details><summary>用語説明</summary><div>
・【XM】：海外FX業者で最も有名。200万円の資金まで最大レバレッジ888倍での取引が可能。可能な最大口座保有数は8つ
・【レバレッジ】：テコの原理のこと。レバレッジ888倍ということは、資金の最大888倍の金額を運用できるということ。
</div></details>

###検証足データ（過去の値動きデータ）
Quant Data ManagerのTickデータを使用

[参考]
https://strategyquant.com/quantdatamanager/

<details><summary>用語説明</summary><div>
・【Quant Data Manager】：検証用の通貨ペアの過去データ取得できるソフト（無料でデータ取得可能）
・【Tickデータ】：検証時に用いるデータで最も詳細なデータ（Tick以外は、1分足、1時間足、日足などがある）
</div></details>

##Step 1.検証の実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/1fb62780-6a5f-4b46-5ad4-1eaee67f4a70.png)
####(1) EA用のパラメーター設定ファイル(setファイル)を月別×通貨ペア別で作成する

※設定方法については「EA　パラメーター　setファイル」などで検索

<b>[setファイルの内容の例]</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/ae3acd30-b9c3-b22c-858b-546373ddfc12.png)
<b>[設置場所]</b>
~\AppData\Roaming\MetaQuotes\Terminal\該当フォルダのpath\tester\任意のフォルダ名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/1442fa53-c0c0-1231-3e31-26026cfed7e3.png)


[補足]
別通貨ペアのファイルを作るなど、txtファイルの内容を少し変えたものを大量に複製する際には<b>[TExchange](https://forest.watch.impress.co.jp/article/2007/06/25/texchange.html)</b>という無料ツールが便利です。

####(2) batでbatを連続実行し、MT4のバックテストを自動化する
先の(1)で作成したファイルは合計28通貨×62ヵ月×仕掛け幅3パターン×注文方法2パターン（成行注文・指値注文）で10,416個になります。
1個のファイルのバックテストを実行するのに、今回のEAはだいたい5～10分かかりました。

これを手動でやるとなると、5～10分おきにPCを確認し、パラメーター設定ファイルを変更し、テスト期間と通貨ペアを変更した上でテストを実行するという作業を10,416回繰り返す必要があり、現実的ではありません。

そこで(1)で作成したEA用のパラメーター設定ファイル(setファイル)を、通貨ペアごとにbat化し、それをbatで自動で連続実行させます。

<details><summary>用語説明</summary><div>
・【batファイル】：Windowsで実行できるコマンドを記述したテキストファイルのこと
・【成行注文】：その時の価格で売買の注文を出すこと
・【指値注文】：指定価格での事前予約注文のこと

</div></details>

<b>[batファイル一覧]</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/f0e733b3-f042-fcd8-102b-88bfb664e1ef.png)

<b>[batファイルの内容の一例]</b>
AUDJPY.bat（AUDJPYの2015年7月～2020年8月の月別テスト用）※画像はクリックで拡大可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/f9701fde-9e3b-8819-546f-6a7c554cceda.png)

<b>[batファイルを実行するためのbatファイルの内容の一例]</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/3efd6bab-6efa-ef19-279a-8ba71434cfd9.png)
※4台のMT4で同時に実行していたため、1/4の7通貨ペア以外はコメントアウトしています

[補足]
・時間短縮のためには、複数台のMT4をインストールして同時に実行したり、VPSやリモートデスクトップを契約するのもあり

<details><summary>用語説明</summary><div>
・【VPSやリモートデスクトップ】：使用している手元のPCから別のPCやサーバを遠隔で操作できるサービス（月額数千円～）
・【コメントアウト】：コードを無効化すること
</div></details>

##Step 2.出力した検証データのファイルを整形
<b>[バックテスト後の結果レポート]</b>
こういったファイルが実施した月数×通貨ペア数分だけ出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/18580f30-eb0f-a463-f102-e30d7b5af4dc.png)

<b>[htmファイルの一例]</b>
次にこのファイルの中の各種数値を抽出し、集計します。（総損益、取引通貨量（Lot）、最大ドローダウン、必要証拠金など）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/5666248d-796b-3c4c-ee74-92625d37bfbc.png)
最大ドローダウン（最大含み損）などはhtmファイルの数だけ、ファイルを開いて手動コピペしていると、ファイルの数だけ実行する必要があります。（つまり1万回以上）

それは現実的ではないので、今回はsakuraエディタでgrep検索して抽出しました。（Visual Studio CodeやSublime Textだと抽出しづらかったため）

<details><summary>用語説明</summary><div>
・【必要証拠金】：取引を行うためにFX業者に預け入れる最低限の担保金（運用資金の一部）
・【最大ドローダウン】：集計期間内での資金の最大落ち込み額もしくは割合（％）
・【sakuraエディタ、Visual Studio Code、Sublime Text】：ソースコードエディタ
・【grep検索】：指定した文字列が含まれているファイルを検索すること
</div></details>

※余談ですが、Quant Data Managerで生成したTickデータでバックテストをすると、モデリング品質（テスト品質）がn/aとなります。

<b>[整形したデータをExcelのピボットテーブルで一覧化]</b>　※画像はクリックで拡大可能
通貨ペア別×月別の「損益」と「必要証拠金額」などをピボットテーブルで一覧化し、任意の通貨ペアの組み合わせでの損益、最大含み損、必要証拠金額などを検証します。

<details><summary>用語説明</summary><div>
・【ピボットテーブル】：Excelで大量のデータを様々な視点で分析するための機能（特定の複数条件でのフィルターや集計など）
</div></details>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/54666057-832c-6248-dead-2e25f189f2c0.png)
※最大含み損を把握するために破綻しないであろう金額（1億円）での運用のバックテストです。

##Step 3.算出された利回りと破綻率でシュミレーションする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/2b376db9-576a-7dcb-1208-56805b51e82d.png)
<b>[任意の通貨ペアの組み合わせでの想定破綻率と想定月利]</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/9eae4530-67cd-3cbf-62d7-38ab5087edfe.png)


[補足]
・上部の「割合」は各通貨ペアの月別の最大含み損の金額(途中から確率となっているが、意味は同じ)
・左側の表の「over MAXDD」は指定した通貨ペアで運用した際の月別の最大含み損額の割合
（30万円が8.1％というのは、62ヵ月中の8.1％の割合で指定した6通貨ペアの合計最大含み損が30万円を超えたということ）
・月利、年間破綻率は資金70万円で指定した6通貨ペアを運用した際の数値
・右側の表は100人が半年間運用した際の結果のシュミレーション（以下のグラフは、6人が1年間運用したシュミレーション）

<b>[設定した勝率と破綻率での損益シュミレーション]</b>　※画像はクリックで拡大可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/43838ba7-c520-b5bd-0349-cc64c26b94fc.png)
[補足]
70万円を8口座に分割し1口座当たりの資金は8.75万円として、約1年（12.5ヵ月）運用した際のシュミレーション×6ケース

・平均利益：1口座辺りの資金8.75万円×月利4.46％として3,903円
・平均損失：1口座が破綻した時の損失である-8.75万円
・勝率：破綻回避率（100％-破綻率3.2％とし96.8％）

※試行回数100回：100回/8口座/12ヵ月 → 1.04年…約1年のシュミレーション

<b>[「=RAND()」で出したランダムな数値と設定勝率を元に上記グラフを描写]</b>　※画像はクリックで拡大可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/793e6b75-1ce3-edfc-bc82-77583fe03a48.png)

##終わりに
検証過程においてプログラミングを使う要素はほんの少しですが、それによって短縮できる時間は非常に大きいです。

仮に今回の題材として取り上げたEAの検証を手動で1日8時間やっていたとしたら、何日かかっていたでしょうか？
なんと約217日（10,416カ月分×(最短5分+ 確認及び設定変更5分)）もかかる計算になります。

それが少しのプログラミングの知識を使うだけで、最短で9日程（10,416カ月分×最短5分/1件÷4台のMT4）で終わらせることができます。
PCのスペックが高かったり、VPSを使えば更に短縮できます。

有料・無料に関わらず、失いたくない資金を託すのであれば、必ず事前に十分な検証をされることをオススメします。その際に、この記事が少しでも役に立てれば幸いです。

最後まで読んでくださってありがとうございました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344229/219c1327-516b-c79b-17da-d66b8b249390.png)