過剰最適化(カーブフィッティング)とは?EA自作で一番ハマる罠と見抜き方

スポンサーリンク

どうもこんにちは。戦術トレードラボのラボ長です。

EAを作ってバックテストを回していると、ある日、びっくりするほど良い成績が出ることがあります。
右肩上がりの資産曲線を見て、「ついに完成した」と思う。

でも、その成績は過去のチャートを「暗記」しただけかもしれません。
これが、EA自作で一番ハマりやすい罠、過剰最適化(カーブフィッティング)です。

私も、AIと一緒にEAを作る中で、何度もこの罠にハマりました。
この記事では、過剰最適化とは何か、なぜ起きるのか、どう見抜いて防ぐのかを、実際の失敗例と一緒にまとめます。


スポンサーリンク

過剰最適化(カーブフィッティング)とは

過剰最適化とは、EAのルールや設定を、過去のデータにぴったり合わせすぎてしまうことです。
カーブフィッティング、オーバーフィッティングとも呼ばれます。

たとえるなら、テストの過去問を丸暗記した状態です。
過去問では満点が取れても、初めて見る問題はまったく解けません。

相場の値動きには、本当に繰り返される癖(優位性)と、その期間にたまたま起きただけの偶然(ノイズ)が混ざっています。
過剰最適化されたEAは、この偶然の部分まで「ルール」として覚えてしまいます。
過去は偶然も含めて完璧に説明できるのに、未来では同じ偶然は起きないので、成績が崩れるんです。

なぜ起きるのか(3つの原因)

1. 試す回数が多すぎる

設定を変えてテストを繰り返すほど、たまたま過去と相性の良かった組み合わせが見つかりやすくなります。
サイコロを何百回も振れば、6が5回続くこともある。それと同じです。

AIにEAを作ってもらうと、この回数が一気に増えます。
私は、気づけば366回試した中から一番良い結果を選んでいました。そのEAは、利益のほとんどが上位3回の大勝ちでできていて、その3回を除くと赤字でした(バックテスト)。

2. 調整できる場所が多すぎる

移動平均の期間、損切りの幅、利確の幅、時間帯、フィルター……。
調整できる設定(パラメータ)が増えるほど、EAは過去のどんな形にも合わせられるようになります。

よく言われる目安として、設定1つに対して、トレードが数十回以上は欲しいと考えておくと安全です。
設定が10個あるのに、6年でトレードが50回しかない。こういうEAは、ほぼ間違いなく過去を暗記しています。

3. 「良くなる方向」だけを追いかける

成績が悪い通貨ペアや期間を見つけると、そこを直したくなります。
でも、負けた場面を1つずつ消していくと、最後に残るのは「過去に勝った場面だけ」を選ぶEAです。

私が「一番効いた改善」として採用したフィルターは、中身を調べるとシグナルの9割を捨てていただけでした。
削りすぎれば、たまたま勝ったトレードだけが残って、成績は良く見えます。

私が実際にハマった例

ここからは、私のEA開発で実際にあったことです(数字はすべてバックテストの結果です)。

① 通貨ペアごとに設定を探したら、全部黒字になった
最初のEAは、通貨ペアによって成績がプラスとマイナスに分かれました。
そこで、AIに通貨ペアごとの最適な設定を探してもらうと、3つとも黒字に。
ところが、テストの期間を5年あまりに延ばしただけで、ある通貨ペアの成績はほぼゼロになりました。
その通貨ペアの「黒字」は、短い期間にだけ合わせた設定だったんです。

② 良い成績の通貨ペアが、見ていない期間で崩れた
別の時期にも、ある通貨ペアで良い成績が出たことがありました。
でも、作るときに使っていない期間で試すと崩れました。選び方の偶然だったと分かったときは、正直がっかりしました。

③ 追加の利益が、特定の1年に集中していた
トレード回数を増やす設定を試したとき、合計の成績は確かに良くなりました。
ところが年ごとに分けてみると、追加の利益のほぼ全部が、6年のうち1年だけに集中していました。
その1年の相場に合っていただけなので、採用は見送りました。

どれも、合計の数字だけを見ていたら気づけなかったものです。

見抜き方:こんなサインが出たら疑う

サインなぜ怪しいか
資産曲線がきれいすぎる本物の優位性でも、負けが続く時期は必ずある
設定を少しずらすと成績が急に落ちる1つの値だけ突出して良いのは、過去の偶然に合わせた可能性が高い
期間を延ばす・変えると崩れる作った期間にだけ合っている
通貨ペアごとに設定がバラバラそれぞれの過去に合わせている可能性
フィルターを足すたびに回数が大きく減る勝った場面だけを選び出しているだけかも
利益が少数の大勝ちや特定の1年に集中再現できるとは限らない

