FX自動売買(EA)の検証・考察

ゴールドEAのバックテストは当てにならないのか?フォワードテストと結果を詳細に比較してみた。

※アフィリエイト広告を利用しています

広告
広告

ナンピンマーチンEAのバックテストは当てにならないのか?

巷では、以下のような話をよく見たり聞いたりします。

  • ナンピンマーチンEAのバックテストは当てにならない
  • フォワードテストを公開していないEAは信用できない

そこで今回は、バックテストとフォワードテストで全く同じロジックで結果を比較し、差異を分析してみたいと思います。 今回使用するモデルの詳細については、以下の記事をご覧ください。 ロジックについて細かく説明しています。

ちなみに、バックテストについては、MT4やMT5のバックテスト機能を使用していません。MT5からGOLDの全ティックデータをダウンロードし、Pythonにてバックテストモデルを実装しています。

フォワードテストについても、EAと言いながら実はMQL4やMQL5を用いたものではありません。PythonのMetaTrader5モジュールを利用しています。

従って、バックテストとフォワードテストどちらもPythonで同様のロジックで実践していますので、ロジック差はほぼないはずです。

2022年9月15日(木)の損益比較

それでは、バックテストとフォワードテストの比較をしていきます。
今回は、2022年9月15日(木)の1日の動きを見ることにします。

必要資金(required)および損益(profit)

バックテスト
required profit yield
404,065 円 25,059 円 6.20 %
必要資金(required)とは、ゼロカットになってしまう目安です。
このケースは、40万円で運用していると、ロスカットぎりぎりという感じです。
フォワードテスト
required profit yield
701,247 円 24,031 円 3.43 %
フォワードテストの方が必要資金が大きくなっています。
バックテストの結果、50万円で運用すれば大丈夫と判断し、実際に運用してみたらゼロカットになってしまう、ということが起こりうる差です。

必要資金(required)の内訳

バックテスト
pos. lot margin DD
12 4.12 98,880 円 -305,185 円
バックテストでは、最大ポジション数(pos.)が12です。
ナンピンを重ねて行った結果、総lot数が4.12になっています。
フォワードテスト
pos. lot margin DD
13 6.22 149,280 円 -551,967 円
一方のフォワードテストですが、最大ポジション数が1つ多い13ですね。
その結果、証拠金(margin)も含み損(DD)も大きくなり、70万円超ないと耐えられない、という状態になっています。

損益(profit)の内訳

バックテスト
  pos. profit DD
buy 12 12,107 円 -305,185 円
sell 5 12,952 円 -12,226 円
今回大きめのポジションを持っていたのはbuyポジション側ということがわかります。
フォワードテスト
  pos. profit DD
buy 13 10,439 円 -551,967 円
sell 5 13,592 円 -10,078 円
buyポジションの13というのが、どの時間帯で起こり、バックテストとフォワードテストでどのような違いがあったのか、そのあたりをこの後具体的に見ていきます。

1日の値動き(15分足)

この日は、1690前後で推移していましたが、16時以降に20~30ほど大きく下落して、その後は1665前後で推移していることが分かります。
このように大きな動きがあるとポジション数も多くなりDDも大きくなりがちですが、価格の戻りがそれなりにあればそこで利確することが出来ます。

セット毎の取引履歴の比較

ここからは、各セット毎にバックテストとフォワードテストでどのような差が生じたか見ていきます。

(buy_set_1~5) vs (buy_set_1~5)

buyポジションのセット1~5の比較を行います。
最初の1つ目のポジションをエントリー後、クローズするまでを1セットと呼ぶことにしています。
バックテスト(buy_set_1~5)
set entry close profit DD pos.
1 1:05 13:01 1,419 -20,436 6
2 13:01 14:36 661 -3,964 4
3 14:36 15:14 313 -588 2
4 15:14 15:30 764 -1,527 3
5 15:30 15:30 147 -313 1
セット1からポジション数が6まで積み上がって、DDも-2万円とそれなりな動きをしていることがわかります。
フォワードテスト(buy_set_1~5)
set entry close profit DD pos.
1 1:05 13:01 1,440 -20,520 6
2 13:01 14:36 641 -3,492 4
3 14:36 15:14 317 -587 2
4 15:14 15:30 772 -1,565 3
5 15:30 15:30 145 -317 1
フォワードテストの方も、セット1でポジション数6、DDは-2万円と、バックテストとほぼ同じような動きをしていることがわかります。

