【FX自動売買開発ログ #6】ADX<20フィルターを試したら、仮説と逆の結果が出た話
前回までのおさらい
前回(#5)は、4時間足への切り替えを検討する前に、まずコスト0円で直せる「反転まで無制限保有」問題(損切りの未実装)を優先することに決めました。そこから、window(判定間隔)パラメータのバグ修正、スプレッドの考慮、walk-forward検証、成績カレンダーの可視化など、STEP Aの各種改善を積み重ねてきました。この間の詳細はまた別の回でまとめる予定ですが、walk-forward検証の中で「2026年3月以降、成績が落ちる不調期がある」ことが見えてきており、その不調期はADX(トレンド強度を示す指標)が平均的に低い、という傾向が分かってきていました。
今回はその流れを受けて、「ADXが低い(トレンドが弱い)ときはエントリーを見送る」というフィルターを試した記録です。
CLAUDE.mdを先に整備しておく
作業に入る前に、これまでの修正内容をCLAUDE.md(Claude Codeに常に読ませておくプロジェクトメモ)に反映してもらいました。都度の会話で決めたことを、次に別のセッションで作業するときも参照できる形で残しておく、という地味だけど大事な作業です。
ADX<20フィルターを実装、全期間で比較
仮説はシンプルです。「不調期はADXが低い傾向にあるなら、ADX<20のときは新規エントリーを見送れば、不調期の損失を避けられるのではないか」というものです。
fold2+3+4(不調期・好調期を含む全期間)を連結して、フィルターあり/なしで成績を比較してもらいました。API呼び出しは0回、既存のキャッシュ済みデータだけで確認できています。
| 指標 | フィルターなし | フィルターあり | 変化 |
|---|---|---|---|
| 収益率% | +4.32 | +1.92 | 悪化 |
| 勝率% | 34.25 | 31.88 | 悪化 |
| 最大DD% | -5.97 | -7.26 | 悪化(拡大) |
| トレード数 | 73 | 69 | -4件のみ |
| 損切り件数 | 34 | 31 | -3件 |
| 期待値(円) | 0.09 | 0.03 | 悪化 |
見事に、全部の指標が悪化しました。特に最大ドローダウンが縮小するどころか拡大したのは、「弱トレンド期を避ければリスクが減るはず」という当初の想定と真逆の結果です。

なぜ効かなかったのか
結果を見て終わりにせず、なぜこうなったのかを掘り下げてもらいました。見えてきたのは次の点です。
- フィルターで除外されたのはわずか4トレードだけ(73件→69件)。ADXは全バーの31〜38%で20を下回っていたにもかかわらず、実際にエントリーのトリガー(SMAクロスやブレイクアウト)が発火するタイミングでは、ADX<20に該当するケースがそもそも少なかった、ということになります。

- つまり、この戦略のトリガー自体が、ADXが低い瞬間にはあまり反応していなかった可能性が高いということです。「期間全体で見るとADXが低い」という傾向と、「個々のエントリー判断が下される瞬間のADX」は、必ずしも一致しない、という発見でした。
- 除外されたのはたった4件なので、この結果自体の統計的な信頼性も高くありません。たまたまその4件の中に、たまたま良いトレードが混じっていた可能性も否定できません。
「不調期はトレンドが弱い」という期間単位の観察は正しかったとしても、それを個々のトレードの機械的な閾値フィルターにそのまま落とし込むと機能しない、というのが今回の一番の学びです。

このフィルター案は採用を見送ることにして、検証結果(効果なしと確認済みであること、除外トレードがわずか4件だった点、統計的信頼性への留保)をCLAUDE.mdに追記してもらいました。次にこのアイデアに立ち返ったときに、また同じ検証をゼロからやり直さずに済むようにするためです。
次回予告
単純な閾値フィルターがダメだったので、次は方向性を変えます。機械的にADXの数値だけで判定するのではなく、価格推移やボラティリティ、トレンド系指標を総合的にAIに読ませて、「今はエントリーに適した相場か」を言語的に判定させる新しい理論モジュールを検討します。
※本シリーズは個人の技術検証・学習を目的とした開発記録であり、特定の投資手法や金融商品を推奨するものではありません。自動売買には元本割れのリスクがあり、掲載する内容を参考にした取引の結果について一切の責任を負いかねます。投資判断はご自身の責任で行ってください。

