EURGBPのZ-scoreを使った継続戦略(R130B)。全テストでIS avg=+10〜12pip、Gate 3通過候補に見えました。 しかしコードを精査したところ、「バーcloseでZ-scoreを計算し、同じバーのopenでエントリーする」 という1時間先読みバイアスが発見されました。バーの終値が分かる前の時点でエントリーしていたことになります。 修正後(R130C)は全テストでIS avg=−2pip。当研究所がバイアスを自己摘発した記録です。
EURGBPはEURとGBPの相対価値を表す「ペアのペア」であり、EURまたはGBP固有のニュースに鋭く反応します。 Z-scoreが高い(EURがGBPに対して相対的に高位)状態が続く場合、その継続フローに乗る——という仮説です。
Z-score(過去W期間の終値からの標準偏差単位の位置)が閾値(2σまたは1.5σ)を超えた場合、 その方向(継続LONGまたは継続SHORT)でエントリー。4時間または8時間保有。 コスト想定は2.4pip(EURGBP H1スプレッド)。
旧版の全8テストで、IS avgは+9.74〜+11.99pip。コスト2.4pip控除後でも全テストで大幅プラスでした。 全方向・全保有時間・全閾値で均一に機能しているように見え、「EURGBPには確実なモメンタムエッジがある」と見えました。 事前登録済みテストでのGate 3通過候補に浮上しました。
本物のエッジは通常、条件・方向・パラメータによって強弱がばらつきます。 全テストが「均一に強い」場合、データリーク(先読みバイアス)やコード誤りを最初に疑うべきです。 異常に安定した強さは「エッジの強さ」ではなく「バイアスの一定性」を示している可能性があります。
コードを精査した結果、以下の実装誤りが判明しました。
バー i の始値(open[i])でエントリーする場合、Z-scoreの計算に使える情報は バー i の開始時点まで(close[i-1]まで)でなければなりません。 しかし旧版は close[i](バー i の終値、つまり1時間後に確定する値)を使っていました。 Z > 2σ = バー i が大きく上昇して終わった = そのバーの内部上昇(約12pip)をエントリー価格に先取りしていたことになります。
修正版(open[i+1]でエントリー)の全8テスト:IS avg = −1.85〜−2.42pip(コスト2.4pip控除後)。 全てのパラメータ・保有時間・方向でマイナスでした。
| テスト | 旧版 IS avg(pip) | 修正版 IS avg(pip) | バイアス量(pip) |
|---|---|---|---|
| Z20 hold=4h | +9.91 | −2.42 | +12.3 |
| Z40 hold=4h | +9.74 | −2.11 | +11.9 |
| Z20 hold=8h | +10.22 | −2.33 | +12.6 |
| Z40 hold=8h | +11.99 | −2.30 | +14.3 |
バイアスは全テストで+12〜+14pipと一定しています。これはEURGBPのH1バーの平均レンジ(15〜20pip)の大部分に相当します。 バイアス量が均一なことが、旧版の「全テストで均一に強い」という異常な安定性の原因でした。
1. Z-score計算に close[i] を使う場合、エントリーは open[i+1](次バー始値)にすること。
2. 「バーcloseシグナル→同バーopenエントリー」は同バー内部移動を先食いする。禁止。
3. 全テスト・全方向で均一に強いエッジが出た場合は、まずデータリークを疑う。
4. バックテストライブラリが「バー完成時刻のシグナル → 翌バー始値エントリー」を自動的にシフトしているか確認する。
バイアスを発見した時点でR130Bの結果を黙って削除し、修正版のマイナス結果だけを記録することもできました。 しかし「バイアス有りの結果が有望に見えた」という事実こそが最も学習価値が高いため、両方を公開します。
この先読みバイアスパターン(close[i]シグナル→open[i]エントリー)は、 他の研究でも起きえます。特に移動平均・Z-score・ボリンジャーバンドなどの「バーclose確定指標」を 使う場合は、エントリーを必ず次バー(i+1)のopenに設定することが原則です。 当研究所は全Pythonスクリプトにこのチェックを追加しました。
当研究所の全バックテストはエントリータイミングの先読みチェックを必須化しています。 バイアスなしの検証でMT5(Strategy Tester)照合まで通過した研究のみが、プロダクトになります。
検証条件: 対象=EURGBP(H1)/期間=IS 2020–2024(R130B旧版・R130C修正版とも同一IS期間)/ OOS 2025は全バージョンで封印維持/R130B=先読みバイアス有り(無効・参照のみ)/R130C=修正版(有効・棄却)。 掲載した数値はすべてPythonバックテストの実測値であり、MT5(Strategy Tester)照合・フォワードテストは実施していません。
免責: 本ページは検証プロセスと棄却記録の開示を目的とした研究ノートです。投資助言ではありません。 バックテスト結果は過去データに基づくものであり、将来の利益を保証するものではありません。FX取引には元本割れのリスクがあります。 図表はすべて実データ(検証レポート)からの再描画であり、生成AIによる作画は含みません。