バックテストの落とし穴
MT4の「ターミナル」の「Code Base」タブには様々なEAやインディケーターが紹介されている。
何か面白いアイデアはないかなと思い、「レーティング」の高いEAのいくつかをコンパイルしてバックテストしてみた。
多くはデフォルトの設定ではひどい結果で、どうしてレーティングが高いのか不思議に感じた。
その中で例外的にデフォルトの設定で、しかも複数の通貨ペア、複数の足でよい成績の出るEAがあった。
そのEAのアイデアはとてもシンプルで、始値が前の足の安値より低ければ買って、その前の足の安値+スプレッドで利食い、始値が前の足の高値より高ければ売って、その前の足の高値-スプレッドで利食い、損切りはしない、というもの。
つまり、ギャップ分だけを利益にする。
しかし、そのようなギャップが果たして生じるのだろうか。
「テスター」の「結果」タブの「時間」を見ると、エントリーのほとんどが月曜日の「00:00」になっている。
これはつまり、ただの月曜朝の窓開けである。
窓開け以外のギャップもないわけではないが、数が少ないし、本当に存在したのか。
データエラーの可能性もある。
結局のところ、ギャップを利益にするというアイデアに優位性がないのだとすると、よいバックテスト結果が出たのは損切りせずにわずかな幅で利食いしたから、ということになる。
理由は何であれ、利益が出るのなら悪くはない。
ただ、月曜朝の窓開けだけでは週に1回しか機会がないから、もっと機会が増えるよう、適当なルールを作ることにした。
先ず20本の足で標準偏差を計算し、それにaを乗じる。
もし前の足が下落して下落幅の絶対値が標準偏差*a以上であれば買い、上昇して上昇幅が標準偏差*a以上であれば売る。
また、標準偏差にbを乗じる。
買った場合は買値+標準偏差*bで、売った場合は売値-標準偏差*bで利食い。
損切りはしない。
これでaとbを最適化してバックテストする。
先ずEURUSDで実行すると、素晴らしい結果が出る。
ところが同じパラメータを使ってGBPUSDで実行すると、どうしてもプラス決済できなかった腐れポジが何1000pipsというドカンをいくつもやらかしてひどい結果になる。
これを見るとやはり使えないと思うが、EURUSDでの結果があまりにも素晴らしいので、こういうバックテストをすると、「すべての通貨ペアに通用する戦略はない。これはGBPUSDには使えないだけだ」と自分に言い訳して、何とかしてこういうEAを使えるようにしようと考える人もいるだろう。
ところで、上の戦略は同時に保有できるポジションを1つと限定していた。
このため、買い、または売りのシグナルが出ても、すでにポジションを持っていたら、新たにポジションを加えることはしない。
しかし、上の戦略に優位性があるなら、そのような制約を除いてどんどんポジションを取ったほうが成績は上がるはずである。
そこで、その制約をはずしてバックテストすると、素晴らしい結果だったEURUSDですら悲惨な状況になる。
なぜか。
これは要するに制約のおかげで、腐れポジを「神回避」していたにすぎないからである。
「すでにポジションがあれば、それ以上ポジションを持たない」ということに戦略的な意味はない。
戦略に優位性がある限り、十分な資金があるなら、ポジションは多ければ多いほどよいはずである。
したがって、上の戦略には優位性がないと考えられる。
初めに戻って、月曜朝の窓開けでトレードするEAも週に1回、しかも月曜の「00:00」にしかエントリーしないことによって、腐れポジを偶然に回避していたにすぎないのだろう。
こう考えると、様々なフィルターを用いて、「こういうときはトレードしない」といったルールの多い(正確にはルールの数より、ルールによって減少するトレード機会の数のほうが問題だろう)EAはそのルールに本当の意味がない限り、そのバックテスト結果はすべて腐れポジの偶然の回避で過大評価されたものと言える。
特に極端な損大利小戦略は勝率が異常に高くなり、負けることはほとんどなくなる(負けたときは破滅的な負け方をするが)。
このため、負けの数が少ない分、破滅的な負けだけを回避するルールを後から付け加えるのは簡単である。
例えばもし、その負けが1月に起きたのなら、「1月はエントリーしない」というルールを付け加えれば、トレード数が1/12少なくなるだけで、成績が劇的に、爆発的によくなる。
しかし、こんなルールに再現性などあろうはずがない。
もし信頼性のあるルールがあるとすれば、日足なら必ず毎日、始値で買うか売るかし、その終値で決済するということを繰り返して長期的に利益を出すようなものだろう。
エントリーしないとか、ポジションはプラスになるまで持ち続けるというようなことをするとバックテスト上は実力をはるかに超える結果になる危険が高い。
特に1日のうちでほんの数分、数十分しかトレードせず、それでいてプラス決済できないと何時間でも何日でもポジションを持ち続けるような戦略はバックテスト結果がどれほどよくても信頼できない。
このような戦略はフォワードテストがよくても信頼できない。
極端な損大利小戦略を採用すれば、運が好ければ半年や1年くらい勝ち続けることはできる。
99%の確率の1の利益をコツコツ貯めるのと、1%の確率の99の損失で利益を吹き飛ばすのとで果たしてどちらが勝つか(もちろん期待値は同じである。コストを考慮すれば実際は不利)。
自分の運を信じてやるのもけっこうだが、それはもはや投資ではなく、ただのギャンブルである。
すべての時間のうちでわずかな時間だけ非常に勝ちやすいタイミングをピンポイントでつかむことのできる、偽物ではない戦略があるのなら別だが、通常はエントリーしない時間の占める割合が高ければ高いほど、バックテストの落とし穴は大きくなると考えられる。
このことに納得するのであれば、パラメータの総合デパートのような戦略やEAはどれほどバックテストの結果がよくても試してみようという気さえ起こらないだろう。
EAのパラメータを見ると、種類があまりにも多くて、どう使っていいのか分からないものもあるが、分からなくて結構。
使わないのが無難である。
何か面白いアイデアはないかなと思い、「レーティング」の高いEAのいくつかをコンパイルしてバックテストしてみた。
多くはデフォルトの設定ではひどい結果で、どうしてレーティングが高いのか不思議に感じた。
その中で例外的にデフォルトの設定で、しかも複数の通貨ペア、複数の足でよい成績の出るEAがあった。
そのEAのアイデアはとてもシンプルで、始値が前の足の安値より低ければ買って、その前の足の安値+スプレッドで利食い、始値が前の足の高値より高ければ売って、その前の足の高値-スプレッドで利食い、損切りはしない、というもの。
つまり、ギャップ分だけを利益にする。
しかし、そのようなギャップが果たして生じるのだろうか。
「テスター」の「結果」タブの「時間」を見ると、エントリーのほとんどが月曜日の「00:00」になっている。
これはつまり、ただの月曜朝の窓開けである。
窓開け以外のギャップもないわけではないが、数が少ないし、本当に存在したのか。
データエラーの可能性もある。
結局のところ、ギャップを利益にするというアイデアに優位性がないのだとすると、よいバックテスト結果が出たのは損切りせずにわずかな幅で利食いしたから、ということになる。
理由は何であれ、利益が出るのなら悪くはない。
ただ、月曜朝の窓開けだけでは週に1回しか機会がないから、もっと機会が増えるよう、適当なルールを作ることにした。
先ず20本の足で標準偏差を計算し、それにaを乗じる。
もし前の足が下落して下落幅の絶対値が標準偏差*a以上であれば買い、上昇して上昇幅が標準偏差*a以上であれば売る。
また、標準偏差にbを乗じる。
買った場合は買値+標準偏差*bで、売った場合は売値-標準偏差*bで利食い。
損切りはしない。
これでaとbを最適化してバックテストする。
先ずEURUSDで実行すると、素晴らしい結果が出る。
ところが同じパラメータを使ってGBPUSDで実行すると、どうしてもプラス決済できなかった腐れポジが何1000pipsというドカンをいくつもやらかしてひどい結果になる。
これを見るとやはり使えないと思うが、EURUSDでの結果があまりにも素晴らしいので、こういうバックテストをすると、「すべての通貨ペアに通用する戦略はない。これはGBPUSDには使えないだけだ」と自分に言い訳して、何とかしてこういうEAを使えるようにしようと考える人もいるだろう。
ところで、上の戦略は同時に保有できるポジションを1つと限定していた。
このため、買い、または売りのシグナルが出ても、すでにポジションを持っていたら、新たにポジションを加えることはしない。
しかし、上の戦略に優位性があるなら、そのような制約を除いてどんどんポジションを取ったほうが成績は上がるはずである。
そこで、その制約をはずしてバックテストすると、素晴らしい結果だったEURUSDですら悲惨な状況になる。
なぜか。
これは要するに制約のおかげで、腐れポジを「神回避」していたにすぎないからである。
「すでにポジションがあれば、それ以上ポジションを持たない」ということに戦略的な意味はない。
戦略に優位性がある限り、十分な資金があるなら、ポジションは多ければ多いほどよいはずである。
したがって、上の戦略には優位性がないと考えられる。
初めに戻って、月曜朝の窓開けでトレードするEAも週に1回、しかも月曜の「00:00」にしかエントリーしないことによって、腐れポジを偶然に回避していたにすぎないのだろう。
こう考えると、様々なフィルターを用いて、「こういうときはトレードしない」といったルールの多い(正確にはルールの数より、ルールによって減少するトレード機会の数のほうが問題だろう)EAはそのルールに本当の意味がない限り、そのバックテスト結果はすべて腐れポジの偶然の回避で過大評価されたものと言える。
特に極端な損大利小戦略は勝率が異常に高くなり、負けることはほとんどなくなる(負けたときは破滅的な負け方をするが)。
このため、負けの数が少ない分、破滅的な負けだけを回避するルールを後から付け加えるのは簡単である。
例えばもし、その負けが1月に起きたのなら、「1月はエントリーしない」というルールを付け加えれば、トレード数が1/12少なくなるだけで、成績が劇的に、爆発的によくなる。
しかし、こんなルールに再現性などあろうはずがない。
もし信頼性のあるルールがあるとすれば、日足なら必ず毎日、始値で買うか売るかし、その終値で決済するということを繰り返して長期的に利益を出すようなものだろう。
エントリーしないとか、ポジションはプラスになるまで持ち続けるというようなことをするとバックテスト上は実力をはるかに超える結果になる危険が高い。
特に1日のうちでほんの数分、数十分しかトレードせず、それでいてプラス決済できないと何時間でも何日でもポジションを持ち続けるような戦略はバックテスト結果がどれほどよくても信頼できない。
このような戦略はフォワードテストがよくても信頼できない。
極端な損大利小戦略を採用すれば、運が好ければ半年や1年くらい勝ち続けることはできる。
99%の確率の1の利益をコツコツ貯めるのと、1%の確率の99の損失で利益を吹き飛ばすのとで果たしてどちらが勝つか(もちろん期待値は同じである。コストを考慮すれば実際は不利)。
自分の運を信じてやるのもけっこうだが、それはもはや投資ではなく、ただのギャンブルである。
すべての時間のうちでわずかな時間だけ非常に勝ちやすいタイミングをピンポイントでつかむことのできる、偽物ではない戦略があるのなら別だが、通常はエントリーしない時間の占める割合が高ければ高いほど、バックテストの落とし穴は大きくなると考えられる。
このことに納得するのであれば、パラメータの総合デパートのような戦略やEAはどれほどバックテストの結果がよくても試してみようという気さえ起こらないだろう。
EAのパラメータを見ると、種類があまりにも多くて、どう使っていいのか分からないものもあるが、分からなくて結構。
使わないのが無難である。