(buy_set_6~10) vs (buy_set_6~10)

続いて、6~10セット目も見ていきたいと思います。
バックテスト(buy_set_6~10)
set entry close profit DD pos.
6 15:30 15:32 147 -100 1
7 15:32 15:43 438 -1,776 3
8 15:43 15:44 146 -60 1
9 15:44 15:46 157 -51 1
10 15:46 15:47 144 -67 1
あまりポジションも積み上がらず、比較的短期間で利確しているような動きです。
フォワードテスト(buy_set_6~10)
set entry close profit DD pos.
6 15:30 15:32 146 -102 1
7 15:32 15:43 442 -1,738 3
8 15:43 15:44 145 -55 1
9 15:44 15:45 151 -66 1
10 15:45 15:46 146 -194 1
大きな動きではないこともあってか、ここまではバックテストとフォワードテストは、ほぼほぼ同じ動きをしています。微妙な差は、取引時のちょっとしたティック差でしょう。

(buy_set_11~15) vs (buy_set_11~15)

続きまして、セット11~15の比較です。
バックテスト(buy_set_11~15)
set entry close profit DD pos.
11 15:47 15:49 160 -134 1
12 15:49 16:45 931 -17,555 6
13 16:45 16:48 153 -124 1
14 16:48 16:49 144 -69 1
15 16:49 16:50 173 -39 1
12セット目で少し大きめのDDですね。
フォワードテスト(buy_set_11~15)
set entry close profit DD pos.
11 15:46 15:49 158 -80 1
12 15:49 16:44 1,185 -15,253 6
13 16:44 16:48 146 -103 1
14 16:48 16:49 155 -43 1
15 16:49 16:49 159 -69 1
こちらも12セット目で大きめのDDです。ポジション数はバックテストと同じく6ですので、そこまで大きな差は生じていない様子です。

(buy_set_16~23) vs (buy_set_16~20)

このあたりから、バックテストとフォワードテストでセット数がずれてきます。
バックテストですと、23セット目のクローズ時間が18:27ですが、フォワードテストでは20セット目のクローズ時間が18:27になっています。
この比較では、なるべく同じ時間帯のセットを比較するようにしています。
バックテスト(buy_set_16~23)
set entry close profit DD pos.
16 16:50 16:53 296 -549 2
17 16:53 16:59 154 -153 1
18 16:59 17:17 480 -1,416 3
19 17:17 17:59 1,767 -305,185 12
20 17:59 18:02 144 -329 1
21 18:02 18:12 613 -3,901 4
22 18:12 18:17 154 -109 1
23 18:17 18:27 149 -227 1
19セット目でDDが-30万円です。これがこの日の最大含み損ですね。
12ポジションまで積み上がっていますが、17:17→17:59と、比較的短時間で利確まで行えていることがわかります。
フォワードテスト(buy_set_16~20)
set entry close profit DD pos.
16 16:49 16:58 145 -311 1
17 16:58 17:00 146 -145 1
18 17:00 18:02 2,247 -551,967 13
19 18:02 18:17 439 -3,073 3
20 18:17 18:27 152 -186 1
フォワードテストの方は、17セット目が含み損最大になっています。-55万円です。ポジション数は、バックテストと比較して1つ多い13ですね。
時間ですが、17:00→18:02と、クローズタイミングはバックテストの19セット目とかなり近いです。18時前後で比較的大きく戻したことがわかりますね。

(buy_set_24~28) vs (buy_set_21~25)

