OptiNod アカデミー

バックテストと実運用 — 収益曲線が分かれる5つのポイント

バックテストの収益が実運用での期待収益にならない理由は、「足の終値で約定する」という前提から始まります。シグナルと約定の間に生じる1本分の遅れを、5つのポイントに分解して見ていきます。

> バックテストの曲線と実運用の曲線が分かれ始める出発点は、「足の終値で約定する」という前提です。シグナルと約定の間にある1本分の遅れが、どこでコストに変わるのかを5つのポイントから確認します。

バックテストとは、過去データに戦略ルールをそのまま適用し、仮想の収益曲線を作る作業です。ルールが明確でデータがきれいであれば、誰が実行しても同じ曲線を再現できます。この再現性があるからこそ、バックテストは戦略検証の最初の道具として使われています。

問題は、多くの人がこの曲線をそのまま実運用の期待収益として読んでしまうことです。バックテストの年率リターンが80%なら、実運用でも同じような収益を期待し、差が開くと戦略が間違っていたと判断します。しかし実際には、戦略ルールは同じなのに曲線だけが分かれるケースがほとんどです。曲線が分かれる原因は、そのルールが前提としている仮定にあります。

最も大きな仮定は、足の終値で約定するというものです。バックテストエンジンは、シグナルが出た足の終値をエントリー価格として記録します。しかし実運用では、シグナルは足が確定した後に初めて確定し、注文は次の足で約定します。その間に価格はすでに動いています。この1本分の遅れが、スリッページ、手数料、データ解像度、サバイバーシップバイアスと絡み合い、2本の曲線を時間軸に沿って引き離していきます。本稿では、その5つのポイントを順に見ていきます。

同じ地点から出発したバックテスト曲線と実運用曲線が時間とともに乖離します

シグナルは足の確定時に出ますが、約定は次の足です

バックテストが置いている最初の前提は、シグナルが出た足の終値で、その価格のまま約定するというものです。終値ベースのブレイクアウト、終値ベースの移動平均クロスのように、終値をトリガーにする戦略のほとんどは、この前提の上に成り立っています。しかし終値は、足が確定した瞬間に決まる値です。その瞬間を過ぎて初めてシグナルが出て、実際の注文は次の足で約定します。バックテストがエントリー価格として記録した終値は、実運用では約定できない価格です。

落ち着いた相場では、この遅れは小さいものです。足と足の間で価格がほとんど動かなければ、終値と次の足の始値が近いからです。遅れがコストに変わるのは、ボラティリティの大きい足です。

2024年8月5日のBTC日足は、この差をはっきり示しています。8月4日の日足終値は58,161ドルでした。終値ベースのエントリーシグナルがここで出たなら、バックテストはエントリー価格を58,161ドルとして記録します。しかし実運用では、そのシグナルは8月4日の足が確定した後に初めて確定し、注文は8月5日の足で約定します。8月5日の足は58,161ドルで始まり、同日中に49,000ドルまで下落しました。始値から安値までの下落率は約15.7%です。バックテストでは58,161ドルで入り、終値54,019ドルで終える取引として記録されますが、実運用の買い注文は次の足の始値で約定した直後、深い含み損の領域に入ります。

終値約定という前提の弱点は、トレンドフォロー戦略で特に大きくなります。トレンドフォローは、価格が大きく動いた足の終値でシグナルが出る構造なので、シグナルと約定の間に価格がすでに大きく動いている可能性が高くなります。シグナル足で価格が大きく動いたという事実自体が、次の足でも動く可能性を高めます。終値約定を前提にしたバックテストが最も楽観的に膨らみやすいのは、このトレンドフォローのエントリーです。

シグナルは終値で確定し約定は次の足になり、その間に約定価格が乖離します

スリッページはボラティリティ局面で非線形に拡大します

スリッページ(Slippage)とは、注文を出した価格と実際に約定した価格の差です。成行注文は板の複数の価格帯を消費しながら約定し、その平均約定価格は注文直前の気配値より不利になります。バックテストが単一価格で全量約定すると仮定している間、実運用の注文は板を食いながら約定していきます。

流動性の厚いBTC現物で、小さな成行注文のスリッページは通常数bp(ベーシスポイント、1bpは0.01%)程度です。この程度なら、バックテストと実運用の差はほとんど意識されません。スリッページが非線形に大きくなるのは、ボラティリティが急拡大する局面とギャップです。

再び8月5日のBTCを時間足で見ると、この差は明確です。8月5日06:00の時間足は52,718ドルで始まり、1時間のうちに49,000ドルまで下落した後、51,588ドルで引けました。1時間内の高安の幅は約4,000ドルです。このような局面で損切りの成行注文を出すと、板が一瞬で薄くなり、意図した価格よりかなり下で約定します。バックテストが損切りを52,000ドルの一点で約定したものとして記録している間に、実運用の約定価格は50,000ドル付近まで滑ることがあります。ボラティリティが大きいほど板は薄くなり、板が薄いほどスリッページはさらに大きくなる、という形でコストが広がります。

