OptiNod アカデミー
過剰最適化 — 最高点の周辺まで平坦な設定だけが実運用で生き残る
バックテストで最高リターンを出したパラメータは、過去のノイズに合わせ込まれていることが少なくありません。隣接する設定値でも良好な成績が続く、高原型のパフォーマンス曲線だけが実運用に耐えます。
> バックテストの最高点だけでなく、その*周辺の設定値まで良好*な高原型の曲線だけが、実運用で持ちこたえます。
過剰最適化(Overfitting)とは、戦略のルールやパラメータを過去データの偶然の変動に合わせて削り込んでしまった状態を指します。同じデータで組み合わせを十分な回数試せば、どんな戦略でも見栄えのよいバックテスト曲線を作ることはできます。問題は、その曲線が過去に存在した本物のパターンを捉えたものなのか、それともその期間だけ偶然合っていたノイズを覚え込んだものなのかを、バックテストのリターンだけでは見分けられない点にあります。これが過剰最適化の本質です。
多くのトレーダーは、最適化を次のように使います。パラメータ範囲を広く取り、バックテストを何百回も回し、リターンが最も高い組み合わせを1つ選んで実運用に投入します。RSIの期間は14がよいのか13がよいのか、損切りを2%にするのか2.3%にするのかを、バックテストのリターンの小数点まで比較して最高点を探します。この過程で選ばれた最適値が、過去区間で最も高いリターンを出した設定であることは確かです。問題は、その最高点こそが実運用で真っ先に崩れる場所である場合が多いことです。
この記事で伝えたいことはシンプルです。最適化で見るべきなのは、最高点の周辺がどんな形をしているかです。RSI期間を14から13や15へ1つ動かしただけで成績が崖のように落ちるなら、14という値は過去の特定の変動にぴったり合わせ込まれた偶然です。反対に、12から18まで似たように良い成績が続くなら、その範囲は市場の本物の構造を捉えた堅牢な領域です。同じバックテストリターンを見ていても、隣の値まで見ているかどうかが実運用の成績を分けます。

最高点が崖の端にあると危険です
同じバックテストリターン200%を出した2つのパラメータがあるとします。片方は左右の値でリターンが50%まで落ちる鋭いピークで、もう片方は左右でも180%を維持するなだらかな高原の中央です。標準的な最適化では、この2つは同じ価値として扱われます。どちらも200%だからです。しかし実運用では、この2つの設定の結果は正反対になります。
理由は、未来のデータが過去のデータとわずかに異なるからです。バックテストでRSI期間14がピークだったとしても、実運用の価格はバックテスト区間とまったく同じようには動きません。ボラティリティが少し大きくなったり、トレンドの速度が変わったりすると、過去の最適値は未来では1つ隣にずれた位置になります。崖型のピークに乗っていた場合、1つずれた瞬間にリターン200%が50%へ急落します。高原の中央にいた場合は、1つずれてもまだ高原の中にあるため、成績は維持されます。
例として挙げる数値ですが、崖型と高原型の違いは実運用でこのように現れます。2021年のBTCは、約29,000ドルから始まり、11月10日に約69,000ドルまで上昇しました。強い上昇トレンドにうまく合うように損切り幅を狭く削り、トレンドフォローのパラメータをピークまで締め込むと、その区間のバックテストは非常に見栄えがよくなります。しかし2022年に入ると、市場は6月のLuna・3AC連鎖清算で17,000ドル台まで崩れ、11月のFTX破綻で約15,500ドルの安値を付けました。トレンドの方向とボラティリティが丸ごと反転したこの局面では、2021年のピークに合わせた崖型設定は、最初の数週間で累積損失を膨らませます。ピークは、その市場環境においてだけピークだったからです。
最高点の高さだけを見て設定を選んではいけません。その周辺がどれだけ平坦かも、必ず確認する必要があります。
自由度が増えるほどノイズを覚え込みます
戦略にパラメータやルールを1つずつ追加するたびに、自由度(Degrees of Freedom)は増えます。自由度とは、戦略を過去データに合わせるためのつまみの数です。つまみが多いほど、過去のどんな曲線にも正確に合うよう締め込むことができ、その分、本物のパターンと偶然のノイズを区別できないまま、両方を覚え込んでしまいます。
原理は統計の基本と同じです。2つの点は1本の直線で正確につなげますし、3つの点は2次曲線で正確につなげます。パラメータを十分に増やせば、過去のすべての取引を通る曲線を描くことはできます。しかしその曲線は、未来の新しい点をまったく説明できません。戦略において損切り、利確、エントリーフィルター、時間帯条件を1つずつ追加する行為は、曲線の次数を上げることと同じです。ルールが増えるほどインサンプル(In-sample)の成績は概ね良くなりますが、そのうちどの部分が本物のパターンで、どの部分が覚え込んだノイズなのかを、インサンプル内で確認する方法はありません。
5つのルールを持つ戦略と15のルールを持つ戦略が、同じ過去区間で同じリターンを出したなら、選ぶべきは5つのルールの戦略です。同じ成績をより少ない自由度で作れたということは、それだけ偶然への依存が小さいという意味だからです。15のルールで積み上げた成績は、その半分以上が過去ノイズに合わせた余計な調整である可能性が高くなります。シンプルな戦略のほうが実運用で長く持ちやすい理由はここにあります。
追加するルールごとにインサンプルのリターンがどれだけ上がるかを見る前に、まず、そのルールがなければならない理由を問うべきです。