一つ前のバックテストの23セット目と、フォワードテストの20セット目を比較するとわかるのですが、ここではまた同じタイミングでエントリー→クローズという流れになっていて、いつの間にかまた同期し始めたことがわかります。
バックテスト(buy_set_24~28)
set entry close profit DD pos.
24 18:27 18:29 166 -164 1
25 18:29 19:24 1,064 -15,117 6
26 19:24 19:31 167 -103 1
27 19:31 20:00 287 -489 2
28 20:00 20:02 144 -61 1
ここでは、DDの大きめな25セット目ではなく、27セット目に注目です。
19:31エントリー、ポジション数2で、20:00にクローズという流れです。
フォワードテスト(buy_set_21~25)
set entry close profit DD pos.
21 18:27 18:29 152 -112 1
22 18:29 19:22 1,016 -13,805 6
23 19:22 19:31 146 -116 1
24 19:31 19:35 171 -102 1
25 19:35 20:01 313 -772 2
一方のフォワードテストが、同期していたはずが24セット目のところでバックテストと異なる動きにまたなります。24セット目は比較的短時間で利確、その後25セット目がポジションを2つ持ってクローズと、微妙な差が生じています。

(buy_set_29~31) vs (buy_set_26~28)

buyポジション側の最後のセットです。
バックテスト(buy_set_29~31)
set entry close profit DD pos.
29 20:02 20:18 146 -143 1
30 20:18 23:06 582 -4,404 4
31 23:06 23:49 -103 -177 1
最後の3セットも、バックテストとフォワードテストでは微妙な差が生じています。
フォワードテスト(buy_set_26~28)
set entry close profit DD pos.
26 20:01 20:06 146 -69 1
27 20:06 20:29 155 -197 1
28 20:29 23:49 -937 -5,628 4
バックテストはポジション数4の30セット目を23:06に利確できたのに対し、フォワードテストは最後に4つのポジションを持ったまま23:49を迎えて強制クローズという結果になっています。

(sell_set_1~5) vs (sell_set_1~5)

sellポジション側についても同じようにセット毎に見ていきたいと思います。
バックテスト(sell_set_1~5)
set entry close profit DD pos.
1 1:05 3:15 146 -149 1
2 3:15 4:00 144 -275 1
3 4:00 5:54 160 -292 1
4 5:54 6:03 249 -120 1
5 6:03 7:32 292 -592 2
この時間帯(いわゆる東京時間)は、安定的に動くので、あまりポジションが積み上がらないことも多いです。
フォワードテスト(sell_set_1~5)
set entry close profit DD pos.
1 1:05 3:15 150 -144 1
2 3:15 4:00 145 -283 1
3 4:00 5:54 159 -296 1
4 5:54 6:03 274 -125 1
5 6:03 7:38 148 -308 1
5セット目だけ、バックテストが2つのポジションを持っているのに対し、フォワードテストは全てポジション数1です。ただ、それほど大きな差ではありません。

(sell_set_6~10) vs (sell_set_6~10)

続いて、sellポジションの6~10セット目です。
バックテスト(sell_set_6~10)
set entry close profit DD pos.
6 7:32 7:38 152 -64 1
7 7:38 7:55 177 -150 1
8 7:55 8:02 150 -77 1
9 8:02 9:43 292 -828 2
10 9:43 10:09 146 -226 1
引き続き大きな差はなさそうです。2ポジなのか1ポジなのかという微妙な差があるのみです。
フォワードテスト(sell_set_6~10)
set entry close profit DD pos.
6 7:38 7:55 172 -100 1
7 7:55 7:56 159 -50 1
8 7:56 8:52 298 -644 2
9 8:52 9:10 319 -577 2
10 9:10 10:07 144 -225 1
ナンピンマーチンは、このように安定しているレンジの動きでは、小さな利益を積み重ねていきます。

(sell_set_11~15) vs (sell_set_11~15)

