📝 コラム #バックテスト #カーブフィッティング #MQL4 #EA運用 #リスク管理

バックテストで勝てるEAがリアルで負ける5つの理由

(更新: 2026年1月26日) 読了 約10分

「バックテストでプロフィットファクター2.0超え!これは絶対勝てる!」

そう思ってリアル口座(またはデモ口座)で動かしたら、全然勝てない。

AIでEAを作った人のほぼ全員が、一度はこれを経験します。 これは意志力の問題でも、EAが壊れているわけでもありません。バックテストとリアルの間には構造的な乖離があり、原因は大きく5つに分類できます。

原因を知って対策を取れば、「バックテストほど負けない」状態に近づけることができます。


バックテスト優秀なのにリアルで負ける、5つの原因


原因1:過剰最適化(カーブフィッティング)

何が起きているか

RSIの期間を14ではなく17にした方が成績が良い、移動平均線を20本から23本にすると最大DDが下がる……。

このようにパラメータを微調整して「過去データへの当てはまりを最大化」した状態を**過剰最適化(カーブフィッティング)**と呼びます。

過去には完璧にフィットしているけれど、未来の相場には対応できないEAが出来上がります。

[画像:過剰最適化されたEAの損益曲線イメージ。バックテスト期間は右肩上がりだが、フォワード期間に入った途端に下落するグラフ]

AIで作る時に起きやすい理由

「パラメータを最適化して成績の良いEAを作って」とAIに指示すると、AIは過去データに最適なパラメータを選んでしまいます。これは過剰最適化そのものです。

対策

  • パラメータはシンプルに保つ。RSI期間はキリのいい数字(14、20、30)を使う
  • **バックテスト期間の20〜30%をフォワードテスト期間として「見ない」**ようにしておく
    • 例:2020〜2025年のデータがある場合、2020〜2023年でバックテスト→2024〜2025年で検証
  • AIへの指示:「パラメータを最適化しないでください。デフォルト値(RSI=14等)でシンプルに実装してください」

⚠️ WARNING 「最適化」「最良のパラメータを探して」などの指示はAIに渡さないでください。AIは過去データへの過剰最適化を行う傾向があります。


原因2:スプレッド・スリッページの影響

何が起きているか

MT4のバックテスターはデフォルトでは固定スプレッドを使用します。USD/JPYなら0.3pipsや0.5pipsで計算されることが多いです。

しかし、リアルの相場ではスプレッドは変動します。経済指標発表の前後、東京・ロンドン・NY時間の切り替わり時には、USD/JPYでも2〜5pips以上開くことがあります。

スキャルピング系のEAほど、この影響が致命的です。 1回あたりの利益が3〜5pips程度の戦略なら、スプレッドが広がった瞬間に利益がゼロになります。

[画像:USD/JPYの変動スプレッドグラフ。経済指標発表時にスパイク状に広がっている様子]

対策

  • バックテスト時のスプレッド設定を、実際より広めに設定する
    • MT4のストラテジーテスター → スプレッド欄に10〜15(1.0〜1.5pips相当)を設定
  • スキャルピング系(目標利益10pips以下)のEAは特に注意
  • AIへの指示:「このEAはスプレッドが広い時間帯(東京早朝、指標発表前後)には取引しないフィルターを追加してください」

💡 INFO MT4のストラテジーテスターのスプレッド欄の単位は「ポイント」です。USD/JPYで1pips = 10ポイント(小数点以下5桁表示の場合)です。スプレッド15と入力すると1.5pips相当になります。


原因3:約定力(スリッページ)の違い

何が起きているか

バックテスターでは、成行き注文を出すと指定した価格通りに100%約定するという前提で計算されます。

リアルの取引では、「売買注文を出した瞬間」と「実際に約定した瞬間」の間に時間差があります。その間に価格が動くため、想定より不利な価格で約定する(スリッページ)が発生します。

特にニュース発表直後の急変動時流動性が低い時間帯は、スリッページが数pipsに及ぶこともあります。

対策

  • MT4のストラテジーテスターで**「Every Tick」モード**を使用する(最も現実に近い計算)
    • 「Open Prices Only」はバーの始値でしか約定しない前提で、スリッページを無視する
  • AIへの指示:「注文時に最大スリッページを2pips(20ポイント)に設定してください。スリッページが大きい場合は注文をキャンセルするロジックを追加してください」

[画像:MT4ストラテジーテスターの設定画面でモデルを「Every Tick」に選択しているスクリーンショット]


原因4:テスト期間が短い・偏っている

何が起きているか

2024年だけのデータでバックテストをした場合、その1年がトレンド相場だった時期はトレンドフォロー系EAの成績が良く出ます。 しかしリアルでレンジ相場が続いた途端に負け始めます。

逆に、レンジ相場の年にテストしたレンジ系EAは、リアルでトレンドが出ると機能しません。

相場の「得意な環境」と「苦手な環境」を両方含む期間でテストしないと、正しい評価はできません。

対策

テスト期間評価
1年以下❌ 短すぎる。環境が偏る
2〜3年△ 最低限のライン
5年以上✅ トレンド・レンジの両環境を含みやすい
10年以上◎ リーマンショック・コロナショック等の極端な相場も含む

MT4の無料ヒストリカルデータは通常5〜15年分入手可能です。できるだけ長期間のデータでテストしましょう。

💡 INFO MT4のストラテジーテスターで使えるヒストリカルデータは、「ツール → ヒストリーセンター」から確認できます。データが少ない場合は、Alpariなどが提供する高品質なヒストリカルデータをダウンロードして追加できます。


原因5:先読みバグ(AIが生成するコードの落とし穴)