スリッページを0にしたバックテストは、この非線形性を丸ごと消してしまいます。穏やかな局面の取引が大半であれば、スリッページ0の前提でも大きな誤差にはなりません。しかし戦略の収益が、ボラティリティ局面の大きな数回の取引から生まれているなら、スリッページ0のバックテストは実運用から最も大きく乖離します。スリッページは、ボラティリティに応じて動くコストとして扱うべきです。平均値を1つ置くだけでは、ボラティリティ局面で実際に支払う大きなコストを見落とします。

手数料とファンディングは取引頻度に比例して積み上がります

手数料は、1取引だけを見れば小さなものです。取引所のテイカー手数料は、通常、取引代金の0.04%から0.1%の範囲です。エントリーして決済すれば、往復でおよそ0.08%から0.2%です。単一の取引だけなら、無視してもよさそうな大きさに見えます。問題は累積です。

1日に5回売買する短期売買戦略を考えます。往復手数料が0.1%なら、1日5回の取引で0.5%、月20営業日なら約10%が手数料として出ていきます。1年では100%を超えます。バックテストで手数料を0にしていると、この100%がそのまま収益として計上されますが、実運用ではその分が口座から差し引かれます。取引頻度の高い戦略ほど、手数料0のバックテストと実運用の曲線は急速に離れていきます。

先物ポジションにはファンディング(Funding)も加わります。無期限先物では8時間ごとにファンディングの受け払いが発生し、ロングが優勢な市場ではロングポジションがショートにファンディングを支払います。2024年8月初旬のBTC無期限先物のファンディングは、8時間ごとに約0.01%前後でした。1日3回なら約0.03%、1カ月なら約0.9%です。ポジションを長く保有するトレンドフォロー戦略が、このファンディングをバックテストに入れていなければ、保有期間が長いほど実運用の曲線は下押しされます。

手数料とファンディングは、1回の取引では見えにくく、取引が積み上がって初めて表に出るコストです。バックテストの年率リターンが高くても、取引頻度が高ければ実運用の純利益は大きく減ります。取引頻度を下げるとシグナル数が減り、統計的な信頼度が下がるというトレードオフがあるため、頻度と1取引あたりの期待値を合わせて見る必要があります。手数料を差し引いても残る期待値があって初めて、実運用で意味を持ちます。

1取引では小さな手数料が取引頻度に比例して収益を削り取ります

足の終値バックテストは、足の内部経路を知りません

日足の終値データで行うバックテストは、各足を始値・高値・安値・終値の4点としてしか知りません。足の中で価格がどの順番で動いたのかは、データに含まれていません。このデータ解像度の限界が、損切りと利確を同時に置く戦略で決定的な誤差を生みます。

ある足の高値が利確価格に届き、安値が損切り価格に届いたとします。2つの価格がどちらも同じ足の中で到達した場合、実運用の結果はどちらに先に触れたかで分かれます。利確に先に届けば利益で決済され、損切りに先に届けば損失で決済されます。しかし日足データには、高値と安値に到達した順序が含まれていません。バックテストエンジンはこの場合、どちらか一方の決められた仮定に従います。損切りに先に到達したとみなす保守的な初期設定を使うエンジンも多くあります。どちらを仮定しても、実際の到達順序と異なる可能性があります。

8月5日のBTC日足は、この問題をそのまま示しています。日足は58,161ドルで始まり、高値58,306ドル、安値49,000ドルをつけ、54,019ドルで引けました。時間足に分解すると、価格は取引開始直後に高値58,306ドルをつけ、その後06:00まで下落を続けて49,000ドルまで落ちました。もし始値58,161ドルで入り、利確を58,300ドル、損切りを50,000ドルに置いたロングポジションがあったなら、利確と損切りの両方がこの1本の足の中で到達します。損切りを先に仮定するバックテストは、この取引を損失として処理します。しかし実際の経路では、取引開始直後に58,306ドルを先につけているため、利確の58,300ドルに先に到達し、利益で決済されます。同じ足、同じ2つの価格なのに、バックテストは損失、実運用は利益です。到達順序を知らないバックテストは、この取引の損益を逆に記録してしまいます。

この誤差を減らすには、バックテストデータの解像度をエントリー足より一段細かくする必要があります。日足戦略であっても、損切り・利確の処理は時間足や分足データで足内部の経路を確認するほうが、実運用に近くなります。足内部の経路を知らないバックテストは、損切りと利確が同じ足の中で両方到達する取引で最も大きく間違えます。

1本の足で利確と損切りの両方に触れるとき、到達順序が損益を分けます

サバイバーシップバイアスとルックアヘッドは曲線を上方に歪めます

