3段階のフォワード
最終テストに合格しても(あるいは保留でも)、いきなり通常の資金で運用はしません。未来のデータで確かめたいことは、段階ごとに違うからです。
- デモ(またはペーパー):お金を使わずに、シグナルが仕様どおりの時刻に出るか、注文の方向と決済がルールどおりか、欠損や時刻のずれで見送るべき日を正しく見送っているかを確かめます。
- 少額:実際のスプレッド、滑り(注文した価格と約定した価格の差)、約定拒否、スワップ、そして自分がルールを破らずに実行できるかを確かめます。デモの約定は業者によって実際の口座より有利なことがあり、ここで初めて見えるものがあります。
- 通常配分:事前に決めたリスクの上限まで、段階的に資金を増やします。増やした後も監視は続けます。
段階を進める条件は、期間ではなく件数と局面で決めます。1日1回しか取引しない戦略は、数週間では判断に足る件数が集まりません。 Bさんの最終テストは3年7か月で561件でした。フォワードで同じくらいの信頼区間の幅を得るには、同じくらいの年月がかかるということです。 何件たまったら判定するか、どんな相場の局面(円高・円安、ボラティリティの高低など)を含むまで待つかを、始める前に書きます。それでも、未来が過去と同じ性質を持つ保証はありません。
2人をフォワードに進めるか
前回の判定を受けて、AさんとBさんの2人がフォワードに何を持ち込むかを並べます。
| 最終テストまでの結果 | フォワードの扱い | 停止基準で特に見るもの | |
|---|---|---|---|
| Aさん | 平均 +5.61 pips だが95%CI [−1.76, +12.98]、DSR 0.002、比較対象 p=0.174、置換検定2 p=0.21。事前の区分では形式上保留(上級コースの区分なら棄却) | 進めない。上級コースの区分なら棄却にあたり、フォワードで確かめる前に仮説として弱い | 仮に動かすなら、損益ではなく「同じ時刻に無作為な日に買った場合」との差。円安が続く限り損益はプラスになり、損益だけの停止基準では止まらない |
| Bさん | 平均 +4.42 pips(561件)、4年すべてプラス。悪化コストのCI下限 −0.21、比較対象C1 p=0.084 が不合格で保留 | 保留のまま、ルール・コード・N_B=1 を変えずにデモへ | 不合格だった2項目。実際のコストが悪化の1.0 pipsに近づいていないか、方向を無作為にした場合との差が広がるか |
Aさんの行にあるとおり、損益だけを見る停止基準は、相場の流れに乗っているだけのルールを止められません。円安の間は勝ち続け、流れが変わった後で大きく負けて初めて止まります。フォワードでも、比較対象との差を監視の対象に入れます(第10回)。
このコースのデータは2026年7月31日までです。2026年8月以降のドル円のデータを取り込んだ後、Bさんのデモの記録(件数、1取引の平均と信頼区間、比較対象との差、停止基準に当たったかどうか)を、この節に追記します。 追記するときも、ルールと停止基準は、この回を書いた時点のものから変えません。
何を記録するか
フォワードの記録は、損益だけでは足りません。損益が想定より悪いとき、それがシグナルが弱くなったせいなのか、約定が悪くなったせいなのか、実装が違うせいなのかを、損益の数字からは区別できないからです。 最低限、次の項目を1取引ごとに残します(研究ログの書き方はトレード日誌 第1回)。
- 版の情報:仮説ID、ルールの版、コードの版、データ提供元。途中で何か変えたら、変えた日と理由。
- 時刻:シグナルが出た時刻、注文を出した時刻、約定した時刻。サーバー時刻とJSTの両方。
- 価格:ルールが想定した約定価格(次の足の始値)、実際の約定価格、その時のスプレッド、滑り、手数料。
- テスターの値:同じ期間を後からテスター(またはPythonの検証コード)で回したときの、同じ取引の損益。
- ルールどおりか:見送り、早めの利確、損切りの移動など、人が介入したかどうか。
- 比較対象:同じ日・同じ時刻・同じ保有時間で方向だけ無作為にした場合など、事前に決めた比較対象の成績。
中でも大事なのがテスターの値と口座の値を分けて記録することです。下の図は第9回で見たスキャルEAの取り上げる窓(2025年で最適化し、2026年1〜6月に運用)で、同じルール・同じ取引を、テスターの前提(シグナル足の終値で約定・スプレッド0)と口座の条件(次の足の始値で約定・往復0.4 pipsと1.0 pips)で計算したものです。
運用期間の1取引の平均は、テスターの上で +0.369 pips(95%信頼区間 [+0.146, +0.593])、口座の条件(往復0.4 pips)で −0.044 pips([−0.267, +0.180])でした。 テスターの値だけを記録していれば「フォワードでも勝っている」と読め、口座の値だけを記録していれば「相場が変わって負け始めた」と読めてしまいます。両方を並べて初めて、差の原因がシグナルではなく約定とコストにあると分かります。
停止基準を先に決める
停止基準とは、「これが起きたら、いったん運用を止めて原因を調べる」という条件です。運用を始める前に決めます。 負けてから決めると、目の前の損失を見ながら線を引くことになり、「あと少し待てば戻るかもしれない」と線を後ろへずらしがちです。これは、結果を見てから合格ラインを動かすのと同じことです(第17回)。
停止基準は、次の5種類から組み立てます。
- 損益:1取引の平均が、事前に決めた範囲の下限を一定件数にわたって下回る。
- ドローダウン:最大DD(資金の山から谷までの下落幅)が、事前に決めたストレス想定を超える。
- 大きな勝ち・負けの頻度:大きな勝ちが減る、または大きな負けが増えて、事前に決めた範囲から外れる(次の項で説明します)。
- 比較対象との差:方向を無作為にした場合など、比較対象との差が縮んで消える。
- テスターと口座の差:実際のスプレッドと滑りが、検証で置いたコストの上限を超える。同じ期間をテスターで回した成績と口座の実績の差が、想定したコストの幅を超える。
技術的な停止基準も加えます。シグナルの時刻や注文の方向がバックテストの仕様と一致しない、データの欠損やタイムゾーンのずれが見つかった、業者の取引条件が変わった、といった場合は、成績に関係なくすぐ止めます。
大きな勝ち・大きな負けの頻度を先に決める
Timothy Masters は、戦略の劣化を見張る方法として、一定以上の大きさの勝ちと負けが、どのくらいの頻度で起きるはずかの範囲を先に決めておく方法を紹介しています (Better System Trader のインタビュー、35:01〜37:06)。 未使用データの取引から、不完全ベータ分布という道具を使って「将来は、少なくとも何%の取引で一定以上の勝ちが出るはず」「一定以上の負けは、多くても何%に収まるはず」という範囲を計算しておきます。
動画の説明用の例では、「少なくとも30%の取引で8%以上の利益が出るはず」だったのに、6か月後にそれが15%しか起きていなければ、戦略は劣化していると判断します。 負けの側も同じで、「8%以上の損失は多くても10%」のはずが20%の取引で起きていれば、劣化と判断します。 平均の損益は勝ちと負けが打ち消し合うので変化が見えにくいことがありますが、大きな勝ちと大きな負けの頻度は、それぞれ別に崩れ方を映します。
FXの短期売買に置き換えるなら、「+○pips以上の勝ち」「−○pips以下の負け」の頻度です。Bさんなら、損切りが東京レンジの中点なので、1取引の負けの大きさはその日のレンジの幅で決まります。大きな負けの頻度が急に増えたら、ボラティリティの局面が変わったか、損切りの約定が悪くなった可能性があります。 何pipsを「大きい」とし、どの頻度の範囲を許すかは、運用前に最終テストまでの取引から計算して記録します。
高頻度スキャルEAの教訓:テスターと口座の差を停止基準に入れる
第9回のスキャルEAは、1取引の優位がテスター上でも +0.14 pips しかなく、往復0.4 pipsのコストより小さいものでした(第9回)。 このような戦略では、損益の停止基準に当たる前に、コストの実測値が検証で置いた値を超えていないかを見るほうが早く異常に気づけます。停止基準には次の2つを入れます。
- 実コストの上限:1取引ごとの実際のスプレッドと滑りの合計の平均が、検証で置いた往復コスト(通常0.4 pips、判定に使った悪化1.0 pips)を一定件数にわたって上回ったら止める。
- 損益がゼロになるコストとの距離:コストを入れる前の1取引の平均は、そのまま「このコストまでならプラスに残る」上限です。スキャルEAの取り上げる窓では、次の足の始値・コスト0の学習期間の平均が +0.123 pipsでした。実コストがこの値に近い、または超える口座では、そもそも運用を始めません。
スキャルEAの場合、学習期間を口座の条件で計算した時点で1取引 −0.277 pips(95%信頼区間 [−0.416, −0.139])と、区間全体がマイナスでした。 テスターと口座の差をフォワードの前に記録していれば、運用の前に止められた戦略です。フォワードの停止基準は、検証の段階で見落とした問題を拾う最後の網ですが、検証の代わりにはなりません。
このスキャルEAのデータは、Aさん・Bさんの最終テストとは別に、テスターと口座の乖離を確かめるために検証者が追加した実験例です。検証者はその時点で2023〜2026年の相場を見ていたため、ルールは買いと売りを対称にし、同じ手順を39回繰り返した割合を客観的な指標とし、取り上げる窓(2025年→2026年1〜6月)を結果の前に固定しています。
劣化なのか、ただの不調なのか
フォワードで負けが続いたとき、一番難しいのは「ルールが効かなくなった(劣化)」のか「効いているが、たまたま悪い時期に当たった(不調)」のかの区別です。 劣化を不調と読めば損失が膨らみ、不調を劣化と読めば、まだ使えるルールを捨てることになります。どちらの誤りも、判断を運用中の気分に任せると起きやすくなります。
Bさんの長い歴史が、この難しさをよく示しています。探索期間(2005〜2016年)は12年中7年がプラスでしたが、2006年と2008〜2011年は大きなマイナスでした。 2005〜2022年を通した最大DDは 3,217 pipsで、取引の順番を2000回シャッフルしたときの95%点(2,394 pips)を超えていました(第13回)。 負けは1取引ずつばらばらに来るのではなく、年単位で固まって来るということです。取引をばらばらにしたシミュレーションから停止基準を作ると、Bさんのような戦略では、過去にもあった程度の不調で止まってしまいます。
CUSUM:小さなずれを積み上げて見る
不調と劣化を区別する道具の1つがCUSUM(累積和)です。考え方は単純で、1取引ごとに「実際の損益 − 基準の期待値」を足し上げていきます。 期待値どおりなら、足し上げた値はプラスとマイナスを行き来して0の近くにとどまります。期待値が本当に下がっていれば、マイナスのずれが積み上がって、下へ離れていきます。
- 基準の期待値:比べる相手となる1取引の平均。どの期間の成績を基準にするかも、運用前に決めます。最も良かった期間を基準にすると、警報が出やすくなります。
- 許容するずれ(k):この程度の下振れは気にしない、という小さな幅。小さな不調のたびに警報が鳴らないようにします。
- 警報の閾値(h):積み上がったずれがここを超えたら、診断のために一時停止する線。
大切なのは、k と h を運用中の損失を見て決めないことです。バックテストやシミュレーションで、「本当は劣化していないのに警報が鳴る頻度(誤警報)」と「本当に劣化したときに気づくまでの件数(検出の遅れ)」を計算し、その釣り合いで決めます。 Bさんのように負けが固まって来る戦略では、取引を独立とみなした閾値をそのまま使うと誤警報が増えます。式と閾値の決め方は、上級コースの運用中の変化検知で扱います。
CUSUMの警報も、大きな勝ち・負けの頻度の警報も、「エッジが消えた証明」ではありません。警報は「調べる時期が来た」という合図です。 警報が鳴ったら、ルールを疑う前に、データの欠損、時刻、注文、スプレッドの変化から順に調べます(停止後の診断順)。
負けに合わせて直さない
止めた後、あるいは止める前の段階で、一番起きやすい過剰最適化が「負けに合わせた修正」です。 「最近は金曜に負けているから金曜を外す」「損切りをあと5 pips広げていれば、先月の3回の負けは避けられた」。どれも、運用中のデータを見てルールを選び直しています。 Aさんが探索期間で負けた日を見てフィルタを足したのと、使っているデータが新しいだけで、やっていることは同じです(第3回)。
Arnott, Harvey, Markowitz の論文「A Backtesting Protocol in the Era of Machine Learning」(Journal of Financial Data Science, 2019)は、バックテストで自分をだまさないための確認項目を7つの分類にまとめています。 第1分類の「研究の動機」(事前の経済的な理由)は第6回で扱いました。運用中の話は、第5分類の「モデルの動き」にあります。 そこには、構造変化に注意すること、同じ手法の混雑に注意することと並んで、「運用中のモデルをいじらない」という項目があります。
論文の説明はこうです。運用中のモデルが期待ほどの成績を出さないのは、驚くことではない。バックテストはある程度過剰最適化されているはずだからだ。 そこで、直近の、今や学習データになったデータへの当てはまりを良くしようとモデルをいじりたくなる。失敗への自然な反応だが、そうした修正はたいてい過剰最適化をさらに進め、実際の運用成績をもっと悪くしうる。 同じ論文は第4分類でも、「未使用データで失敗した理由を見てモデルを直し、学習データでも未使用データでも効くようにしたら、それはもう未使用データの検証ではない」と書いています。
事前に決めた再最適化と、その場の修正は別物
「定期的にパラメータを最適化し直す」戦略もあります。第15回で見た高頻度スキャルEAの例では、直近1年で最適化して次の6か月に使う、という手順を最初から決めていました。 このようにいつ、どのデータで、どう選び直すかが事前に決まっている再最適化は、ルールの一部です。その手順そのものの良し悪しは、ウォークフォワードで検証します(第15回)。 問題になるのは、負けを見て、決めていない時期に、決めていない方法で選び直すことです。これは手順の外で試行を1回増やしたことになり、Nに数えなければなりません(第8回)。
停止基準そのものにも同じことが言えます。損失が出るたびに基準を広げれば、基準は機能しません。基準を変えたいときは、変えた日と理由を記録し、新しい研究として扱います。上級コースの再検証の扱いでは、以前の最終テストやフォワードの期間を再び「未使用」と呼ぶことはできない、としています。
停止後の診断順
止めた後は、原因を次の順に調べます。上から順に、確かめやすく、直しても過剰最適化にならないものが並んでいます。
- データ:欠損、タイムゾーン、価格の配信元、日足の境界、夏時間の切り替え。
- 実装:先読み、シグナルの判定、注文、決済、ロット計算が、検証コードと同じ動きをしているか。
- 執行:スプレッド、滑り、約定の遅れ、約定拒否、業者の取引条件。テスターと口座の差はここで見ます。
- ルール遵守:見送り、早めの利確、損切りの移動など、人の介入がなかったか。
- 市場構造:ボラティリティ、参加者、規制、金利、通貨間の相関の変化。
1〜4の原因は、「検証したルールが、そのとおりに実行されていなかった」という問題です。直した後はルールを変えずに、デモか少額に戻って再確認します。ここで直すのは、検証したルールに実行を合わせることであって、ルールを負けに合わせることではありません。 5の市場構造の変化で、仮説の理由(Bさんなら「ロンドン勢の参加でレンジの外の注文が連鎖する」)が成り立たなくなったと判断したら、戦略を休止・終了します。 そのルールを直して続けたいなら、それは新しい仮説です。別のIDを付けてNに加え、第6回の事前登録からやり直します。
よくある間違い
「テスターで最近の期間を回し直したら勝っていたので、フォワードも合格」
テスターで後から回した成績は、フォワードではありません。確かめたのは「テスターの前提(スプレッド0や終値約定)の世界で通用するか」だけです。 第9回のスキャルEAの窓は、テスター上の運用期間が +1,397 pips、口座の条件(往復0.4 pips)では −165 pipsでした。フォワードは口座の条件で、テスターの値と分けて記録します。
「連敗したので、すぐに廃止する」
連敗は、ルールが効いていても起きます。Bさんは探索期間の中に、2008〜2011年のように負けが続いた時期を抱えていました。 廃止するか続けるかは、連敗の長さの印象ではなく、事前に決めた停止基準と件数で判断します。
「損失が出るたびに、停止基準を少し広げる」
基準を後から広げれば、どんなルールも止まらなくなります。基準を変えたいなら、変えた日と理由を記録し、新しい研究として扱います。
「止めている間に、負けた取引を見てパラメータを直し、すぐ再開する」
運用中のデータを学習データに変えてしまう、最も典型的な失敗です。直したルールは N+1 の新しい仮説で、確かめるには直した日より後の新しいデータが必要です。
実戦課題
自分の戦略(または最終テストを終えた仮説)について、運用を始める前の「フォワード計画書」を1枚作ります。
- 段階と進む条件を書く:デモ・少額・通常配分のそれぞれで、何件たまったら、どの条件を満たせば次へ進むかを書きます。期間ではなく件数と局面で書きます。
- 記録の列を作る:シグナル時刻、想定価格、実約定価格、スプレッド、滑り、テスターで同じ期間を回したときの損益、比較対象の損益、介入の有無。
- 停止基準を5種類で書く:損益、ドローダウン、大きな勝ち・負けの頻度の範囲、比較対象との差、テスターと口座の差(実コストの上限と、損益がゼロになるコスト)。数値は最終テストまでの結果、DDの分布、ストレスコストから決めます。
- CUSUMの k と h を決める:バックテストの取引で、誤警報の頻度と検出の遅れを確かめてから決めます。負けが年単位で固まる戦略なら、取引をばらばらにしない方法で確かめます。
- 停止後の診断順と、直してよいものの範囲を書く:技術的な不一致は直して再確認、ルールの変更は新しい仮説、と書き分けます。日付を付けて研究ログに保存し、その後でデモを始めます。
やるべきこと/やるべきでないこと
| やるべきこと | やるべきでないこと |
|---|---|
| 停止基準を運用前に決め、デモ→少額→通常配分と段階的に資金を増やす | 最終テストに合格したら、すぐ通常の資金で運用する |
| 段階を進める条件を、件数と局面で決める | 「1か月勝ったから」と期間だけで段階を上げる |
| テスターの値と口座の値を分けて記録し、その差を停止基準に入れる | テスターで最近の期間を回し直した成績を「フォワード」と呼ぶ |
| 大きな勝ち・大きな負けの頻度の範囲と、比較対象との差を監視する | 損益だけを見て、相場の流れに乗っているだけのルールを続ける |
| CUSUMなどの閾値を、誤警報の頻度と検出の遅れから事前に決める | 連敗の印象や、損失額を見てから止めるかどうかを決める |
| 止めたらデータ→実装→執行→ルール遵守→市場構造の順に診断する | 負けに合わせてパラメータを直し、Nを数えずに再開する |
| ルールを直すなら新しい仮説として別のIDを付け、N+1で新しいデータを待つ | 停止基準を、損失が出るたびに広げる |
チェックリスト
次の回に進む前に、以下が自分の言葉で説明できるか確認してください。
- デモ・少額・通常配分で、それぞれ何を確かめるか
- 段階を進める条件を、期間ではなく件数と局面で決める理由
- 損益だけの停止基準では、相場の流れに乗っているだけのルールを止められない理由(Aさん)
- テスターと口座の差を停止基準に入れる理由と、損益がゼロになるコストの読み方(高頻度スキャルEAの教訓)
- 大きな勝ち・大きな負けの頻度の範囲を先に決めて劣化を見張る方法(Masters)
- CUSUMの考え方と、閾値を運用中の損失で決めない理由
- 運用中にモデルをいじると過剰最適化が進む理由(Arnott・Harvey・Markowitz の第5分類「モデルの動き」)
- 停止後の診断順と、直してよいもの・新しい仮説として扱うものの区別
ミニテスト
4問で確認します。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。
Q1. 停止基準を決めるべき時点は?
損失を見てから決めると、目の前の結果に合わせて線を引くことになります。結果を見てから合格ラインを動かすのと同じで、事前に決めることに意味があります。
Q2. 第9回のスキャルEAは、テスター上の運用期間が +1,397 pips、口座の条件(次の足の始値・往復0.4 pips)では −165 pipsでした。フォワードの記録と停止基準について正しいのは?
両方を並べて初めて、損益の差がシグナルではなく約定とコストから来ていると分かります。1取引の優位が小さい戦略ほど、損益の停止基準より先に、コストの実測値で異常に気づけます。
Q3. CUSUMの警報の閾値の決め方として正しいのは?
運用中の損失を見て閾値を動かせば、停止基準は機能しません。またBさんのように負けが年単位で固まる戦略では、取引をばらばらにした閾値は誤警報を増やします(Bさんの最大DD 3,217 pips は、シャッフルの95%点 2,394 pips を超えていました)。
Q4. フォワードで負けが続き、「金曜を外せば先月の負けは避けられた」と気づいた。正しい扱いは?
負けを見て直した時点で、運用中のデータは学習データに変わります。Arnott・Harvey・Markowitz の第5分類「モデルの動き」の「運用中のモデルをいじらない」が指摘するとおり、こうした修正はたいてい過剰最適化をさらに進めます。