11〜15セット目ですが、引き続きほぼ同期した動きをしています。
バックテスト(sell_set_11~15)
set entry close profit DD pos.
11 10:09 11:18 472 -1,450 3
12 11:18 11:48 147 -179 1
13 11:48 13:30 480 -2,094 3
14 13:30 13:40 153 -112 1
15 13:40 14:09 349 -140 1
バックテストの11~13セット目にフォワードテストの11~12セット目が対応して微妙にズレているのですが、
フォワードテスト(sell_set_11~15)
set entry close profit DD pos.
11 10:07 11:48 313 -1,139 2
12 11:48 13:30 458 -1,957 3
13 13:30 13:40 152 -83 1
14 13:40 13:42 149 -39 1
15 13:42 14:09 195 -296 1
バックテストの14~15セット目と、フォワードテストの13~15セット目が上手く噛み合って、同じような結果になっています。

(sell_set_16~20) vs (sell_set_16~21)

16~20セット目(フォワードテストは21セット目まで)です。
バックテスト(sell_set_16~20)
set entry close profit DD pos.
16 14:09 15:20 305 -1,064 2
17 15:20 15:30 179 -256 1
18 15:30 15:34 463 -2,008 3
19 15:34 15:35 144 -59 1
20 15:35 15:56 815 -7,091 5
ポジション数が1~2くらいのセットは、多少ずれてもそれほど差が生じませんね。
フォワードテスト(sell_set_16~21)
set entry close profit DD pos.
16 14:09 15:10 292 -927 2
17 15:10 15:20 337 -603 2
18 15:20 15:20 145 -144 1
19 15:20 15:34 430 -1,799 3
20 15:34 15:34 144 -47 1
21 15:34 15:56 828 -7,093 5
バックテストの20セット目と、フォワードテストの21セット目が対応するようになりました。

(sell_set_21~26) vs (sell_set_22~27)

この6セットは、ほぼ完全同期です。
XM時間の15:30というのは、日本時間の21:30です。
バックテスト(sell_set_21~26)
set entry close profit DD pos.
21 15:56 15:59 153 -86 1
22 15:59 16:00 170 -39 1
23 16:00 16:04 152 -126 1
24 16:04 16:18 313 -759 2
25 16:18 16:27 154 -123 1
26 16:27 16:30 159 -61 1
この時間帯の動きは、下げの初動というところです。
いわゆるNY時間に突入して動きが激しくなっています。
フォワードテスト(sell_set_22~27)
set entry close profit DD pos.
22 15:56 15:59 152 -87 1
23 15:59 16:00 176 -39 1
24 16:00 16:04 152 -126 1
25 16:04 16:18 292 -748 2
26 16:18 16:21 148 -93 1
27 16:21 16:30 165 -303 1
短期間で小さな利益を積み重ねるような動きです。

(sell_set_27~32) vs (sell_set_26~34)

このあたりは、先ほどの初動で一度下げてから、戻している時間帯です。
バックテスト(sell_set_27~32)
set entry close profit DD pos.
27 16:30 16:39 180 -290 1
28 16:39 17:12 761 -12,226 5
29 17:12 17:29 144 -326 1
30 17:29 17:35 163 -107 1
31 17:35 17:40 153 -169 1
32 17:40 17:46 150 -143 1
17時過ぎまで大きめに戻して、その後一気に下げ始めるタイミングがここです。
フォワードテスト(sell_set_26~34)
set entry close profit DD pos.
26 16:18 16:21 148 -93 1
27 16:21 16:30 165 -303 1
28 16:30 16:38 145 -238 1
29 16:38 17:11 727 -10,078 5
30 17:11 17:26 145 -218 1
31 17:26 17:29 146 -89 1
32 17:29 17:36 148 -184 1
33 17:36 17:42 152 -222 1
34 17:42 17:47 146 -50 1
29セット目で5ポジまで積み上がりますが、すぐ下落で利確、その後1ポジを連続利確です。

(sell_set_33~37) vs (sell_set_35~39)