サンプルが少ないと、つまみを数個触るだけで過剰最適化になります
自由度の絶対数だけでは、過剰最適化かどうかは判断できません。取引サンプル数に対するパラメータ数の比率も合わせて見る必要があります。同じ5つのパラメータでも、取引が1,000回発生した戦略なら耐えられるかもしれません。しかし取引が30回しかない戦略では、5つ触るだけですぐに過剰最適化へ傾きます。サンプルが小さいほど、偶然の変動が全体成績に占める割合が大きくなり、その偶然を本物のシグナルと誤認しやすいからです。
取引数が少ない戦略は、統計的に信頼しにくくなります。コインを10回投げて7回表が出たからといって、そのコインは表に偏っていると断定できないのと同じです。30回の取引で勝率60%が出た場合、その60%の信頼区間はおおよそ40%台前半から70%台後半まで広くなります。このように広い範囲の中では、パラメータを少し変えただけで勝率が大きく揺れます。その揺れを追いかけて最適値を選ぶと、次の30回の取引ではまったく再現されません。
BTCの日足で1年をバックテストすると、ローソク足は約365本しかありません。平均保有期間が2週間のスイング戦略なら、1年の取引数は20回前後です。このサンプルで5つのパラメータを同時に最適化すると、実質的には4回の取引ごとに1つのつまみを合わせているようなものです。過去にぴったり合う設定が偶然出てくるのは当然です。サンプルを増やすには、より長い過去区間を使うか、同じ戦略を複数の資産に同時適用して取引数を合算する必要があります。取引サンプルがパラメータ数の数十倍に満たないなら、最適化結果そのものを信用しません。
最適化を回す前に、まず取引が何回発生したかを数えます。
インサンプルが華やかであるほど疑います
直感とは逆に、バックテスト曲線が滑らかで、一度のドローダウンもなく右肩上がりであるほど、その戦略はより疑うべきです。実際の市場には、必ず耐えにくいドローダウン局面があります。バックテストがそのドローダウンまで滑らかに越えているなら、過去のすべての下落局面を避けるようにルールが調整されているサインです。未来の下落は過去とは違う形で来るため、過去の下落をすべて避けた設定は、未来の最初の下落にそのままさらされます。
この罠は、損切り、利確、フィルターを追加し続け、過去の損失取引だけを選んで消していく過程で生まれます。バックテストを回してみると特定の損失取引が気になり、その取引を避けるフィルターを1つ追加する。再び回して、また別の損失を避ける条件を足す。こうした流れです。1回回すたびに曲線は滑らかになりますが、追加されたフィルターの大半には、その1回の過去取引を避けること以外に根拠がありません。結果として戦略は、損失を生む構造を理解しないまま、過去に起きた特定の損失のリストを覚えただけになります。
同じデータで何百もの組み合わせを回し、最高点を選ぶ方法も同じ結果を生みます。1,000個の組み合わせを試せば、その中のいくつかは純粋な偶然によって過去区間をほぼ完璧に通過します。その中から最高点を選ぶ行為は、たまたま最も運が良かった設定を選ぶことと同じです。同じデータを繰り返し見ながら最高点を選別する作業は、一般にデータスヌーピング(Data Snooping)と呼ばれます。試した組み合わせの数が多いほど、偶然の最高点が出る確率は高くなります。曲線が非現実的なほど完璧なら、それはデータを見すぎた結果です。
ドローダウンのないバックテストは、誇るものではありません。最初に疑うべき点検対象です。

