【FX自動売買開発ログ #13】regime_filterを実戦投入したら、ADXフィルターとは違う結果が出た話
前回のおさらい
前回、プロンプトの棚卸しをしていたら、window=20という設定が実は一度も反映されておらず、常に30本のデータが渡っていたというバグが見つかりました。理論の統合案は見送り、まずこのバグ修正を優先することに決めています。
今回は少し時系列が前後しますが、#7で設計だけ決めていたregime_filter(相場環境をAIに判定させ、レンジ相場ならエントリーを見送る拒否権方式)を、実際に210回分のAPI呼び出しで動かした結果です。
reasoningの説得力を確認する
まず、210件の判定結果からいくつかサンプルを取り出し、reasoningの中身を確認しました。レンジ相場と判定した日、明確なトレンドと判定した日、それぞれの理由づけに具体性があるかを見るためです。
結果は良好でした。レンジ判定は「ADX低下+ATR縮小+SMA乖離ほぼゼロ」、トレンド判定は「高値安値切り上げ+ADX上昇+ATR拡大+SMA乖離大」と、こちらが指示した判定材料を具体的な数値でちゃんと参照した上で判断していることが確認できました。それらしい理由をでっち上げているのではなく、渡した数字に基づいて判定している様子がreasoningからうかがえます。

拒否権の効果:ADXフィルターとは違う結果
続けて、regime_filterの拒否権あり/なしでバックテストを比較しました。
| 指標 | 拒否権なし | 拒否権あり | 変化 |
|---|---|---|---|
| 収益率% | +4.32 | +2.97 | 悪化(-1.35pt) |
| 勝率% | 34.25 | 40.00 | 改善(+5.75pt) |
| 最大DD% | -5.97 | -4.29 | 改善(縮小) |
| トレード数 | 73 | 65 | -8件 |
| 期待値(円) | 0.09 | 0.05 | 悪化 |
#6のADX<20フィルターのときは、収益率・勝率・DDのすべてが悪化するという結果でしたが、今回は明確に違います。勝率とDDは改善している一方、収益率と期待値は悪化している、という典型的な「トレードオフ」のパターンです。
これは、regime_filterがレンジ相場と判定した8トレード分をスキップしたことで、勝率は上がりリスクは減ったものの、その中に含まれていたであろう大きな勝ちトレードも一部除外してしまい、トータルの収益は下がった、と解釈できます。ADX単純閾値のときと違い、除外されたトレード数(8件)が意味のある規模で、かつ結果が一貫した方向(勝率↑・DD↓・リターン↓)に動いている点で、より信頼できるシグナルに見えます。
リスク調整後の数字(収益率÷DDの絶対値)で見ると、拒否権なしが0.72、拒否権ありが0.69とほぼ同水準でした。「収益の最大化」を優先するなら拒否権なし、「ドローダウンの抑制・安定運用」を優先するなら拒否権あり、という目的次第の判断になりそうです。

パラメータを変えても、傾向は一貫するか
min_agree・confidence_thresholdの組み合わせを他にも6通り試して、同じ「勝率↑・DD↓・収益率↓」という傾向が一貫して見られるかを確認しました。判定結果はキャッシュ済みのため、これも新規API呼び出しは0回です。
| 設定 | 収益%(なし→あり) | 勝率%(なし→あり) | DD%(なし→あり) |
|---|---|---|---|
| (1,≥50) | 5.29→3.15 | 35.53→38.46 | -6.61→-4.29 |
| (1,≥60) | 1.72→2.64 | 35.06→37.10 | -5.68→-4.36 |
| (1,≥70) | 1.52→1.52(不変) | 38.89→38.89(不変) | -2.07→-2.07(不変) |
| (2,≥50) | 4.32→2.97 | 34.25→40.00 | -5.97→-4.29 |
| (2,≥60) | 2.95→2.47 | 34.72→38.71 | -5.45→-4.38 |
| (2,≥70) | 1.52→1.52(不変) | 38.89→38.89(不変) | -2.07→-2.07(不変) |
「勝率↑・DD↓」は、効果が発生した4通り全てで完全に一貫していました。残る2通り(confidence≥70)は拒否権が一度も発動せず、完全に無変化でした。これは、confidence≥70という高い閾値で選ばれるトレード群には、そもそもregime_filterが「レンジ」と判定するケースが含まれていなかったことを意味します。
収益率については一貫していませんでした。(1,≥50)、(2,≥50)、(2,≥60)では収益率が悪化する一方、(1,≥60)だけは勝率・DD・収益率のすべてが同時に改善するという、いわば「純粋な勝ち」でした。
総括すると、「勝率↑・DD↓」は非常に一貫した効果として確認できた一方、「収益率↓」は普遍的ではなく、confidence≥70では拒否権が一切機能していません。低〜中程度のconfidence閾値(50〜60)でのみ意味を持つフィルターだと言えそうです。中でも(min_agree=1, confidence≥60)は3指標すべてが同時に改善する、最もバランスの良い設定として浮かび上がりました。

この結果をCLAUDE.mdに記録し、regime_filter拒否権方式は総合的に採用する価値がありそうだという評価で今回は区切ります。
次回予告
次回は、regime_filterにクロスアセット情報(ドルインデックスや米国債利回りなど)を追加したv2を試し、v1との違いを比較します。
※本シリーズは個人の技術検証・学習を目的とした開発記録であり、特定の投資手法や金融商品を推奨するものではありません。自動売買には元本割れのリスクがあり、掲載する内容を参考にした取引の結果について一切の責任を負いかねます。投資判断はご自身の責任で行ってください。

