バックテストで勝ったEAを、買いと売りに分けたら何が見えたか
半年で約40台のEAを作り、約200回の検定をして、残ったルールは1本だけでした。合計では勝っています。でも、合計で勝っているEAを買いと売りに分けると、だいたい次の3つのどれかが見えます。
- 片側だけが稼いでいる:ルールの力ではなく、相場全体の上げ(下げ)を測っていただけ
- 両側とも稼いでいる:ルールそのものに力がある可能性
- 「こうすればもっと良くなる」形:ただし、見つけた瞬間に罠になる
私の1本では何が見えたのか。そこにたどり着くまでの手順(何回試したかを数える、誰も見ていない期間で追試する)と合わせて、実際の数字で書きます。EAの販売や推奨ではなく、自分のEAを自分で疑うための方法論の共有です。
検証の前提
数字を読む前に、何をどう測ったかを固定します。私は検定のたびに、損益を計算する前に条件と合格ラインを文書に書き、ハッシュで鍵をかけています。
| 項目 | 条件 |
|---|---|
| ルール(K2) | 直前6日の高値/安値を終値で抜けたらその向きに入る。24時間後に手仕舞い、損切り3 ATR、利確なし |
| 対象銘柄 | BTCUSD / ETHUSD / BTCETH / ZECUSD(損益を見る前に、値幅に対するコストだけで選んだ) |
| 時間足 | 30分足(追試は4時間足) |
| 学習期間 | 〜2023年6月 |
| 検証期間 | 2023年7月〜2026年9月 |
| 追試期間(誰も見ていない期間) | 2017年5月〜2020年6月(実際の取引は2018年3月から) |
| データ | 自分のMT5口座の足データ |
| コスト | 今の往復スプレッドを価格比例で当てる+スワップを毎晩(週末も)支払い側だけ計上 |
| 単位 | R(1回の損切り幅を1とする) |
ポイントは2つです。コストは「後から引く」のではなく、探す段階から引いておくこと。そして追試に使う期間は、ルールが確定するまで一度も開けないことです。
ステップ1:大量に試すと、勝ちは「作れてしまう」
有意水準5%で200通りのルールを検定すると、優位が1つもなくても約10本は「有意に勝っている」と判定されます。これが多重比較の罠です。
偽の勝ちの期待本数 = 検定数 × 有意水準 = 200 × 0.05 = 10本
EAの最適化でパラメータを振るのも、構造は同じです。組み合わせを増やすほど、偶然勝った組み合わせが「最適値」として浮かび上がります。
私がやっている対策は3つです。
- 同時に試す本数で基準を厳しくする:4本同時に試すなら、合格ラインは 0.05 ÷ 4 = 0.0125(Bonferroni補正)
- でたらめと比べる:売買の向きをランダムに入れ替えた対照、同じ時刻の別の日に入った対照(各4,000回)に勝てるか
- 合格ラインを4〜12個並べ、全部通らないと採用しない:件数、コスト後の平均、コストに対する余裕(コスト後の平均 ≧ スプレッド×3)、最大ドローダウンなど
K2(6日突破)は、暗号資産4本を同時に試した中の1本でした。検証期間の成績は次のとおりです。
| 項目 | 値 |
|---|---|
| 件数 | 1,208件(月約31件) |
| コスト前 平均 | +0.219R |
| コスト | 0.081R |
| コスト後 平均 | +0.124R |
| PF(95%区間) | 1.20(1.04〜1.41) |
| 向きランダム対照 | p = 0.0002 |
| 同時刻・別の日対照 | p = 0.0001 |
| 最大ドローダウン | 37.5R |
でたらめにははっきり勝っています。それでも判定は不合格でした。コスト後の平均(+0.124R)が「スプレッド×3」(0.242R)に届かず、最大ドローダウンも上限30Rを超えたからです。しかも、コストの計算方法の誤りを直したのが損益を見た後だったため、この数字自体を割り引いて読まなければなりません。だから次は、「誰も見ていない期間」で確かめました。
ステップ2:誰も見ていない期間で追試し、買いと売りに分けて崩しにいく
K2は、それまで一度も使っていない2018〜2020年のデータでも、同じ向き・同じ大きさの優位を出しました。約200の検定の中で、独立した期間の追試を通った初めてのルールです。データを取りに行く前に、合格ライン(件数100以上、コスト後プラス、PF 1超、対照2種で p < 0.05)を固定しています。
| 項目 | 追試の結果(4時間足、2018〜2020年) |
|---|---|
| 件数 | 390件 |
| コスト前 / コスト後 平均 | +0.154R / +0.125R |
| PF / 勝率 | 1.49 / 45.9% |
| 最大ドローダウン | 9.7R |
| 向きランダム対照 / 別の日対照 | p = 0.003 / p = 0.001 |
| 年別(コスト後) | 2018 +0.168R / 2019 +0.159R / 2020 +0.050R |
それでも、合計で勝っているルールは「片側だけが稼いでいる」ことがよくあります。実際、米国株で見つけた「買いだけ勝つ」ルールは、手法の力ではなく株価全体の上げを測っていただけでした。そこで追試の390件を、判定は変えずに向き別に分けました。
| 方向 | 件数 | コスト前 | コスト後 | 勝率 |
|---|---|---|---|---|
| 全体 | 390 | +0.154R | +0.125R | 45.9% |
| 買い | 203 | +0.183R | +0.153R | 46.8% |
| 売り | 187 | +0.122R | +0.096R | 44.9% |
売りもプラスでした。冒頭の「1. 片側だけ」ではありません。 BTCが大きく下げた2018年は、売り(+0.233R)が買い(+0.066R)を上回っています。「上げ相場を測っていただけ」ではありませんでした。
分解の軸は売買方向だけではありません。銘柄・年・時間帯ごとに分けると、どこで稼いでいるのかが見えます。K2の場合、ZECUSDはコスト後でほぼゼロ(−0.018R)でした。ただし、ここでZECを外すと「結果を見てから選んだ」ことになるので、銘柄は外していません。
ステップ3:見つけた形はルールに足さず、先のデータで確かめる
分解すると、必ず「こうすればもっと良くなる」形が見つかります。冒頭の「3」です。K2では、直前30日のBTCの流れと同じ向きに入った時だけが稼いでいました。
| 直前30日の流れに対して | 件数 | コスト後 平均 |
|---|---|---|
| 同じ向きに入った | 250 | +0.221R |
| 逆向きに入った | 140 | −0.046R |
ここで「順向きだけ取る」フィルタを足すと、同じデータで探して同じデータで評価することになり、ステップ1の罠に戻ります。しかもこの数字は一度、再現できませんでした。最初の集計は「同じ向き+0.190R/逆向き+0.026R」でしたが、定義を明示して計算し直すと上の表の値になり、別の素直な定義でも逆向きは−0.05〜−0.08Rでした。定義で数字が動くこと自体が、この形の不確かさを示しています。
そこで私は、今のルールは変えず、次のように扱いました。
- 定義を1つに固定し、「順向きを少し増やし、逆向きを抑える」重みづけを文書にして鍵をかける
- 元のルールはそのまま仮想売買(発注しない観察)で動かし、重みづけ版を横で計算するだけ
- 判定は1回だけ。840件か2029年9月30日の早い方で、週単位のブートストラップで片側 p < 0.05
- 途中で良く見えても採用しない
この判定の検出力を模擬すると、効果が開発データと同じ大きさでも71〜79%でした。つまり、本物だったとしても約4回に1回は「確かめられなかった」で終わります。それを先に知っておくことも、検証の一部です。
元のルール自体も、実際のお金を入れる前に「最初の仮想売買30件でPF 1.0以上」という関門を通す決まりです。先のデータは一回きりの切符です。結果を見てからルールを直したら、その期間はもう「探した期間」です。
実運用で起きたこと:65ライン中、「生きている」のは0
この手順を入れる前の2026年6月、私は稼働中のEAを全部棚卸ししました。実際の約定(コスト込みの円建て損益)を、マジック番号×銘柄の「ライン」ごとに分けて判定した結果です。
| 判定 | 基準 | ライン数 |
|---|---|---|
| 生きている | 合計プラス、PF 1.1以上、件数15以上 | 0 |
| 脆い | 合計は0以上だが上の条件未満、またはスプレッドが平均利益の25%以上を食う | 48 |
| 死んでいる | 合計マイナス | 17 |
65ライン中61ラインは件数が30未満で、そもそも勝ち負けを判断できる量がありませんでした。本数を増やすと「どれかは勝っている」ように見えますが、それはステップ1と同じ構造です。
もう1つ、勝率だけ見ていると気づけない失敗がありました。XAUUSDのあるライン(22件)では、負けトレードの平均ロット(0.032)が勝ちトレード(0.01)の約3.2倍でした。いくら方向が当たっていても、負ける時だけ大きく張っていれば残りません。
この棚卸しから、新しいルールは「損益を見る前に条件を固定する」「コストに対する余裕を合格ラインに入れる」「実弾の前に仮想売買30件を通す」という運用に切り替えました。
自分のEAに使える検証チェックリスト
購入を検討しているEAにも、自作EAにもそのまま使えます。
- □ 試したルール・パラメータの総数を記録しているか(採用しなかったものも含む)
- □ スプレッド・手数料・スリッページを探索段階から差し引いているか
- □ コスト後の平均がスプレッドの数倍あるか(私の合格ラインは3倍)
- □ トレード数は判断に足りるか(少ないラインは「保留」扱い)
- □ 買い・売り、時間帯、年ごとに分けても利益が偏っていないか
- □ 負けトレードのロットが勝ちより大きくなっていないか
- □ 分解で見つけた形を、その場でルールに足していないか
- □ ルール確定後に初めて開ける期間(OOS)を残してあるか
まとめ:分けたら見えたのは「2」と「3」
冒頭の問いに答えます。私の1本を買いと売りに分けて見えたのは、2と3でした。
| 冒頭の3つ | 見えたか | 中身(コスト後) |
|---|---|---|
| 1. 片側だけが稼いでいる | 見えなかった | 売りも +0.096R。下げ相場の2018年は売りの方が稼いだ |
| 2. 両側とも稼いでいる | 見えた | 買い +0.153R / 売り +0.096R |
| 3. もっと良くなる形 | 見えた | 30日の流れと同じ向き +0.221R / 逆向き −0.046R |
2は安心材料でした。「上げ相場を測っていただけ」という一番こわい可能性が消えたからです。
3は、見つけた瞬間にルールへ足したくなる罠でした。足せば過去の成績は確実に良くなります。だからこそ足さず、最長で2029年までかかる前向きの観察に回しました。
分けて見えたものは「答え」ではなく「次に確かめる仮説」です。 あなたのEAも、合計で勝っているなら一度買いと売りに分けてみてください。そこに見えるのが1なら要注意、3なら、足す前に一度立ち止まる合図です。
免責:本記事は検証方法の紹介であり、特定のEA・銘柄・売買の推奨を目的とするものではありません。過去の検証結果は将来の成果を保証しません。投資判断はご自身の責任で行ってください。