コンテンツにスキップ

【検証#20】勝率53%でPF0.09は成立しない ― バックテストの手数料が100倍で、EA121本が4ヶ月間ずっと不合格だった

勝率53%とPF0.09 ― ありえない数字と、引かれ続けた手数料

この記事の4行まとめ

  • AIに量産させたEAが 4ヶ月間で121本、合格ゼロ。それでもタスクは毎日正常終了し、警告は一つも鳴っていませんでした。
  • 成績を集計すると 勝率の中央値52.7%・PFの中央値0.09。この組み合わせは数学的に成立しません。平均利益が平均損失の27分の1でないと辻褄が合わず、しかも戦略の系統に関係なく25本中22本が同じ形でした。
  • 約定明細を全部足すと トレード損益 +14.34ドル / 手数料 -9,230.40ドル / 純損益 -9,216.06ドル。戦略はほぼトントンで、口座を溶かしていたのは手数料でした。1ロットあたり720ドル、実勢の約100倍です。
  • 正しい口座で54本を測り直しました。合格は0本のままです。変わったのは「不合格が何を意味するか」でした。

何が起きていたか

AIにEAを作らせて検証し、結果をこのサイトに載せるラインを毎晩回しています。

このラインはずっと緑でした。タスクは毎日正常終了し、コンパイルは通り、バックテストも走り、記事も月8本ペースで出ていました。監視上、異常はありません。

ある日、中を開けて気づきました。最後に合格したEAは4ヶ月前でした。以降121本作って、合格ゼロです。

引っかかったのは、負け方だった

EAの自動生成で不合格が並ぶのは想定内です。おかしかったのは負け方でした。

直近43本の成績を集計します。

指標 中央値
勝率 52.7%
プロフィットファクター(PF) 0.09

PFは「総利益 ÷ 総損失」です。0.09なら勝ちの11倍を負けで吐き出しています。ところが勝率は5割を超えている。

この2つは同時に成立しません。

逆算すると、平均利益 ÷ 平均損失 が 0.037、つまり1回の負けが1回の勝ちの27倍でないと辻褄が合いません。

さらに不自然だったのは、これが揃っていたことです。

戦略系統 該当本数
スキャルピング / レンジ / トレンド追随 / イベント反応 / メタ 25本中 22本 が同じ形

戦略の質が原因なら、系統をまたいでここまで揃いません。

約定明細を全部足した

バックテストのレポートには約定が1件ずつ記録されています。あるEAの11トレード(22約定)を全部足しました。

項目 金額(USD)
トレード損益の合計 +14.34
手数料の合計 -9,230.40
スワップ 0.00
純損益 -9,216.06

初期資金10,000ドルが783.94ドル。92.16%の消失です。

しかしトレードそのものは +14.34ドル、ほぼ収支トントンでした。

実際の約定を並べると構造がはっきりします。

時刻 区分 数量 手数料 損益 残高
04-17 17:00 新規 2.36 -1,699.20 0.00 8,300.80
04-17 17:12 決済 2.36 0.00 -107.10 8,193.70
04-24 18:00 新規 1.82 -1,310.40 0.00 6,883.30
04-24 22:00 決済 1.82 0.00 +253.03 7,136.33

勝ちトレード(+253.03)でも、直前に1,310.40の手数料を払っているので残高は減ります。 損切りは -107.10 と、設計どおり残高の約1%に収まっていました。壊れていたのは損切りではありません。

手数料は一律 1ロットあたり720ドル。実勢は往復3〜7ドル程度なので、約100倍です。

いつから壊れていたか

バックテストのレポートを全件さかのぼり、手数料を1件ずつ測りました。

日付 手数料/ロット
〜 6月18日 0.00
6月19日 〜 7月05日 (検証環境が停止。1本も走っていない)
7月06日 〜 -720.00
9月08日 修正

銘柄別に見ると、口座単位の設定であることも分かります。

銘柄 手数料/ロット
FX全ペア(USDCAD / EURUSD / GBPUSD / AUDUSD / USDJPY / EURJPY / GBPJPY) -720.0
XAUUSD -72.0
BTCUSD 0.0

原因は単純でした。6月下旬に、本番端末を巻き込まないためバックテスト専用の環境を別に立てました。その際、それまでと違う口座でログインしていたのです。

