FXにおけるバックテストの仕組み:定義、入力、出力、限界
定義と、バックテストが目指していること
FXにおけるバックテスト(backtesting)とは、過去の市場データに対して、あらかじめ定めたルールベースの手順を実行し、それがどのように振る舞ったかを確認することです。言い換えると、トレードのアイデアを明確な条件に翻訳し、その条件を過去の時点に適用した場合に何が起きるかをシミュレーションします。
重要なポイントは、バックテストはデフォルトでは予測ツールではないということです。バックテストは、特定の前提条件のもとでの評価を生成します。つまり、使用する過去データ、取引コストと執行(execution)をどう扱うか、そして意思決定がいつ行えるとモデル化するか、ということです。
シンプルなモデル:入力、プロセス、出力
バックテストを理解するための有用な方法は、明確な入力と出力を持つループとして捉えることです。
指定しなければならない入力
- ルールセット(意思決定の定義):いつトレードを開始し、調整し、クローズするかの正確なロジック。「ルールベース」であることが重要なのは、曖昧でない条件が必要だからです(例:過去データから計算されるインジケーター値に基づく、または価格水準に基づく)。
- 過去データ:シミュレーションに使用する価格系列です。さらに、タイムスタンプが何を表しているのか、またテスト対象期間に対してデータセットが完全かどうかも明確にするべきです。
- 取引コストの前提:典型的にはスプレッドと手数料が含まれ、加えてスリッページのモデル(シミュレーション上の約定価格と、想定する執行価格との差)も含まれます。これらを無視したり簡略化したりすると、現実的な執行が許す範囲よりも良い評価になってしまう可能性があります。
- 執行とタイミングのモデル:トレードがどのように約定するか(マーケット vs. 指値ロジック)、価格バー/ティックに対して注文がいつ置かれると仮定するか、そして即時約定(instant fills)を想定するかどうか。
- ポジションとリスクの取り扱い(使用する場合):手順にポジションサイズやエクスポージャー制限が含まれるなら、ポジションをサイズするために使うアルゴリズムと、エグジットを管理する方法を明記する必要があります。
- テスト設計:時間窓(複数ある場合)と、構成を比較するつもりがあるなら、データをトレーニング期間と評価期間にどう分けるか。
プロセス
バックテストは一般に次の順序に従います:
- 意思決定時点までに利用可能なデータから、必要な値を計算する。
- ルールセットを適用して、トレードを開始/クローズすべきかを判断する。
- シミュレーション上の意思決定を、執行モデルを使って約定に変換する。
- 実現した損益(profit and loss)とコストを使って、口座状態を更新する。
- 過去のタイムラインの各ステップごとに繰り返す。
通常、確認する出力
目的に応じて、出力には次のようなものが含まれます:
- トレード単位の結果(トレードごとの損益、保有時間の分布)。
- エクイティカーブまたは口座残高の推移(時間経過に伴う変化)。
- リスク関連の指標(ドローダウンの大きさ、リターンのばらつき)。
- 要約統計(平均、勝ち/負けの回数)および、異なる期間にわたる一貫性。
これらの出力は、「将来に起きるべきこと」を説明するものではなく、シミュレーションの中で何が起きたかを記述している、と考えることができます。
例による検証: 「正しいテスト」が要求するもの
バックテスト設定の簡略化した例を考えてみましょう。次のような状況だと仮定します:
- バーのクローズ時点、またはそれ以前の情報だけを使って「エントリー」と「エグジット」を決めるルールセットがある。
- スプレッドとスリッページの見積もりを含むコストモデルがある。
- 意思決定バーに対して定義された価格で約定する執行ルールがある。
テストを意味のあるものに保つために、次の前提も明示する必要があります:
- 意思決定がバーのクローズで行われるなら、約定は次に利用可能な取引可能な価格のタイミングで起きる(または、データの粒度に整合する現実的な近似で起きる)と仮定しなければならない。
- スリッページを使うなら、それがどのように適用されるかの方法が必要です(一定量、分布ベース、または条件に紐づくルール)。
よくある「落とし穴」は、意思決定時点では知り得なかった情報を使うことです。これはしばしば*先読みバイアス(look-ahead bias)*として説明されます。たとえば、ルールセットが現在のバーの条件を計算するのに、意図せず将来のバーを使ってしまうと、バックテストはパフォーマンスを過大評価してしまう可能性があります。
限界、リスク、失敗パターン
バックテストの結果は、現実の市場には不確実性があり、シミュレーションには単純化があるため、誤解を招くことがあります。
重大な限界
- 過去の関係は変わり得る:ある期間で見られたパターンが繰り返されないことがあります。特に、市場構造や参加者の行動が変わる場合です。
- 執行の現実性:多くのバックテストは理想的な約定を仮定します。FXでは、取引コストと約定タイミングが結果に実質的な影響を与え得ます。
- データの品質と完全性:欠けたデータや、タイムスタンプの不一致は、シグナルやトレードのタイミングを歪める可能性があります。
- オーバーフィッティング:ルールを過度に厳密に調整して過去のノイズに合わせてしまうと、魅力的な結果が得られても汎化しないことがあります。
よくある失敗パターン
- 非現実的なコスト前提(スプレッドやスリッページを無視する)。
- 不整合なタイミング(同じバーの中で、実際には不可能な形でエントリーとエグジットを行う)。
- 結果を見た後でルールを変更する(別の評価期間なしに、テスト結果に基づいてルールを調整する)。
- テストした市場レジームが少なすぎる(特定のボラティリティやトレンド環境でしか機能しなかったルールセット)。
検証:定義を独立して確認する方法
FXにおけるバックテストを正しく理解しているかを検証するには、各必須の前提を説明できるか、そしてそれがシミュレーションのどこに入ってくるかに注目してください:
- ルールセットを述べられるか:曖昧なステップを残さずに、意思決定ロジックを正確に説明できますか?
- データのタイムラインを述べられるか:意思決定を計算するのに、データのどの部分が使われるか分かっていますか?
- 執行とコストを述べられるか:シミュレーション上のトレードがどのように約定価格になり、コストがどのように差し引かれるのか説明できますか?
- テスト構造を述べられるか:チューニングのために同じデータを再利用せずに、どのように評価するかを説明できますか?
- 少なくとも1つの限界を述べられるか:前提に関連する失敗パターンを挙げられますか(例:先読みバイアス、オーバーフィッティング、コストの現実性)?
この5つのチェックができれば、バックテストの仕組みについて独立して検証可能な理解を持っていることになります。また、結果を予測の証明として扱うことも避けられます。
次に掘り下げる質問
理解を深めたいなら、最も生産的な次のステップは、前提を1つずつ変えて(特に執行とコストのモデリング)、異なるバックテスト設定を比較し、その結果がどう変わるかを観察することです。これにより、シミュレーションのどの部分が評価を左右しているのかを特定しやすくなります。