【FX自動売買開発ログ #17】2つのフィルターを組み合わせたら、絞り込みすぎ問題がより鮮明になった話
前回のおさらい
前回、MTF理論(theory_mtf.py)の拒否権が、これまで試した中で一番一貫した効果(勝率6/6・DD6/6が改善)を示しました。regime_filterも個別には効果が確認できていたので、今回はこの2つを組み合わせて使ったらどうなるかを検証します。
組み合わせる前に、まず「重なり」を確認する
いきなり組み合わせる前に、確認しておきたいことがありました。regime_filterとmtf_theory、この2つが同じトレードを除外しているのか、それとも別々のトレードを除外しているのか、という点です。
もし除外しているトレードの重なりが大きければ、組み合わせても上乗せ効果は限定的かもしれません。逆に重なりが小さければ、それぞれ独立した価値のある除外を両方効かせられる可能性があります。判定結果はどちらもキャッシュ済みなので、これも新規API呼び出しは0回で確認できます。
最初の集計には、トリガーの再評価ごとにカウントしてしまい、実際の新規エントリー回数と一致しないという計算方法のミスがありました。修正して再集計した結果がこちらです。
| 設定 | 新規エントリー試行数 | regimeのみ除外 | mtfのみ除外 | 両方で除外 | 重複率 |
|---|---|---|---|---|---|
| (1,≥50) | 78 | 16 | 20 | 12 | 25.0% |
| (1,≥60) | 79 | 16 | 18 | 10 | 22.7% |
| (2,≥50) | 75 | 15 | 19 | 11 | 24.4% |
| (2,≥60) | 74 | 15 | 16 | 10 | 24.4% |
重なりは比較的小さく、約75〜77%は「どちらか一方だけ」が除外していました。4設定全てで重複率が22.7〜25.0%とほぼ一定だったのも印象的です。regime_filter(レンジ/トレンド判定+クロスアセット)とmtf_theory(上位足4hとの方向整合性)は、かなり異なる基準でエントリーを弾いていることが分かります。
- regimeのみ除外(15〜16件):クロスアセット矛盾やレンジ判定など、1時間足自体のトレンドの「質」に関する問題
- mtfのみ除外(16〜20件):1時間足の方向は明確だが、4時間足という上位足の大きな流れとは逆行しているケース
- 両方(10〜12件):両方の観点から問題があった、最も疑わしいケース

重複が低いことから、組み合わせることで単純な足し算以上ではないにせよ、それぞれ独立した価値のある除外を両方効かせられる可能性が高い、という見立てで組み合わせ検証に進みました。
組み合わせた結果:トレードオフがさらに強まった
baseline(フィルターなし)・regimeのみ・mtfのみ・両方、の4パターンで比較しました。
| 設定 | variant | 収益% | 勝率% | DD% | n |
|---|---|---|---|---|---|
| (1,≥50) | フィルターなし | 5.29 | 35.53 | -6.61 | 76 |
| regimeのみ | 3.93 | 43.84 | -5.71 | 73 | |
| mtfのみ | 4.27 | 42.37 | -4.41 | 59 | |
| 両方 | 3.35 | 50.00 | -3.71 | 58 | |
| (2,≥50) | フィルターなし | 4.32 | 34.25 | -5.97 | 73 |
| regimeのみ | 3.88 | 41.18 | -5.47 | 68 | |
| mtfのみ | 5.23 | 42.86 | -3.75 | 56 | |
| 両方 | 3.81 | 50.00 | -3.46 | 54 |
勝率・DDは4設定全てで「両方」が最も良く、勝率は2設定で50.00%に到達、DDも全設定で最小になりました。一方で収益率は、概ね「両方」が最も低くなっています。「トレード数を絞り込むほど勝率・DDは改善するが、絞り込みすぎると総収益は伸びにくい」というトレードオフが、単体のときよりも組み合わせでさらに顕著に出た形です。

トレード数がどこまで減っているか
除外が効きすぎてサンプル数が少なくなりすぎていないか、トレード数の推移も確認しました。
confidence≥50/60の4設定では、baseline 72〜77件 → 両方適用で53〜58件と、約25〜30%の減少にとどまっています。事前に確認した重なりの小ささ通り、mtf単体(56〜60件)からさらに大きく減ることはなく(mtf単体比で-2〜3件程度)、この規模ならまだ分析に耐えうるサンプル数だと言えそうです。
一方、confidence≥70の2設定は懸念が残ります。元々baseline n=18と少なく、mtf適用で14件まで減少(regimeはconfidence≥70では不発動のため「両方」もmtfと同じ14件)します。14件はさすがに少なすぎ、この設定の勝率や収益率の信頼性は低いと考えるべきです。

ここまでの一連のフィルター検証を振り返ると、機械的な単純閾値(ADX、時間帯)はどれも「該当件数が足りずに測定不能」という壁にぶつかった一方、LLMによる総合判定(regime_filter、mtf_theory)は一貫して意味のある効果を出せています。ただし、絞り込むほど勝率とドローダウンは改善するが、その分トレード数と総収益が犠牲になる、というトレードオフからは逃れられていません。
次回予告
この結果をCLAUDE.mdに記録するかどうか、また、いまだ検証していない「事後分析コーチ」機能(confidenceと実際の損益の関係を月次でレビューする、非同期の仕組み)についても、次回以降で触れていく予定です。
※本シリーズは個人の技術検証・学習を目的とした開発記録であり、特定の投資手法や金融商品を推奨するものではありません。自動売買には元本割れのリスクがあり、掲載する内容を参考にした取引の結果について一切の責任を負いかねます。投資判断はご自身の責任で行ってください。

