【FX自動売買開発ログ #10】トリガー方式で598回分回してみたら、意外な一致が見つかった話
前回のおさらい
前回、stride方式(N本ごとに機械的に再評価する方式)から、実際のトリガー方式(条件成立時のみAI判定を起動する方式)への切り替えを進めました。SMAクロス×ブレイクアウト(参照本数N=60)のOR条件、クールダウン6本という設定で、想定600回・約$3.33という見積もりまで固めたところで前回は区切りました。
今回は、実際にこの設定でバックテストを走らせた結果です。
598回で完了
実行は1回で終わらず、途中で一度中断が入ったため、1回目386回+2回目212回=合計598回という内訳になりました。見積もりの600回とほぼ一致しています。バックグラウンドでキャッシュを使いながら再開できる設計にしておいたおかげで、中断があっても最初からやり直す必要がなかったのは助かりました。
baseline vs AIアンサンブル
| 設定 | train収益% | train勝率% | train DD% | test収益% | test勝率% | test DD% |
|---|---|---|---|---|---|---|
| baseline_sma_cross | +2.35 | 41.18 | -5.24 | -1.44 | 37.33 | -11.39 |
| ai(1,≥50) | +2.20 | 42.86 | -4.67 | -2.06 | 35.19 | -11.58 |
| ai(1,≥60) | +2.71 | 42.59 | -4.22 | -3.09 | 33.96 | -11.33 |
| ai(1,≥70) | -0.24 | 46.15 | -2.52 | -0.09 | 45.45 | -4.12 |
| ai(2,≥50) | +0.66 | 42.31 | -5.07 | -0.01 | 36.73 | -9.17 |
| ai(2,≥60) | +0.25 | 42.31 | -5.07 | -1.54 | 36.17 | -9.40 |
| ai(2,≥70) | -0.24 | 46.15 | -2.52 | -0.09 | 45.45 | -4.12 |
baselineとai(1,50/60)、ai(2,50/60)は「trainプラス→testマイナス」という、これまでも何度か見た過学習パターンに該当しました。一方でconfidence≥70の2設定だけはこのパターンに該当せず、ドローダウンも他設定の半分以下に抑えられています。
ここでふと目を引いたのが、ai(1,≥70)とai(2,≥70)の数字が全項目で完全に一致していたことです。

min_agree=1と2が、なぜか同じ結果になる
min_agree=1(理論1つでもconfidence条件を満たせばエントリー)とmin_agree=2(2理論とも一致が必要)で、confidence≥70のときだけ結果が完全に同じになる。これは偶然というより、何か構造的な理由がありそうだと考えて掘り下げてもらいました。
見えてきた説明はこうです。confidence≥70という高い閾値では、「1理論だけが強い確信度を持つ」ケースがほぼ存在しない。つまりこのデータでは、confidence≥70の壁を超えられるのは「2理論とも高い確信度で一致しているケース」しかなく、結果としてmin_agree=1の条件を満たすトレードと、min_agree=2の条件を満たすトレードが、実質的に同じ集合になっていた、ということです。
言われてみれば筋が通っています。min_agree=2の効果が、confidence閾値70によって事実上代替されている状態だったわけです。パラメータを2つ別々に用意したつもりが、高いconfidence帯では実質1つのパラメータしか効いていなかった、というのは地味に面白い発見でした。
トレード数と保有期間
| 設定 | train_n | test_n |
|---|---|---|
| baseline_sma_cross | 68 | 75 |
| ai(1,≥50) | 56 | 54 |
| ai(1,≥60) | 54 | 53 |
| ai(1,≥70) | 13 | 11 |
| ai(2,≥50) | 52 | 49 |
| ai(2,≥60) | 52 | 47 |
| ai(2,≥70) | 13 | 11 |
これまでのstride方式(train/testそれぞれ2〜11件)と比べると、baselineやconfidence≥50/60の設定はtrain50件台・test50件前後と、サンプル数がだいぶ改善しました。トリガー方式に切り替えた本来の狙い(意味のあるサンプル数を確保する)は、この点では達成できていそうです。

一方でconfidence≥70の2設定は、trainもtestも13〜11件とやはり少なめです。ai(2,≥70)がドローダウンを大きく抑えつつ収益率もほぼゼロ近辺という、他設定より安定した結果に見えるのは事実ですが、この件数では統計的な結論を出すにはまだ足りない、という慎重な評価も添えられていました。
平均保有時間は、baselineが63.9時間(train)・58.6時間(test)前後なのに対し、confidence≥50/60のAIアンサンブルは73〜76時間とやや長め、confidence≥70は41.3時間(train)・64.8時間(test)とばらつきがありました。
トリガーのうち、実際にエントリーに至ったのはどれくらいか
トリガー自体の発生数(train 155件・test 144件)のうち、実際にエントリーまで至った件数も確認しました。
confidence≥70では、トリガー155/144件のうちエントリーに至ったのはわずか25/23件(約16%)。残りはトリガーは発生したものの、AIの確信度が閾値に届かず見送られたことになります。一方confidence≥50/60ではトリガーの4割強がエントリーに至っており、閾値の高さによって「見送り率」が大きく変わることが数字としてはっきり見えました。

次回予告
次回は、この中でも一番安定して見えたai(2,≥70)設定について、勝ちトレードと負けトレードの中身(平均リターン、平均保有時間)をさらに掘り下げます。あわせて、トリガー方式にはまだ組み込んでいなかったATR損切りの実装にも進みます。
※本シリーズは個人の技術検証・学習を目的とした開発記録であり、特定の投資手法や金融商品を推奨するものではありません。自動売買には元本割れのリスクがあり、掲載する内容を参考にした取引の結果について一切の責任を負いかねます。投資判断はご自身の責任で行ってください。