口座にはスプレッドのみの種別と、手数料が別途かかる種別があります。新しく使い始めたのは後者で、しかも想定と桁が違いました。隔離という判断は正しく、ログイン先の確認をしていなかっただけです。

測り直した結果

正しい口座で54本、延べ200回以上のバックテストを流し直しました。

代表例です。

指標 汚染下 測り直し後
損益 -98.79% +7.31%
PF 0.06 1.58
最大ドローダウン 98.79% 6.16%
シャープレシオ -5.00 7.39

分布そのものが変わりました。

Text Only
汚染下: PF 0.02〜0.2 に全EAが押し込まれる
         → 手数料が原因。戦略について何も分からない

修正後: PF 0.18〜1.91 に散らばる
         → サンプル不足、特定期間での崩壊
         → 戦略の話になった

誤解のないように:合格は0本です

「埋もれていた勝てるEAが見つかった」という話ではありません。

  • 測り直した 54本のうち合格は0本
  • 「及第点」に届いたのは 2本(PF1.58 / 19取引、PF1.05 / 26取引)
  • 最も中身があったのは24ヶ月のウォークフォワード検証で 4区間中3区間が黒字・PF1.34。それでも1区間で崩れ、全区間をまとめた信頼区間は1.0を割るため不合格

変わったのは合格数ではなく、不合格が何を意味するかでした。答えられない問いに間違った答えが4ヶ月ぶん記録されていた、それを答えられる問いに戻した。それが今回やったことの全部です。

副作用:サイトの「惜敗」18本が消えた

このサイトではEAを6段階で格付けしています。その中の「惜敗」は、取引数は十分なのに過学習のシグネチャで崩れたEAに付きます。カーブフィッティングの見本として読み物価値が高い枠です。

汚染期間の「惜敗」は18本でした。調べると、18本ちょうどが同じ判定マーカーを持っていました。

このマーカーは「ブートストラップ法で推定したPFの95%信頼区間の下限が1.0を割った」ときに付きます。全トレードから均等に720ドルを引けば、どんな戦略でもこの区間は必ず崩れます。

つまり「惜しくも過学習で散った味わい深いEA」という物語は、手数料が量産していたものでした。正直な数字に直したところ、それらは「検証成立せず」に落ちています。より正確で、より地味な表示です。

再発防止に入れた検査が、動いていなかった

「手数料が損益の半分を超えたら、戦略の不合格ではなく計測不能として扱う」という検査を追加しました。同じことが起きても静かに4ヶ月進むことはない、はずでした。

数日後に確認したところ、動いていませんでした。

検証を回しているプログラムは7月末から一度も再起動されずに走り続けていました。プログラムは起動時にコードを読み込みます。つまりそのプロセスは修正前のコードをメモリに抱えたまま動いており、新しい検査は「判定材料が見つからない」として黙って素通りしていたのです。

さらに、この確認自体でも一度誤りました。「手数料が残っている結果は0件」と判定したのですが、実際は手数料の欄が空だったものを0として数えていただけでした。欠損と正常を区別しないコードによる典型的な偽陰性です。

安全装置は壊れても何も言いません。「入れた」と「効いている」は別のことでした。

対処として、検証プログラムを再起動したうえで、15分ごとに死活を確認して自動復帰する仕組みを入れました。停止させて復帰することも、二重起動しないことも実測で確認しています。

教訓

範囲の切り方でも一度失敗しています。再検査の対象を「EAの作成日」で絞ったところ、前日に作られて翌日に検証されたEAが漏れました。正しくは「バックテストを実行した日」です。数え直すと11本あり、そのうち1本は測り直すとPF 0.31 → 1.34、取引数19 → 52。今回で最も中身のある結果でした。

毎日緑だったのは嘘ではありません。工程はすべて正常でした。測っている値だけが意味を失っていたのです。

「動いているか」を監視する仕組みは持っていました。「出てきた数字に意味があるか」を疑う仕組みは持っていませんでした。

勝率53%でPF0.09。この数字は4ヶ月間ずっと表示され続けていました。誰かが一度でも足し算をしていれば、その日に気づけたはずです。

異常は警告としてではなく、ありえない数字として現れていました。

— SPONSORED —