何が起きているか

これがAIでEAを作る時に特有の問題です。

MQL4では、Close[0]現在の未確定バー(リアルタイムで動いているローソク足)の終値を指します。バックテストの際には過去の確定済みデータを使うため、Close[0] でも問題なく計算できます。しかしリアルタイムでは、バーが閉じる前に計算が走るため「まだ確定していない価格」でシグナルが判定されます。

[画像:「Close[0]は未確定」「Close[1]は確定済み」を示した図解。リアルタイムと過去データの違いを視覚化]

その結果:

  • バックテスト:確定済みデータで計算 → 正確なシグナル
  • リアルタイム:未確定データで計算 → バー内で何度もシグナルが点滅 → 意図しない複数エントリー

具体的な例

// ❌ 悪い例:Close[0]を使っている(先読みバグ)
double rsiValue = iRSI(NULL, 0, 14, PRICE_CLOSE, 0); // shift=0 は現在の未確定バー

if(rsiValue < 30) {
    // 買いエントリー
}
// ✅ 良い例:Close[1]を使っている(確定バーで判定)
double rsiValue = iRSI(NULL, 0, 14, PRICE_CLOSE, 1); // shift=1 は1つ前の確定バー

if(rsiValue < 30) {
    // 買いエントリー
}

iRSI() の最後の引数(shift)を 0 から 1 に変えるだけで解決します。

AIへの指示テンプレート

コード生成時に最初から防ぐ場合:

シグナルの判定は必ず「確定バー」で行ってください。
iRSI(), iMACD(), iBands() 等のshiftパラメーターは必ず1以上を使用してください。
Close[0]やiRSI(..., 0)のような未確定バーを参照するコードは使わないでください。

既存コードの先読みバグをチェックしてもらう場合:

以下のMQL4コードに「先読みバグ」が含まれていないか確認してください。
先読みバグとは、Close[0]やshift=0を使った未確定バーへの参照です。
バグがある場合はClose[1]またはshift=1に修正し、修正後のコード全文を出力してください。

【コード全文】
(コード全体を貼付)

🚫 DANGER 先読みバグがあるEAをリアル口座で動かすと、バックテストと全く異なる挙動をします。必ずデモ口座で十分なフォワードテストを行い、バックテストと同様の動作を確認してからリアル口座に移行してください。


正しいテストの5ステップ

原因がわかったところで、「正しいテストの手順」を整理します。

ステップ1: バックテスト
 └ 5年以上のデータ
 └ スプレッドはやや広めに設定(USD/JPYなら10〜15ポイント)
 └ Every Tickモード
 └ デフォルトパラメータ(最適化しない)

ステップ2: フォワードテスト
 └ 直近1〜2年のデータを「ステップ1では見ずに温存」
 └ ステップ1のデータとは別の期間で検証
 └ バックテストと同様の成績が出るか確認

ステップ3: デモ口座でリアルタイム稼働(1ヶ月以上)
 └ 実際のスプレッド・スリッページの影響を確認
 └ バーの確定タイミングのシグナルが意図通りか確認

ステップ4: 少額リアル口座(最小ロット: 3ヶ月)
 └ デモとリアルで挙動が違う場合は原因を調査

ステップ5: 通常ロットへ移行
 └ ステップ4まで問題なければ

[画像:上記5ステップのフローチャート図]

✅ TIP ステップ2(フォワードテスト)が最も重要です。バックテストの最後の20〜30%を「秘匿データ」として温存しておき、バックテスト後に初めてその期間を検証することで、過剰最適化が起きているかどうかを客観的に確認できます。


AIへの指示テンプレート(先読みバグ・過剰最適化対策)

コード生成時に最初から渡しておくと効果的なプロンプトです。

MT4で動くMQL4のEAを作ってください。

【売買ロジック】
(ここに自分のロジックを書く)

【必須の品質要件】
1. シグナル判定は必ず確定バー(shift=1)を使うこと。shift=0(Close[0])は禁止
2. パラメータを過剰最適化しないこと。RSI期間は14等のデフォルト値を使う
3. 同じバーで複数回エントリーしないよう、バー管理の変数を追加すること
4. エントリー前にOrdersTotal()で既存ポジションを確認すること
5. Use OrderSend() with correct 9 parameters for MT4 Build 600+

日本語コメント付きの完全なMQL4コードを、省略なしで出力してください。

まとめ:バックテストは「上限値」として捉える

この記事で紹介した5つの原因を振り返ります。

原因主な対策
過剰最適化パラメータはシンプルに。フォワードテスト期間を設ける
スプレッドバックテストのスプレッドを広めに設定
スリッページEvery Tickモードを使用
テスト期間の偏り5年以上のデータでテスト
先読みバグshift=1(確定バー)を使う。AIに明示的に指示する

バックテストの成績は「理論上の最大値」です。リアルはこれより必ず下がります。バックテストでPF 1.5が出ていれば、リアルで1.2〜1.3程度が期待値と考えるくらいの感覚が現実的です。

正しいテスト手順を踏めば「思ったより負ける」を防ぐことができます。焦ってリアル口座に移行せず、デモでの検証を必ず行ってください。


関連記事


本記事で紹介するEA・手法は教育目的で作成されたものです。実際の取引で利益を保証するものではありません。EAの運用は必ずデモ口座で十分にテストした上で、自己責任で行ってください。FX取引にはリスクが伴います。

次のステップ

まずデモで動作確認 → OKなら本番運用、が安全です。

デモ口座でEAを回す手順
共有:

関連記事

#バックテスト #カーブフィッティング #MQL4 #EA運用 #リスク管理
目次を表示