バックテストの過剰最適化(カーブフィッティング)を避ける方法

バックテストの過剰最適化(カーブフィッティング)とは、パラメータを過去データに合わせすぎて、偶然うまくいった部分まで「実力」として拾ってしまう状態です。避けるには、一番成績の良い値を選ぶのをやめ、周りの値も同じくらい良い「台地」の真ん中を選びます。そのうえで、最適化に使っていない期間で確かめます。

一番良いパラメータは、なぜ別の期間で崩れるのか

移動平均クロスの短期と長期の期間を、それぞれ7通りずつ試すと、49通りのバックテストになります。この49通りの中で一番良い結果は、戦略の実力に「その期間だけの運」が上乗せされた値です。

試す回数が増えるほど、運で良く見える組み合わせが混ざる確率は上がります。統計でいう多重比較の問題です。一番良いマスを選ぶという操作そのものが、運の大きいマスを選びやすい仕組みになっています。

別の期間では、その運は再現しません。そのため、最適化で見た成績より悪くなるのが普通です。悪くなること自体は問題ではありません。問題は、悪くなる幅が大きすぎて、戦略として成り立たなくなることです。

過剰最適化を疑うサイン

  • 最良の値の隣の値にすると、成績が急に悪くなる
  • 取引数が少ない(数十件以下)のに、損益が大きい
  • 利益のほとんどが、ごく少数の取引から来ている
  • パラメータの数が多く、条件分岐も多い
  • 期間を少しずらすだけで、最良のパラメータが大きく変わる

どれか1つに当てはまっても、すぐに過剰最適化だとは言えません。ただ、複数に当てはまるなら、その成績はかなり割り引いて見たほうが安全です。

ヒートマップで「尖った最良値」と「台地」を見分ける

パラメータを2つ選んで総当たりし、成績を色で並べたものがヒートマップです。見るべきは一番色の濃いマスではなく、そのマスの周りです。

2つのパラメータを総当たりしたヒートマップ。最良のマスと周囲のマスの平均が並んで表示されている
Hawk Backtesterのパラメータ総当たり。最良のマスの成績と、周囲のマスの平均を並べて表示します。
形見え方読み方
尖った最良値1マスだけ良く、周りは悪い運の影響が大きい可能性が高い
台地広い範囲がそこそこ良いパラメータが多少ずれても崩れにくい
全体に悪いどこも良くないパラメータではなく、ルール自体を見直す

Hawk Backtesterのヒートマップは、最良のマスの値の横に「周囲のマスの平均」を表示します。最良のマスが+8%でも、周囲の平均が−1%なら、その+8%は信用しにくい値です。逆に最良が+4%で周囲の平均が+3%なら、こちらのほうが別の期間でも形を保つ見込みがあります。

選ぶときは、最良のマスではなく、台地の真ん中あたりを選びます。成績の数字は少し下がりますが、その分だけ運に頼らない値になります。

最適化に使っていない期間で確かめる

台地を選んでも、それは同じデータの中での判断です。最後は、最適化に使っていないデータで確かめます。

  1. データを前半と後半に分ける(例:7割と3割)
  2. 前半だけでパラメータを総当たりし、台地の真ん中を選ぶ
  3. 選んだ値を固定したまま、後半で1回だけ流す

大事なのは、後半の結果を見てからパラメータを選び直さないことです。選び直すと、後半も最適化に使ったことになり、検証の意味がなくなります。

ウォークフォワード

前半で選んで後半で確かめる、という手順を、期間をずらしながら何度も繰り返す方法がウォークフォワード分析です。たとえば「1年で最適化して次の3か月で確かめる」を、3か月ずつずらして続けます。確かめた期間の成績だけをつなげると、実際にパラメータを定期的に選び直しながら運用した場合に近い姿が見えます。

パラメータと条件を減らす

パラメータが1つ増えるたびに、試す組み合わせは掛け算で増えます。組み合わせが増えるほど、運の良い組み合わせが見つかりやすくなります。

  • 効いていないパラメータは固定する(総当たりしても成績がほとんど変わらないもの)
  • 「火曜日だけ除外」のような、理由を説明できない条件を足さない
  • 刻みを細かくしすぎない(期間を1刻みで50通り試すより、5刻みで10通り)

取引数を必ず確認する

取引が20件しかない結果は、数件の勝ち負けで成績が大きく変わります。ヒートマップの指標を損益だけでなく取引数にも切り替えて、成績の良いマスが取引数の少ないマスに偏っていないか確かめます。取引数が極端に少ないマスは、成績が良くても候補から外したほうが安全です。

直すときは、1回に1つだけ変える

過剰最適化は、パラメータの総当たりだけでなく、ルールを少しずつ手で直していく過程でも起きます。直すたびに成績が上がっても、それが本当にルールの改善なのか、たまたま数件の取引がうまくいっただけなのかは、合計の損益からは分かりません。

そこで、1回に変えるのは1か所だけにして、どの取引が変わったかを確かめます。Hawk Backtesterは、前回の実行と比べて、結果が変わった取引を一覧で表示します。たとえば利確幅を1%から2%に変えたとき、取引数は60件のままでも、決済の結果が変わった取引が20件あり、その約半分は悪くなっていた、ということがありました。合計だけ見ると「少し良くなった」で終わっていた変更です。

前回の実行と比べて結果が変わった取引の一覧
前回の実行との差分。変わった取引だけを確かめられます。

負けトレードの中身を分けて見る方法は、MFE・MAEの解説で扱っています。また、成績が相場の種類に依存していないかは、相場環境別の分析で確かめられます。

よくある質問

カーブフィッティングと過剰最適化は同じ意味ですか?

トレードの文脈では、ほぼ同じ意味で使われます。どちらも、過去データの形に合わせすぎて、将来のデータに通用しなくなる状態を指します。

最適化そのものをやめるべきですか?

やめる必要はありません。パラメータの感度を知るために総当たりは役に立ちます。問題になるのは、一番良い1点を選んでその成績を信じることです。

検証期間の成績が悪かったら、どうすればいいですか?

その期間を見てパラメータを選び直すと、検証期間も最適化に使ったことになります。ルールの考え方から見直し、新しい検証期間で確かめ直すのが筋です。

この記事はバックテストの方法についての解説です。特定の売買や投資判断をすすめるものではありません。