崖型と高原型は隣接成績で分かれます
堅牢な設定か、過剰最適化された設定かを見分ける最も直接的な方法は、最適値の周辺にある隣接値も一緒に見ることです。最適値1つのリターンだけを記録して満足してはいけません。その左右の値のリターンも表にして形を確認します。形が鋭い山なら崖型、広い丘なら高原型です。同じ手順を、すべての主要パラメータに対して繰り返します。
隣接成績を見ることが有効なのは、未来の市場環境の変化を、パラメータ空間上の移動として事前にシミュレーションできるからです。ボラティリティが大きくなってRSIシグナルが一拍遅れて届く未来は、バックテスト上では最適値が期間14から16のほうへずれるのと似た効果を持ちます。期間16でも成績が維持される高原型設定はその未来に耐えますが、期間16で成績が半分以下に落ちる崖型設定はその未来で崩れます。隣接成績は、未来データがなくても未来への堅牢性を測る代理指標になります。
次の点検を、すべての主要パラメータに適用します。
- [ ] 隣接範囲の設定: 最適値を中心に左右3段階ずつ、合計7つの値について、同じ期間のバックテスト成績を記録します。たとえば最適値がRSI期間14なら、11、12、13、14、15、16、17の成績をすべて確認します。
- [ ] 高原判定: 7つの値のうち、最適値に近い中央5つ(12〜16)の成績がすべて最高値の70%以上を維持していれば、高原型と見なして採用します。
- [ ] 崖型の棄却: 最適値から1段階動かしただけで成績が最高値の半分未満に落ちるなら、その最適値は過剰最適化と見なして捨てます。高原の中央にある別の値を代わりに選びます。
- [ ] 複数パラメータの同時確認: パラメータが2つ以上ある場合は、1つのパラメータだけを揺らすやり方は避けます。2つのパラメータを同時に動かしたグリッド上でも高原が維持されるかを確認します。一方の軸だけで平坦な尾根は、崖と変わりません。
7つの値のうち最高点だけを書き留める習慣をやめ、7つすべてを記録して形を見る必要があります。
期間を分けると、覚え込んだ曲線がふるい落とされます
隣接成績がパラメータ空間を揺らす点検だとすれば、期間分割は時間軸を揺らす点検です。過去区間全体を一度に最適化してはいけません。前半でパラメータを選び、後半でそのパラメータを検証します。前半をインサンプル、後半をアウトオブサンプル(Out-of-sample)と呼びます。インサンプルで華やかだった設定がアウトオブサンプルで崩れるなら、その設定は前半のデータを覚え込んだものです。
この分割が過剰最適化を見つけられる理由は、検証区間が最適化プロセスから完全に隔離されているためです。パラメータを選ぶときに後半データを一度も見ていなければ、後半の成績は、そのパラメータが初見のデータでどう機能するかを正直に示します。1回の分割では不十分なら、インサンプルのウィンドウとアウトオブサンプルのウィンドウを時間軸に沿ってずらしながら何度も検証するウォークフォワード分析(Walk-forward Analysis)へ拡張します。各区間で前に選んだパラメータが次の区間でも通用するかを累積して見れば、偶然1回だけ通用した設定と、一貫して通用する設定を区別できます。
ここにモンテカルロ(Monte Carlo)点検を加えると、堅牢性をさらに一段深く検証できます。バックテストで得られた取引の順序をランダムに数千回並べ替えたり、エントリー時点を数日ずつランダムにずらしたりして、結果の分布を見ます。取引順序を変えただけなのに、一部のシミュレーションで口座が耐えにくいドローダウンに陥るなら、元のバックテストの滑らかな曲線は、取引がたまたま有利な順序で発生した偶然に依存していたことになります。エントリー時点を数日揺らしたときに成績が急変するなら、その戦略は特定のローソク足の特定価格に過度に依存しています。堅牢な戦略では、こうしたランダムな撹乱を加えても分布の中心は大きく揺れません。
3つの点検を順番に適用します。
- [ ] 期間分割比率: 過去区間全体の前半70%をインサンプルとしてパラメータを選び、後半30%をアウトオブサンプルとして検証します。アウトオブサンプル成績がインサンプルの半分未満に落ちるなら、過剰最適化と見なしてパラメータを取り直します。
- [ ] ウォークフォワードの反復: インサンプルとアウトオブサンプルのウィンドウを時間軸に沿って最低5回以上ずらし、5区間中4区間でアウトオブサンプルが損失を回避できるか確認します。
- [ ] モンテカルロ分布: 取引順序を1,000回以上ランダムに並べ替えた分布で、ワースト5%地点のドローダウンが、実際の口座で許容できる限界内に収まるかを確認します。
期間を分けずに全体を一度に最適化した結果は、検証とは呼べません。同じデータで採点した自己採点に近いものです。インサンプルが華やかであるほど、アウトオブサンプルでもう一度通過させ、その両方で耐えた設定だけを実運用に投入すべきです。