ここまでの4つのポイントが実運用の曲線を下に引き下げるコストだとすれば、サバイバーシップバイアス(Survivorship Bias)とルックアヘッド(Look-ahead Bias)は、バックテストの曲線を上に膨らませる歪みです。前者のコストは実運用で初めて表面化しますが、この2つの歪みはバックテストの段階ですでに入り込んでいるため、より見つけにくくなります。

サバイバーシップバイアスは、現在生き残っている銘柄だけで検証すると生じます。アルトコインのトレンド戦略を検証すると言いながら、現在取引されている上位100銘柄だけをデータに使う場合、その100銘柄はすでに生き残った銘柄です。同じ期間に上場廃止になったり、価値を失ったりした数百のコインはデータから抜け落ちています。バックテストは生き残った銘柄の上昇だけを学習し、消えた銘柄の損失を学べません。過去によく上がったアルトだけを選んで検証すれば、ほとんどの戦略が良い曲線を描きます。実運用ではどのコインが生き残るかを事前に知ることはできないため、サバイバーシップバイアスを含むバックテストは、最初から実運用とは異なる母集団を見ています。

ルックアヘッドは、未来のデータが過去時点の判断に漏れ込むときに起こります。よくある例は、足が確定する前に終値を使うことです。進行中の足の、まだ確定していない終値でシグナルを計算すると、実運用では知り得ない値をバックテストが先取りして使っていることになります。指標計算に未来の足を含めることや、データの正規化に全期間の統計量を使うことも、同じ種類の漏洩です。ルックアヘッドが入ったバックテストは、未来を一部見たうえで判断するため、非現実的になめらかな曲線を描きます。

この2つの歪みがより危険なのは、コストを入れ忘れた場合と違い、曲線をむしろ良く見せる点です。スリッページや手数料を入れ忘れたバックテストは、実運用ですぐ失望につながります。一方、サバイバーシップバイアスやルックアヘッドを含むバックテストは、検証段階で良い成績を出し、自信を強めます。その自信で実資金を投入してから、初めて曲線が分かれます。バックテストを信じる前に、データの母集団と時点処理を疑う必要があります。

生き残った銘柄だけが検証に入り、消えた銘柄の損失はデータから抜け落ちます

現実的なバックテスト設定を確認するチェックリスト

上の5つのポイントをバックテスト設定に反映すれば、実運用の曲線との差を縮められます。バックテストを回す前に、次の項目を確認します。

  • [ ] 約定タイミング: エントリーと決済は次の足の始値で処理します。シグナル足の終値をエントリー価格として使いません。終値トリガー戦略なら、次の足の始値約定を基本設定にします。
  • [ ] スリッページ: 1取引あたり最低5bp以上をコストとして入れ、ボラティリティの大きい取引にはより高いスリッページを適用します。スリッページ0の設定は使いません。
  • [ ] 手数料・ファンディング: 往復手数料は取引所のテイカー基準(通常0.08%〜0.2%)で入れます。先物であれば、8時間ごとのファンディング(例: 0.01%前後)を保有期間に比例して差し引きます。
  • [ ] データ解像度: 損切り・利確を同時に置く戦略では、エントリー足より一段細かいデータ(日足戦略なら時間足以下)で足内部の経路を確認し、到達順序を処理します。
  • [ ] 母集団: 上場廃止・消滅した銘柄を含め、当時の時点そのままの銘柄集合で検証します。現在生き残っている銘柄だけで検証しません。
  • [ ] 時点処理: すべてのシグナル計算が、確定済みの足の値だけを使っているか、未来の足や全期間の統計量が漏れ込んでいないかを確認します。

この6項目をすべて反映したバックテストのリターンは、コスト0で回した曲線より低く出ます。その低くなった曲線のほうが、実運用で期待できる収益に近いものです。

バックテストと実運用を並べて追跡すると、乖離の原因を絞り込めます

現実的な設定でバックテストを行っても、実運用と完全に一致するわけではありません。残った差の原因を絞り込むには、実運用を始めた後、同じ期間のバックテスト曲線と実運用曲線を並べて比較します。2本の曲線が分かれる取引を1つずつ確認すると、どの地点で前提が崩れたのかが見えてきます。

エントリー価格の差が大きいなら、約定タイミングまたはスリッページの問題です。損切り・利確の取引で結果が反転しているなら、足内部の経路の問題です。累積コストが想定より大きいなら、手数料・ファンディングを低く見積もっています。乖離を取引単位で追っていけば、5つのポイントのうちどれが最も大きく作用したのかを絞り込めます。そしてその地点をバックテスト設定に反映し直すことで、曲線を実運用に近づけていきます。

バックテストは、戦略の方向性を検証する道具です。実運用の収益を事前に教えてくれる道具ではありません。終値で約定するという前提を疑うところから始め、スリッページ、手数料、データ解像度、サバイバーシップバイアス、ルックアヘッドまで点検すれば、バックテスト曲線は、実運用を見積もるための道具に変わります。2本の曲線がなぜ分かれるのかを説明できるようになって初めて、バックテストの数字を実運用の判断に使えるようになります。