特に大事なのが2つ目です。
本当に優位性のあるルールなら、設定を少し変えても成績はなだらかに変わります(「台地」のような形)。
ある1点だけがとがって良い(「針」のような形)なら、それは暗記の可能性が高いです。

防ぎ方:5つの習慣

1. データを「作る用」と「確かめる用」に分ける

過去データを2つに分けて、前半で作り、後半は最後まで見ない。
作り終えてから後半で一度だけテストします。これをアウトオブサンプルテストと呼びます。

大事なのは、確かめる用のデータで結果を見てから、また設定を直さないことです。
直した瞬間、そのデータも「作る用」になってしまいます。

2. ウォークフォワード分析をする

期間をずらしながら「作る → 確かめる」を何回も繰り返す方法です。
たとえば「2年で作って、次の半年で確かめる」を、半年ずつずらしながら続けます。
どの区間でも同じように確かめる期間の成績が残るなら、過去の一時期だけに合わせたEAではない可能性が高まります。

3. 見ていない通貨ペアでも試す

同じ考え方のルールが、作るときに使っていない通貨ペアでも大きく崩れないかを見ます。
私も、候補の通貨ペアを増やすときは、それまで見ていなかった通貨ペアで確かめてから採用するか決めています。
すべての通貨ペアで勝つ必要はありませんが、「作った通貨だけ勝つ」なら要注意です。

4. 試した回数を記録する

何回試して、その中から選んだのか。これを数えておくだけで、一番良い結果への見方が変わります。
100回試して一番良かった結果は、1回目で出た結果より、ずっと割り引いて考える必要があります。

AIに検証を任せるときは、「試した組み合わせの数も報告して」と頼んでおくのがおすすめです。

5. ルールを増やす前に、「なぜ効くのか」を言葉にする

新しい条件を足す前に、相場のどんな性質を利用しているのかを説明できるかを考えます。
説明できないまま成績だけ良くなった条件は、偶然を拾っているだけのことが多いです。

私は負けトレードを減らそうとして、移動平均や時間帯など16種類の条件を試しました。
結果は、どれも負けだけを選り分けられませんでした。
全滅です。ただ、無理にどれかを採用しなかったことで、過去への暗記を1つ増やさずに済んだと思っています。


過剰最適化チェックリスト

チェック項目できた?
作る用と確かめる用に、データを分けた□
確かめる用のデータを見たあと、設定を直していない□
設定を少しずらしても、成績がなだらかに変わる□
期間を延ばしても、大きく崩れない□
作るときに見ていない通貨ペアでも試した□
年ごとの損益を出して、特定の1年に頼っていない□
上位数回の大勝ちを除いても、プラスが残る□
設定の数に対して、トレード回数が十分ある□
試した回数を記録している□
足した条件が「なぜ効くのか」を説明できる□

よくある質問

Q. 最適化(設定を探すこと)自体がダメなんですか?
A. いいえ。設定をまったく調整しないEAはありません。問題は「合わせすぎ」です。探す範囲を狭くする、設定の数を減らす、見ていないデータで確かめる、をセットにすれば、最適化は役に立ちます。

Q. MT4のストラテジーテスターの最適化機能は使わない方がいいですか?
A. 使って大丈夫です。ただし、結果の一覧から一番上を選ぶのではなく、周りの設定でも成績が良い「台地」になっている所を選ぶのがコツです。そのあと、必ず見ていない期間で確かめてください。

Q. AIに「一番成績の良い設定を探して」と頼むのは危険?
A. 頼み方次第です。「一番良い設定」だけを求めると、AIは過去に合わせた結果を出しがちです。「前半で探して、後半で確かめて。試した数も教えて」のように、確かめ方まで一緒に頼むのがおすすめです。

Q. どれくらいのトレード回数があれば安心ですか?
A. よく言われる目安は、最低でも100回、できれば数百回です。回数が少ないと、どんな好成績も偶然の可能性が高くなります。成績の見方はEAの成績の見方でまとめています。

まとめ

  • 過剰最適化とは、過去の偶然まで覚えてしまうこと
  • 原因は、試す回数・設定の数・負けを1つずつ消す直し方
  • 設定を少しずらしても崩れない「台地」を探す
  • データを分け、見ていない期間・見ていない通貨ペアで確かめる
  • 試した回数を数え、条件を足す前に「なぜ効くのか」を考える

バックテスト全体の確認項目はバックテストで騙されないためのチェックリスト、私が実際にバックテストに騙された話は連載の第4話にまとめています。


関連: バックテストと検証 / ラボ長のEA開発ストーリー
連載: 第1話 / 第2話 / 第3話 / 第4話

※本ブログの内容は私個人の経験にもとづくもので、将来の利益を保証するものではありません。バックテストの結果は過去のデータによるものです。投資は自己責任でお願いします。

コメント