バックテストの精度 Part2
バックテストの精度に関して、リアルトレードとバックテストのエントリーと決済の時間を突き合わせて分析記事を書いたことがあります。
今回は、ネガティブスリッページについて調べていたところ、たまたま前回の続きになるようなデータが得られたので紹介します。
前回の記事はこちら
エントリーの再現性
ここで言うエントリーの再現性とは、どんな環境でも同じ場所でエントリーするという意味で使わせて頂きます。
リアルトレードでもバックテストでも他ブローカーでも、微妙なズレはあったにせよ同じ場所でエントリーするロジックでなければ有効な統計は取れません。
前回の記事にあるように、ロジックによってはリアルトレードとバックテストの比較でエントリーだけでも30%近くの別のトレードがあるのが分かりました。
その辺りを少し補足してから本題に入ります。
エントリーの再現性が低くなりやすいロジック
例えば、ボリバン2σで逆張りエントリーというようなロジックの場合を見てみましょう。
※ボリバン2σ逆張りの精度が低いという事を言っているわけではありません。
下の図で、AやBの場面がロングエントリーの箇所になると思います。
AでのエントリーとBでのエントリーでは期待値が違いますよね。
2σを実体が超えて確定、をロジックとした場合、この図のAは超えていないように見えます。
ただ、判定の瞬間は数値的に超えているなんてこともあります。
また、この図は超えていなくてもバックテストや他ブローカーでは超えている場合もあります。
つまり、このような場面ではリアルトレードとバックテストと他ブローカーで、Aで入ったりBで入ったりする違いが出る可能性があるわけです。
リアルトレードだけに絞ってみても、Aの時もあればBの時もあるというのは統計的に怪しいとも思います。
エントリーの再現性が高いロジック
例えば、前日高値安値をブレイクでエントリーするロジックを見てみましょう。
下の図で、水色の線が前日高値のライン。
○の中のブレイクしたところでエントリーです。
これだと、リアルトレードでもバックテストでも他ブローカーでも同じ場所でのエントリーになりますよね?
微妙にタッチしただけのような場合は配信レートの違いで入ったり入らなかったりする事もあるでしょうが、稀でしょうね。
前回の分析でもサンプルは少ないですが96%の一致となっています。
まぁ、これが勝てるという話ではありませんよ。
エントリーの再現性がないと正しく統計が取れないので、その為の補足です。
エントリーの再現性が高い状態で、価格の乖離がどのようになっているか?が本題です。
では、本題に入りましょう。
分析に使用したデータについて
今回は、自作のブレイクアウト系ロジックのEAについて調べています。
リアルトレードでネガティブスリッページが多いと感じ、どんな感じになっているか調べてようと思ったのが始まりです。
ロジックは、指定の時間になったら日足の高値安値(過去3日分)に逆指値の予約注文を入れる形です。
前日高値にタッチしたらロングエントリー、安値にタッチしたらショートエントリーです。
それを逆指値を置く形で行います。
決済は、SLTPとトレーリングストップになります。
ユーロドルの2022年2月8日~4月21日までのトレードで、サンプル数は少ないですが偏った傾向が見られるので参考にはなると思います。
リアルトレードはFXTFの口座で、スプレッドはほぼ変動はなく0.2pipsです。
バックテストはFXTFのMT4でTDS(デューカスコピーのヒストリカルデータ)で0.7pips固定で行っています。
エントリーの再現性は41/46で89.1%となっています。
スリッページの比較
逆指値で指定した価格とエントリーした時の約定価格の差をみます。
売り買いを考慮して、有利にズレた分を+、不利にズレた分を-として算出しています。
以下のような感じです(一部抜粋)
全データのスリッページ発生率は以下の様になりました。
現実問題として、ネガティブスリッページはあってもポジティブスリッページはあまりありません。
しかも、逆指値はネガティブに滑りやすいものです。
そう考えると、サンプル数は少なくてもバックテストの様子がおかしいと言えると思います。
そして、売り買い別に見ると更に特徴がある事が分かりました。
リアルトレードは売り買いで差異はありませんでしたが、バックテストは以下の様になりました。
まぁこの辺りはサンプル数の少なさ故かも知れませんが…
売りと買いで差が出るのは、ヒストリカルデータがBidの値だからなんじゃないかと思ったりしています。
価格差について
上の5回分のデータでも分かるように、まず逆指値の価格からズレが生じています。
これは、日足の高値安値に逆指値を置くシステムなので、FXTFのレートとデューカスコピーのレートの差でしょう。
そして、上記のようにスリッページの様子に違いがあるのでエントリーの約定価格に違いが出ます。
問題は、その頻度と量ですよね。
ここでも、売りと買いに違いが見られました。
頻度的には、リアルトレードとバックテストでエントリーの約定価格が一致したのは46回中3回だけでした。
だいたいはズレると考えて良いでしょう。
買いは22回中19回がバックテストの方が有利になるズレ方で、バックテストの方が平均0.7pips有利でした。
売りは24回中14回がバックテストの方が有利になるズレ方で、リアルトレードの方が平均0.2pips有利でした。
まぁ、決済の部分でもズレが生じるので、最終的にはもっと差が出る可能性がありますね。
ただ、個々の勝敗や収支の大小にはある程度の相関がみられるようです。
その辺りを全体の成績を比較しながら見ていきます。
全体データの比較
青がリアルトレード、オレンジがバックテストの収支グラフです。
雰囲気は再現されている感じでしょうか。
ただ、成績の各数値は信頼が低いものもありますね。
バックテストで設定したスプレッドが低い可能性もあるので、純益やPFが同じくらいになるように変更してみます。
バックテストのスプレッドを1.1にする
リアルの成績と近くなるように探ったところ、1.1pipsでだいたい同じになりました。
かなりリアルの成績に近い感じになりました。
じゃあバックテストのスプレッドを1.1pipsにすれば…
と思ったら、驚きの事実が判明です。
とりあえず、収支のグラフを見てみましょう。
青がリアルトレード、オレンジが0.7のバックテスト、グレーが1.1のバックテストです。
何がおかしいか分かりますか?
バックテストのスプレッドを変更したにも関わらず、後半までオレンジとグレーはほぼ同じ動きをしています。
そして、ある1トレードを境にリアルの成績に合流して辻褄を合わせるように同じくらいのところで終わっています。
僕のイメージでは、バックテストのスプレッドを上げると、上げた分が個々のトレードに反映されると思っていました。
なので、オレンジの形を保ちつつ青に近づいていき、成績の数値がだいたい同じならば青とグレーが重なるような感じになるだろうと…
実際にはそうなっていません。
そこで、0.7と1.1の46回分の各トレードを比較してみました。
すると…
買いポジはエントリーから決済まで完全に同じ状態で、売りの半数ちょいだけ変わっている事が分かりました。
スプレッドの変更をしても全てのポジションに影響するわけでは無く、30%弱のポジションにしか影響していないのです。
さらに、1つだけ極端に変化したことにより最終的な成績データの辻褄があっているだけの状態でした。
ちょっと言葉だけでは分かりにくいので表を出しますね。
0.7pipsと1.1pipsのバックテストの比較です。
緑色の部分のような変化が全てのポジで見られると思ったのですが…
黄色の部分が1個だけ極端に変化した状態で、この部分でグレーがオレンジから青にシフトしています。
このポジションだけ抜き出して比較してみます。
上からリアルトレード、0.7pipsバックテスト、1.1pipsバックテストです。
相関が高いのは0.7の方ですよね。
まとめ
誤解のないように先に述べますが、今回はリアルトレードよりもバックテストが良くなる結果になりましたが、逆の事もあります。
ただ、いずれにしてもバックテストの数値に収束すると考えない方が良さそうだという思いは強くなりました。
バックテストで見られた傾向がリアルでも続く事は大いにあり得ると思いますが、数値はあてにしない方が良さそうです。
では、まとめです。
バックテストの仕様?挙動?でいくつか思っていたのと違う事が分かりました。
それが、このロジックだからなのかいつもなのかはもう少し調べないと分かりません。
今回はサンプル数が少ないのでたまたま偏っている事もあり得ますが…そうかな?
売り買いで傾向が違う点、BTのスプレッドを変えた時の変化、などは思っていた事と違っていたのでもう少し調べる必要がありますかね。
この結果だけ見た現時点では、「スプレッドを厳しくして試しました」なんていうのは全く意味が無い状態ですよね。
バックテストはロジック開発の拠り所でもあるので、その挙動や傾向を把握する必要があると再確認した分析になりました。
今回のロジック特有の結果なのかも気になるところです。
まぁ、一つ言える事はリアルフォワードのデータが無いとEAの評価はできないって事ですね。
長くなりましたが、最後までご覧いただきありがとうございます。
続きでもう少し分析しました。
こちらもどうぞ。
自作EAの合計収支