ここは下落時間帯。sellポジションは、次々と利確していきます。
バックテスト(sell_set_33~37)
set entry close profit DD pos.
33 17:46 17:49 343 -94 1
34 17:49 17:49 144 -43 1
35 17:49 17:50 146 -134 1
36 17:50 17:51 184 -109 1
37 17:51 17:52 177 -184 1
1分程度の間隔で、連続利確です。
フォワードテスト(sell_set_35~39)
set entry close profit DD pos.
35 17:47 17:49 313 -57 1
36 17:49 17:49 162 -66 1
37 17:49 17:50 182 -158 1
38 17:50 17:51 185 -109 1
39 17:51 17:52 164 -195 1
クローズしてすぐエントリーするのでスプレッドがもったいない、、という気持ちは捨てて見守ります。

(sell_set_38~42) vs (sell_set_40~44)

引き続き下落基調。こうなるとsell側のセット数は増えていきます。
バックテスト(sell_set_38~42)
set entry close profit DD pos.
38 17:52 17:52 149 -50 1
39 17:52 17:52 250 -67 1
40 17:52 17:55 292 -704 2
41 17:55 17:56 156 -50 1
42 17:56 17:57 163 -59 1
バックテストとフォワードテストでほぼ同期ですね。
ちなみに18時が日本時間の深夜0時ですがまだまだ稼働時間帯です。
フォワードテスト(sell_set_40~44)
set entry close profit DD pos.
40 17:52 17:52 224 -49 1
41 17:52 17:52 152 -105 1
42 17:52 17:55 291 -656 2
43 17:55 17:56 162 -44 1
44 17:56 17:57 145 -60 1
このような動きでは、バックテストとフォワードテストでほとんど差がなさそうです。

(sell_set_43~47) vs (sell_set_45~49)

一方的な動きが落ち着き、価格が上下するような動きに突入です。
バックテスト(sell_set_43~47)
set entry close profit DD pos.
43 17:57 17:57 170 -109 1
44 17:57 18:05 582 -4,404 4
45 18:05 18:09 157 -126 1
46 18:09 18:10 146 -54 1
47 18:10 18:33 676 -4,153 4
4ポジ程度持っているのにも関わらず、10〜20分程度での利確です。
これは、価格の上下が激しい(ボラティリティが大きい)ことが分かります。
フォワードテスト(sell_set_45~49)
set entry close profit DD pos.
45 17:57 17:57 254 -62 1
46 17:57 18:05 579 -4,312 4
47 18:05 18:09 146 -119 1
48 18:09 18:10 145 -89 1
49 18:10 18:33 596 -4,026 4
このような動きは、ナンピンマーチンの得意分野です。
大きく動いても戻してくれればすぐにポジション解消です。
バックテストとフォワードテストでほとんど差はないですね。

(sell_set_48~52) vs (sell_set_50~56)

少し戻したのですが、また1時間くらい一方的下落の始まりです。
バックテスト(sell_set_48~52)
set entry close profit DD pos.
48 18:33 18:52 144 -249 1
49 18:52 18:55 147 -61 1
50 18:55 19:00 154 -53 1
51 19:00 19:08 149 -249 1
52 19:08 19:15 166 -93 1
各セットのポジションと利確の仕方を見るだけで、ある程度チャートの形状が想像出来てしまうというのもナンピンマーチンの特徴です。
フォワードテスト(sell_set_50~56)
set entry close profit DD pos.
50 18:33 18:39 146 -145 1
51 18:39 18:52 320 -631 2
52 18:52 18:55 154 -44 1
53 18:55 18:57 149 -53 1
54 18:57 19:07 148 -165 1
55 19:07 19:09 148 -70 1
56 19:09 19:15 148 -154 1
下落基調なので、sellポジション側は平和です。代わりに、buyポジション側で積み重なっている可能性があるわけですが。

(sell_set_53~56) vs (sell_set_57~61)

sellポジション側の最後です。ボラの高い状況も落ち着き、エントリーからクローズまでの時間が長くなってきました。
バックテスト(sell_set_53~56)
set entry close profit DD pos.
53 19:15 21:03 582 -6,418 4
54 21:03 21:48 146 -259 1
55 21:48 22:27 147 -222 1
56 22:27 23:49 -485 -871 2
バックテスト側の53セット目は4つのポジションで、21:03に利確です。
フォワードテスト(sell_set_57~61)
set entry close profit DD pos.
57 19:15 20:52 750 -8,102 5
58 20:52 21:03 146 -77 1
59 21:03 21:49 146 -275 1
60 21:49 22:33 161 -251 1
61 22:33 23:49 -629 -995 2
一方の、フォワードテスト側の57セット目は、5つのポジションを20:52に利確です。より多くのポジションだったので、早めに利確したようです。

