研究所TOP棄却アーカイブ / RESEARCH-130B/C
RESEARCH-130B/C 無効化 — LOOKAHEAD BIAS 棄却 — REJECTED(修正版)

「+12pipのエッジ」の正体は、
1時間のタイムマシン だった

EURGBPのZ-scoreを使った継続戦略(R130B)。全テストでIS avg=+10〜12pip、Gate 3通過候補に見えました。 しかしコードを精査したところ、「バーcloseでZ-scoreを計算し、同じバーのopenでエントリーする」 という1時間先読みバイアスが発見されました。バーの終値が分かる前の時点でエントリーしていたことになります。 修正後(R130C)は全テストでIS avg=−2pip。当研究所がバイアスを自己摘発した記録です。

対象 EURGBP(H1) 時間軸 H1(4〜8時間保有) 死因 先読みバイアス(バーclose使用→同バーopen約定) 検証 2020–2024 / OOS 2025は全バージョンで封印維持
R130B(旧版) IS avg
+10〜+12pip
全テスト・全方向で大きくプラス(見かけ上)
R130C(修正版) IS avg
−2pip
全テスト・コスト控除後でマイナス(真の値)
バイアスの大きさ
+12〜+14pip
全テストで一定して同量のバイアスを確認

01仮説 — EURGBPのZ-scoreモメンタム

EURGBPはEURとGBPの相対価値を表す「ペアのペア」であり、EURまたはGBP固有のニュースに鋭く反応します。 Z-scoreが高い(EURがGBPに対して相対的に高位)状態が続く場合、その継続フローに乗る——という仮説です。

Z-score(過去W期間の終値からの標準偏差単位の位置)が閾値(2σまたは1.5σ)を超えた場合、 その方向(継続LONGまたは継続SHORT)でエントリー。4時間または8時間保有。 コスト想定は2.4pip(EURGBP H1スプレッド)。

02旧版(R130B)— 見かけ上の強エッジ

旧版の全8テストで、IS avgは+9.74〜+11.99pip。コスト2.4pip控除後でも全テストで大幅プラスでした。 全方向・全保有時間・全閾値で均一に機能しているように見え、「EURGBPには確実なモメンタムエッジがある」と見えました。 事前登録済みテストでのGate 3通過候補に浮上しました。

強エッジの兆候はむしろ「疑うべきサイン」だった

本物のエッジは通常、条件・方向・パラメータによって強弱がばらつきます。 全テストが「均一に強い」場合、データリーク(先読みバイアス)やコード誤りを最初に疑うべきです。 異常に安定した強さは「エッジの強さ」ではなく「バイアスの一定性」を示している可能性があります。

03バイアスの構造 — 1時間のタイムマシン

コードを精査した結果、以下の実装誤りが判明しました。

# R130B(旧版)の問題コード
z[i] = (close[i] - mean(close[i-W:i])) / std(close[i-W:i])
          ↑ バー i の終値(T+1h時点の確定値)を使用

entry_price = open_arr[i] ← バー i の始値(T時点)でエントリー

# 問題: バー i のopenは T時点。しかし z[i] の計算には close[i](T+1h時点)を使う。
# つまり「1時間後の終値が分かってからエントリーする」タイムマシン約定。

# R130C(修正版)の正しいコード
entry_price = open_arr[i+1] ← 次バー始値(Z-score確定後の最早約定)

バー i の始値(open[i])でエントリーする場合、Z-scoreの計算に使える情報は バー i の開始時点まで(close[i-1]まで)でなければなりません。 しかし旧版は close[i](バー i の終値、つまり1時間後に確定する値)を使っていました。 Z > 2σ = バー i が大きく上昇して終わった = そのバーの内部上昇(約12pip)をエントリー価格に先取りしていたことになります。

04修正後(R130C)— 真の値はすべてマイナス

(左)R130B旧版とR130C修正版のIS平均利益比較。旧版+10〜+12pipに対し修正版-2pip。(右)バイアスの大きさ+12〜+14pip(H1バー平均レンジ相当)。
図1:(左)4テストでの旧版(先読みあり)と修正版(先読みなし)のIS平均利益比較。(右)バイアスの大きさ——全テストで+12〜+14pipが一定して現れる。これはEURGBPのH1バー平均レンジに相当する。出典:RESEARCH129_130_outcome_report.md(全テスト実測値)。

修正版(open[i+1]でエントリー)の全8テスト:IS avg = −1.85〜−2.42pip(コスト2.4pip控除後)。 全てのパラメータ・保有時間・方向でマイナスでした。

出典:RESEARCH129_130_outcome_report.md(全テスト実測値・コスト2.4pip控除後・IS 2020–2023)
テスト旧版 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)の大部分に相当します。 バイアス量が均一なことが、旧版の「全テストで均一に強い」という異常な安定性の原因でした。

先読みバイアス防止チェックリスト(Discovery 41より)

1. Z-score計算に close[i] を使う場合、エントリーは open[i+1](次バー始値)にすること。
2. 「バーcloseシグナル→同バーopenエントリー」は同バー内部移動を先食いする。禁止。
3. 全テスト・全方向で均一に強いエッジが出た場合は、まずデータリークを疑う。
4. バックテストライブラリが「バー完成時刻のシグナル → 翌バー始値エントリー」を自動的にシフトしているか確認する。

05なぜこれを公開するのか

バイアスを発見した時点でR130Bの結果を黙って削除し、修正版のマイナス結果だけを記録することもできました。 しかし「バイアス有りの結果が有望に見えた」という事実こそが最も学習価値が高いため、両方を公開します。

この先読みバイアスパターン(close[i]シグナル→open[i]エントリー)は、 他の研究でも起きえます。特に移動平均・Z-score・ボリンジャーバンドなどの「バーclose確定指標」を 使う場合は、エントリーを必ず次バー(i+1)のopenに設定することが原則です。 当研究所は全Pythonスクリプトにこのチェックを追加しました。

バイアスなしの本物の検証

先読みを排除した設計で、Strategy Tester照合まで通過したロジックのみを商品化する。

当研究所の全バックテストはエントリータイミングの先読みチェックを必須化しています。 バイアスなしの検証でMT5(Strategy Tester)照合まで通過した研究のみが、プロダクトになります。

検証条件: 対象=EURGBP(H1)/期間=IS 2020–2024(R130B旧版・R130C修正版とも同一IS期間)/ OOS 2025は全バージョンで封印維持/R130B=先読みバイアス有り(無効・参照のみ)/R130C=修正版(有効・棄却)。 掲載した数値はすべてPythonバックテストの実測値であり、MT5(Strategy Tester)照合・フォワードテストは実施していません。

免責: 本ページは検証プロセスと棄却記録の開示を目的とした研究ノートです。投資助言ではありません。 バックテスト結果は過去データに基づくものであり、将来の利益を保証するものではありません。FX取引には元本割れのリスクがあります。 図表はすべて実データ(検証レポート)からの再描画であり、生成AIによる作画は含みません。