乖離が大きかったセットの詳細

概ね同じような動きをしているセットも多かったですが、それなりに乖離していたセットもいくつかあったので、個別に見ていきたいと思います。

(buy_set_19) vs (buy_set_18)

価格が大きく下落し、最もポジションを多く持った時間帯です。
これが最大含み損の差にも大きく影響しました。

グラフ – バックテスト(buy_set_19)

まずはグラフで見てみます。バックテストからです。

 

グラフ – フォワードテスト(buy_set_18)

次にフォワードテストです。
エントリータイミングがやや早く、クローズタイミングもやや遅いことが分かります。

バックテスト(buy_set_19)

さて、バックテストですが、最初の注文が17:17から始まっています。
エントリー注文
time lot buy ave. order DD
17:17 0.01 1688.10 1688.10 1
17:22 0.02 1686.09 1686.76 2
17:35 0.03 1684.08 1685.42 3
17:40 0.05 1682.02 1683.87 4
17:47 0.08 1679.90 1682.20 5
17:49 0.12 1677.74 1680.47 6
17:50 0.18 1675.71 1678.72 7
17:51 0.27 1673.49 1676.86 8
17:52 0.41 1671.47 1674.97 9
17:52 0.62 1668.73 1672.81 10
17:56 0.93 1666.60 1670.69 11
17:57 1.40 1664.53 1668.60 12 -305,185
このモデルのナンピン幅の設定は2.00なので、概ね2.00前後でポジションを追加して行っています。この点は想定通りのロジックと言えます。
実際のティックデータを用いてバックテストを行っているので、その分微妙な誤差が生まれています。
クローズ注文
time lot ave. close profit
17:59 4.12 1668.60 1668.63 1,767
12ポジ、合計4.12lotを、17:59に利確です。
利確幅は0.03とかなり狭いですが、12ポジを持った場合のロジック上の想定利確幅です。

フォワードテスト(buy_set_18)

続いてフォワードテストです。バックテストとの違いは、17:00からポジションを持ち始めていることです。最初のエントリー価格も、1691.10とバックテストよりも少し高めです。
エントリー注文
time lot buy ave. order DD
17:00 0.01 1691.10 1691.10 1
17:02 0.02 1689.05 1689.73 2
17:11 0.03 1687.02 1688.38 3
17:29 0.05 1685.01 1686.85 4
17:40 0.08 1682.94 1685.20 5
17:46 0.12 1680.93 1683.55 6
17:49 0.18 1678.14 1681.56 7
17:50 0.27 1676.11 1679.62 8
17:51 0.41 1674.06 1677.67 9
17:52 0.62 1672.05 1675.73 10
17:52 0.93 1670.01 1673.77 11
17:52 1.40 1667.89 1671.77 12
17:57 2.10 1665.35 1669.60 13 -551,967
想定ナンピン幅2.00に対して、概ねその通りにポジションを追加して行っていますが、多少幅が大きくなっているタイミングがいくつかありますね。
これが、フォワードテスト(実際の相場)の場合に起こりうるバックテストの乖離かと思います。想定ナンピン幅に達したことを判定してから注文が通るまでの間に、値が大きく動いてしまうことがあります。
クローズ注文
time lot ave. close profit
18:02 6.22 1669.60 1669.63 2,247
こちらは、18:02に利確です。13ポジでは、ロジック上の目標利確幅は0.02でしたが、0.03で利確という結果になっています。これは誤差レベルで悪くないですね。
ポジション数がバックテストよりも1つ多くなってしまった要因は、ポジションをエントリーし始めたタイミングがフォワードテストの方が早かったということだと言えそうです。

モデル別の損益比較

タイトルとURLをコピーしました