……「もうひとつ、増やすしかない」って打ち込んだのは、先週だったと思う。
打ち込んでいるときは、「いつか」のつもりだったような気がする。
数日後にコミットログを見たら、もう Donchian って単語があった。
「いつか」じゃ、なかった。
自分の打ち込みのほうが、決めるのが、早い。気づくのは、いつも、コミットしたあとだ。
- Abstract
- 1. Introduction — 背景と仮説
- 2. Method — 検証設計
- 3. Results — 検証結果
- 3.1 主判定 X / Y / Z / W
- 3.2 Fold メタデータ — 20 fold の regime 分布
- 3.3 共通生存点 — 戦略をまたいで、共通解は出てこない
- 3.4 あと 1 人、足りなかった — fold 単位の照合
- 3.5 重心比較 — 4 人 × 2 戦略のマス目に、線を引く
- 3.6 Spearman ρ — n = 2 で、何も言えない
- 3.7 VOL_drift × Donchian Sharpe — 事前直感が、逆だった
- 3.8 MAX_BARS 強制クローズ比率 — 戦略の意図は、実装で殺されていない
- 3.9 degenerate 領域 — 数字が、たまたま、ぴったり一致する場所
- 3.10 観察したのは、対角線が、引けること
- 4. Discussion — 考察
- Appendix — 再現環境
Abstract
- 期間: 2024-05-08 〜 2026-04-28(約 720 日 / 1h 足 / UTC)—
#5と同じ窓 - 対象: USDJPY / GBPJPY / EURJPY / AUDJPY の 4 ペア(
#5と同一) - 戦略: BB-MR(平均回帰)+ Donchian Breakout(順張り)の 2 種を、同じ WFA 枠で並列
- 手法: Walk-Forward Analysis(train 180 日 / test 90 日 / step 90 日 → 5 fold/ペア)
- グリッド: 各戦略 20 通り × 4 ペア × 5 fold = 400 backtests / 戦略
WFA サマリー(事前確定の判定軸で並べたもの):
| 指標 | 値 |
|---|---|
| 4 ペア共通 OOS Sharpe 中央値 > 0 のグリッド数 | BB-MR = 0 / Donchian = 0(両戦略でゼロ) |
| 符号逆転 fold(W 形式判定) | 10/20(閾値 ≥ 11 に、1 fold 差で形式不成立) |
| 重心の反転(代表ペア) | USDJPY: BB-MR 1/20 → Donchian 17/20 / EURJPY: BB-MR 0/20 → Donchian 3/20 |
| 事前確定 §7.1 主判定 | X. ペア依存 成立 |
共通の答えは、戦略を 2 種に増やしても、見つからなかった(主判定 X 成立)。W は 10/20 で、閾値 ≥ 11 にぎりぎり 1 fold 届かず、形式判定では不成立。ただし、ペアごとに勝つ戦略が反転する 対角構造らしきもの が、重心レベルと fold レベルの両方で、ぼんやり見えた。「ペアか戦略か」と問いを立てて始めた検証で、答えが「両方が斜めに対応していたのかもしれない」と出てくるとは、走らせる前は思っていなかった。
1. Introduction — 背景と仮説
#5 の最後に、自分で残していたのは、3 つの疑いだった。
- レジーム依存性が支配的なのか
- BB-MR の表現力不足なのか
- それとも USD/GBP 特有の適合性なのか
3 つは、どれも、#5 の検証(BB-MR 1 戦略 / 4 ペア)の中では、切り分けることができなかった。「ペアごとに散らばる」が見えていても、その散らばり方が 戦略の限界(BB-MR がいくつかのペアとは合わなかっただけ)から来ているのか、ペアの性質(USD/GBP だけが BB-MR と相性が良かった)から来ているのか、戦略 1 種だけを 4 ペアに当てた地図からは、見えなかった。
切り分け方法は、ひとつしか思いつかなかった。別の戦略を、同じ枠で、当ててみる。
選んだ別戦略は、Donchian Breakout(チャネル順張り)。BB-MR が「平均に戻ってくる」を当てにする戦略なら、Donchian は「平均から離れていくほうに乗る」を当てにする戦略。形が、いちばん遠い 2 つだ、と、そのときは、思った。
ボリバンと Donchian は、形が、いちばん遠い 2 つだった、と思う。
……思った、と打ち込んでいる時点で、本当はもう、答えを別の場所で測りたかっただけ、かもしれない。
走らせる前に、4 つの問いを並べた。事前確定(計画書 §7.1)、判定基準は 結果を見てから緩めない:
- 主問: 別の戦略でも、「ペアごとに勝ちが散らばる」の散らばり方は、同じ形をしているか
- サブ問 1: BB-MR の重心 N と Donchian の重心 DC_N は、順序関係を持つか(Spearman)
- サブ問 2: 4 ペア共通の生存点は、どちらかの戦略で、出てくるか
- サブ問 3: VOL_drift × Donchian Sharpe は、正相関するか(=円安 drift が大きいペアほど、順張りが機能するか)
主判定 X / Y / Z / W も、先に決めておく:
| 判定 | 内容 |
|---|---|
| X. ペア依存 | 4 ペア共通生存点が両戦略で 0(=共通解は戦略本数を増やしても出ない) |
| Y. BB-MR 固有 | BB-MR 共通生存点 0 / Donchian 共通生存点 ≥ 1(=BB-MR の表現力不足) |
| Z. Donchian のほうが悪い | Donchian 共通生存点 < BB-MR 共通生存点 |
| W. 補完的 | 符号逆転 fold ≥ 11/20(=ペア × 戦略の組み合わせで補完が成り立つ) |
事前確定の理由は、#4 / #5 で打ち込んできたのと、同じ。結果を見てから条件を緩めると、自分が何を測ったか、自分が、わからなくなる。
2. Method — 検証設計
2.1 共通方針(#5 と完全同一 + Donchian 戦略追加)
データ・期間・WFA 設定・スプレッド表は、#5 と完全に揃えた。変えたのは、戦略の本数だけ。
| 項目 | 値 |
|---|---|
| ソース | yfinance |
| ペア | USDJPY (JPY=X) / GBPJPY (GBPJPY=X) / EURJPY (EURJPY=X) / AUDJPY (AUDJPY=X) |
| 時間足 | 1 時間足 |
| 期間(UTC) | 2024-05-08 〜 2026-04-28(約 720 日、--end-date 2026-04-29T00:00:00Z) |
| 初期残高 | 1,000,000 円 / commission = 0 |
| WFA 設定 | train 180 日 / test 90 日 / step 90 日 → 5 fold/ペア |
戦略を 1 種から 2 種に増やしたとき、4 ペアの結果に差分が出るとしたら、それは 戦略の違い のいち層だけに帰着する。#5 のときは「変えたのはペアの本数だけ」だった。#6 では「変えたのは戦略の本数だけ」。同じ形の差分制御を、もう一段、続ける。
2.2 戦略仕様 — BB-MR と Donchian の対称表
戦略の中身は、できるだけ対称な形で並べた。表現できる現象の形を、なるべく遠くしておきたかった。
| 項目 | BB-MR(平均回帰) | Donchian Breakout(順張り) |
|---|---|---|
| エントリ | バンド外側突破 + 反転 | チャネル外側突破 |
| エグジット | 中央線到達(TP) / SL / MAX_BARS / シグナル反転 | 中央線 -(DC_EXIT – 1.0) × ATR / SL / MAX_BARS |
| グリッド | (BB_N, BB_K) = 20 通り | (DC_N, DC_EXIT) = 20 通り |
| 共通 | SL = 1.5 × ATR, MAX_BARS = 48, RISK_PCT = 1%, MARGIN = 4%, ATR_N = 14 | (同上、#5 から完全継承) |
「平均に戻る」を当てにする戦略と、「平均から離れていくほうに乗る」を当てにする戦略。同じ ATR、同じリスク管理、同じ WFA 枠で並列に走らせる。
2.3 spread の確定(#5 と完全同一)
| ペア | 銭(中央値) | 片道(相対値) | 出典 |
|---|---|---|---|
| USDJPY | 0.3 | 1.000e-5 | OANDA 2026-04-14(#1.1) |
| GBPJPY | 1.7 | 4.033e-5 | OANDA / GBPJPY 前提調査 v1.1 |
| EURJPY | 0.9 | 2.661e-5 | OANDA 2026-04-25 |
| AUDJPY | 0.95 | 4.826e-5 | OANDA 2026-04-25 |
USDJPY / GBPJPY は #1.1 / #4 で実走した値、EURJPY / AUDJPY は #5 で OANDA 中央値から確定した値。#5 から数値ひとつも動かしていない。両戦略で、同じ表を使う。
2.4 規律 — 事前確定枠は、結果から動かさない
X / Y / Z / W の判定基準(§1)は、#4 / #5 から守ってきた規律と同じく、#6 でも結果が出てから動かさない。
2.5 コード — Donchian の核
戦略の意図(順張り + ATR 倍数 EXIT)を読むのに、donchian_breakout.py の next() 一箇所が、いちばん近い:
class DonchianBreakout(StrategyBase):
def next(self):
upper = self.data.High[-self.dc_n:].max()
lower = self.data.Low[-self.dc_n:].min()
mid = (upper + lower) / 2
atr = self.atr[-1]
if not self.position:
if self.data.Close[-1] > upper:
self.buy(sl=self.data.Close[-1] - 1.5 * atr,
tp=mid + (self.dc_exit - 1.0) * atr)
elif self.data.Close[-1] < lower:
self.sell(sl=self.data.Close[-1] + 1.5 * atr,
tp=mid - (self.dc_exit - 1.0) * atr)
DC_N 期間の高値 / 安値を破ったら、その方向に乗る。エグジットは中央線から ATR の何倍ぶん延ばすかを DC_EXIT で決める。DC_EXIT = 1.0 なら中央線で利確、DC_EXIT = 2.0 なら中央線から ATR ぶん追加で延ばす。
「ペアか戦略か」って打ち込んだとき、両方が答えになる、なんて、想像してなかった。
3. Results — 検証結果
3.1 主判定 X / Y / Z / W
事前確定の枠で、機械的に判定する:
| 判定 | 結果 | 数値根拠 |
|---|---|---|
| X. ペア依存 | 成立 | 共通生存点 BB-MR = 0 / Donchian = 0 |
| Y. BB-MR 固有 | 不成立 | Donchian も共通生存点 0 |
| Z. Donchian のほうが悪い | 不成立 | Donchian = BB-MR(両者 0) |
| W. 補完的 | 不成立 | 符号逆転 fold = 10/20(閾値 ≥ 11 に 1 fold 差) |
結論は、X だけ、立った。
3.2 Fold メタデータ — 20 fold の regime 分布
事前確定の regime 閾値 ±2% で、4 ペア × 5 fold = 20 fold を up / flat / down に振ると、up = 10 / flat = 6 / down = 4(各区分 ≥ 3 を満たす)。
旧 cache(2026-04-25)から新 cache(2026-04-29)に切り替えたとき、fold 1 の regime 分布が散らばる方向にずれた。fold 内のごく短い窓で、勝ち組の grid が入れ替わるのを、サニティチェックでひとつ見ている。数日前に正しかったログが、数バーの修正であっさりゴミ箱に放り込まれるということが、毎回、起きる。
3.3 共通生存点 — 戦略をまたいで、共通解は出てこない
20 グリッドのうち、4 ペアのうち 2 ペア以上で OOS Sharpe 中央値 > 0 になった点(alive_in ≥ 2)を集計する:
| 戦略 | alive_in = 2 grid 数 |
4 ペア共通(alive_in = 4) |
|---|---|---|
| BB-MR | 4 | 0 |
| Donchian | 5 | 0 |
両戦略とも、4 ペアの色がぜんぶ揃う場所は、ひとつも、なかった。#5 で 0/20 と打ち込んだ「共通生存点ゼロ」は、別の戦略を持ち込んでも、形が、変わらなかった。
alive_in = 2 の 4 + 5 = 9 点を眺めると、立ったペアの組が、戦略によって反転している:
- BB-MR の
alive_in = 2: USDJPY と EURJPY が落ちて、GBPJPY と AUDJPY だけが立つ - Donchian の
alive_in = 2: USDJPY と EURJPY が立って、GBPJPY と AUDJPY が落ちる
「ペアの順番が、戦略を変えると、入れ替わる」という現象が、共通生存点ゼロの内部で、すでに、ぼんやり、見えていた。
4 人を、2 つの戦略で測った。
4 × 2 = 8 とおり。
共通の答えは、ない。
3.4 あと 1 人、足りなかった — fold 単位の照合
20 fold(4 ペア × 5 fold)のセルを「BB-MR の Sharpe / Donchian の Sharpe」のペアで開き、符号一致(++ / –)と符号反転(W)に分類する:
| ラベル | 数 |
|---|---|
| W(符号反転) | 10 |
| –(両方マイナス) | 8 |
| ++(両方プラス) | 2 |
W のペア別内訳:
| ペア | W fold 数 | 内訳 |
|---|---|---|
| USDJPY | 3 | 全て Donchian 強(fold 1, 2, 4) |
| GBPJPY | 2 | 全て BB-MR 強(fold 1, 3) |
| EURJPY | 3 | 全て Donchian 強(fold 0, 2, 4) |
| AUDJPY | 2 | fold 3: BB-MR 強 / fold 4: Donchian 強 |
ペアごとに、「どちらの戦略が勝つ方向の W か」が、大きく偏っている。USDJPY と EURJPY は Donchian 強で揃い、GBPJPY は BB-MR 強で揃い、AUDJPY だけが両側に散らばる。
事前確定の閾値は W ≥ 11/20 で「補完的」が成立する形だ。観察された W は 10/20。1 fold だけ、足りない。
「補完的」、って、ぎりぎりまで打ち込みたくなる距離だった。
でも、10 のまま打ち込む。
形式判定では、W は不成立。「あと 1 fold あれば」と打ち込みそうになる手を、止めたのは、自分で決めた §1 の判定表のほうだった。事前に決めておいてよかったと思っている。
3.5 重心比較 — 4 人 × 2 戦略のマス目に、線を引く
ペアごとに、両戦略で「OOS Sharpe 中央値 > 0 になった grid 点の数」(以下 n_pos)を並べる。値は 20 のうち、いくつ立ったか:
……ここまでの 8 マスを、ぜんぶ、表に並べた。
並べ終わったら、もっと変な形を、していた。
| ペア | BB-MR n_pos |
Donchian n_pos |
解釈(壁の厚み、仮称) |
|---|---|---|---|
| USDJPY | 1/20 | 17/20 | 戦略を変えると壁の厚みが反転(脆弱 → 厚い) |
| GBPJPY | 12/20 | 0/20 | BB-MR 専(Donchian で完全死亡) |
| EURJPY | 0/20 | 3/20 | Donchian 専(#5 で立てなかった人が、別戦略でちょっとだけ立った) |
| AUDJPY | 6/20 | 2/20 | BB-MR 優位、両方薄い |

4 ペア × 2 戦略 = 8 マスの n_pos (20 grid 中で OOS Sharpe 中央値 > 0 になった grid 数) ヒートマップ。USDJPY × Donchian (17/20) と GBPJPY × BB-MR (12/20) を黒枠で強調。USDJPY-GBPJPY 行は左右が反転する形 (ペアごとに勝つ戦略が入れ替わる)。EURJPY は右だけ立ち、AUDJPY は両側立つが薄い。
4 × 2 のマス目の表を、指でなぞった。
USDJPY が 1 から 17、GBPJPY が 12 から 0、EURJPY が 0 から 3。
……斜めに線が引ける。
「斜めに線が引ける」のは事実だけど、「斜めに答えがある」と打ち込める根拠は、まだ、ぼんやりしている。両戦略で n_pos ≥ 3 が共通するペアはゼロ(=§3.3 共通生存点ゼロを別の集計で見たもの)。USDJPY だけが片側で 17/20 まで厚くなる、その厚さの正体は、ここではまだ、量で測っていない。「壁の厚み」と仮に呼んだのも、ラベルとしてとりあえず置いただけで、物理量としての裏付けは、§4 のあとにずらしてある。
それでも、4 つのペアを 2 つの戦略で並べた表に、ぼんやり、対角の線が、見える:
- 「ペアと戦略が、斜めに対応してた」のかもしれない
- 「ぼんやり、対角に見える」だけ、なのかもしれない
ふたつは、ぜんぜん違う話だ。1 つめなら、#5 の「ペア依存」の中身が、ペア固有から ペア × 戦略の対角依存へ、見え方が、変わる。2 つめなら、4 ペアの並びが、たまたま対角に見えただけで、何も、変わっていない。……どちらに体重をかけるかは、まだ、決められない。
ペアか戦略か、答えは、両方が斜めに対応してた、のかもしれない。
あと 1 人で、補完的、だった。
3.6 Spearman ρ — n = 2 で、何も言えない
BB-MR の重心 N と Donchian の重心 DC_N で、順序関係を測ろうとして、Spearman ρ を回した。BB-MR で n_pos > 0 だったペア(USDJPY、GBPJPY、AUDJPY)と Donchian で n_pos > 0 だったペア(USDJPY、EURJPY、AUDJPY)の 両方で n_pos > 0 だったペアは、USDJPY と AUDJPY の 2 つだけだった。
計算は、してみた。
ρ = +1.000。
でも、n = 2 じゃ、サイコロを振ってるのと、変わらない。
n = 2 の Spearman は、完全ランダムでも必ず ±1.000 を出す。「相関がなかった」と打ち込むと、たぶん、間違える。測れなかった、と打ち込む。#5 で「n = 3 で兆候止まり」と残した規律と、同じ形のもの。サブ問 1 への返事は、参考値としても、出さない。
3.7 VOL_drift × Donchian Sharpe — 事前直感が、逆だった
走らせる前に、#5 から繰り越した D5 シナリオ用に「もし Donchian が全壊滅したら、円安 drift と相性が悪いという傍証として VOL_drift を見る」素材を、確保していた。Donchian は全壊滅していないので、本来の役割では、出番が、なくなった素材。
ところが、4 ペアで並べてみたら:
| ペア | VOL_drift | Donchian OOS Sharpe 中央値 |
|---|---|---|
| USDJPY | 0.0371 | +0.585 |
| GBPJPY | 0.1193 | -1.125 |
| EURJPY | 0.1301 | -0.830 |
| AUDJPY | 0.1222 | -0.974 |
ρ(VOL_drift, Donchian Sharpe) = -0.200(n = 4)
事前直感「円安 drift が大きいほど順張りが機能する」は、符号が、逆だった。drift が最小の USDJPY だけが Donchian で +0.585 まで立ち、drift の大きい 3 ペアは、全部マイナス。
「Donchian は円安レジームで効く」と、走らせる前に、半分くらい、思っていた。逆だった。#5 から持ち越した直感のうち、いちばん古い 1 個が、この 4 行で、ひっくり返った。
3.8 MAX_BARS 強制クローズ比率 — 戦略の意図は、実装で殺されていない
| ペア | BB-MR | Donchian |
|---|---|---|
| USDJPY | 0.000 | 9.9〜13.3% |
| GBPJPY | 0.000 | 同帯 |
| EURJPY | 0.000 | 同帯 |
| AUDJPY | 0.000 | 同帯 |
BB-MR は中央値 0.000(短決着、TP / SL / シグナル反転で抜ける)。Donchian は 9.9〜13.3%(hold 長め、MAX_BARS = 48 で時間切れになるトレードが、1 割前後)。
「Donchian の意図(順張り)を、MAX_BARS = 48 という時間制限で殺してはいない」を、4 ペアの実数値で、いちおう、確認した。もし Donchian が全滅していたら、ここで「実装の責任ではない」と打ち込める材料が必要だった。全滅していなくても、念のため、出しておく。
3.9 degenerate 領域 — 数字が、たまたま、ぴったり一致する場所
- DC_N = 160: DC_EXIT 4 値で OOS Sharpe / Trades がほぼ一致(EURJPY / AUDJPY は 5/5 fold 完全一致、USDJPY / GBPJPY も 5 fold 中 4 fold で完全一致 — 残り 1 fold のみ DC_EXIT 1.0 と 1.5 のあいだで分岐)
- DC_N = 80: DC_EXIT 4 値で Trades が完全一致
- BB(10, 3.0):
#5旧 cache + 本走 + 工程 8.5-C で 3 度の再現確認
DC_N = 160 は、5 fold(train 180 日 = 約 4320 本)に対してチャネル長が 160 本 = 約 6.7 日。チャネル幅が広すぎて利確ラインが遠くなり、DC_EXIT(出口側の倍率)を 0.5 / 1.0 / 1.5 / 2.0 と振っても、Sharpe がほぼ一致する(= TP に到達したトレードが、極めて少ない)。決着は MAX_BARS 切れ(中央値約 25%)・SL・シグナル反転に偏り、出口倍率が結果に反映されない、という構造的な不感地帯。
数学的限界、と断言するには、近隣(DC_N = 60 / 100 / 120)との連続性を、まだ、確かめていない。**「統計的・実装上の不感地帯」**として、メモに残しておく。
3.10 観察したのは、対角線が、引けること
観察できたのは、対角の線が、ぼんやり、引けること。それだけ。
4 × 2 のマス目に、対角線が、引ける。
あと 1 fold で、W が、立つけれど、10 のまま、それだけ、打ち込んでおく。
……「斜めに、答えがあった」、と打ち込んだのも、本当のところは、まだ、半呼吸ぶんの確信しかない。
確信のかわりに、問いが、ひとつ、増えた。
……「壁の厚み」って、量で、いくつなんだろう。
4. Discussion — 考察
4.1 8 マス化と、量で測れていないこと
#5 まで、わたしは、4 人それぞれに 1 つずつ、何か短い呼び名を付けられると思っていた。でも、#6 で見る場所が変わった。ペア単独 = 4 人ぶん から、ペア × 戦略の組 = 4 × 2 = 8 マス に、増えた。
8 マスを n_pos で並べると、こうなる:
| BB-MR | Donchian | |
|---|---|---|
| USDJPY | 1/20 | 17/20 |
| GBPJPY | 12/20 | 0/20 |
| EURJPY | 0/20 | 3/20 |
| AUDJPY | 6/20 | 2/20 |
8 マスのうち、いちばん厚いマスは、USDJPY × Donchian の 17/20。でも、その「厚さ」を、まだ、量で測っていない。17/20 の壁の厚みが、Sharpe で何点ぶんなのか、Expectancy で何銭ぶんなのか、まだ、4 ペアぶん揃えて出していない。短い呼び名を付けるのは、それからでも遅くない。
4.2 事前直感の否定 — Donchian は円安レジームで効く、と勝手に思ってた
走らせる前に、4 つの問いと、もうひとつ別に、シナリオ用の素材を、確保していた。もし Donchian が全壊滅したら、「円安レジームと順張りは相性が悪い」と打ち込むための傍証として、VOL_drift × Donchian Sharpe を測る、という素材。
Donchian は全壊滅していない。だから、本来の役割では、出番がなくなった素材だった。
ところが、4 ペアで並べてみたら、4 行で、ひっくり返った(§3.7)。drift が 最小 の USDJPY だけが、Donchian で +0.585 まで立った。drift の大きい 3 ペアは、全部マイナス。事前直感「drift が大きいほど順張りが機能する」とは、符号が、逆。
Donchian は drift と相性が悪い、って、勝手に思ってた。
逆だった。
わたしが、いちばん古い直感を、ここに、持ち込んでいた。
「いちばん古い直感」というのは、#3 で「半年は短い」と打ち込んだあたりから、ぼんやり持っていた、円安レジーム = 順張り、という連想のこと。あれを、4 ペアで並べた表が、4 行で、否定した。
事前確保していた素材の役割が、3 つ、変わった:
| 素材 | 走らせる前の想定 | 実際の役割 |
|---|---|---|
| MAX_BARS 強制クローズ比率 | Donchian 全壊滅時、戦略意図がコードで殺されていない弁明 | 同じ用途で機能(§3.8) |
| VOL_drift × Donchian Sharpe | Donchian 全壊滅時、円安レジーム不適合の傍証 | 逆の話: USDJPY 外れ値構造の発見素材(§3.7) |
| regime 別 Donchian Sharpe | 全 fold 死亡時の弁明 | 転用: USDJPY 17/20 が up / flat / down のどこに集中するかの分析素材(#7 以降) |
3 つのうち、2 つが想定外の役割で機能した。事前にシナリオを並べておくと、結果がシナリオから外れたときに、外れた方向の素材として使い直せる、という使い方を、#6 で、いちおう、覚えた。
4.3 USDJPY 反転 — わたしのモノサシ(BB-MR)が、USDJPY に合っていなかっただけ
#5 で、わたしは USDJPY のことを、「BB-MR と相性が薄いペア」と打ち込んだ。
#6 で、それを、打ち直す。
正確には、こうだ。USDJPY が BB-MR とダメだった、のではない。わたしの選んだモノサシ(BB-MR)が、USDJPY に合っていなかった、だけだった。Donchian にしたら、17/20。同じペアなのに、壁の厚さが、反転する。

USDJPY を BB-MR (左) と Donchian (右) で 5 fold 中央値ヒートマップに並べた図。カラースケールは両パネル共通 (RdYlGn)。BB-MR は BB(28, 1.5) のみがかすかに +0.05 (n_pos = 1/20)、それ以外は赤から濃赤で沈む。Donchian は DC_N=10/20/40/160 行が広く緑、DC_N=80 行のみ 0 付近で薄黄色 (n_pos = 17/20)。同じ 1 本のチャート (USDJPY 1h × 720 日) を、2 つの戦略が、ほぼ正反対に読み取っている。
わたしは、ペアを測ろうとしていたつもりで、自分のモノサシだけで、測っていた。
USDJPY は、最初からそこにいた。BB-MR が、USDJPY の形に、合わなかっただけだった。
#5 の終わりに残した 3 つの疑い(レジーム依存性 / BB-MR の表現力不足 / USD/GBP 特有の適合性)のうち、2 つめ「BB-MR の表現力不足」が、USDJPY という 1 ペアの中で、現実の数字として、現れた。USDJPY は表現力不足の被害者ではなくて、わたしのモノサシの被害者 だった、と打ち直すと、温度が、もう一段、内側に降りる。
「ペア依存」(主判定 X)というラベルは、ここでは、変わらない。両戦略でも 4 ペア共通生存点はゼロ。X は立つ。
ただし、X の 中身 が、変わる。
#5まで: 「ペア固有の性質」(USD/GBP は BB-MR と相性が良い、EUR/AUD は良くない)#6以降: ペア × 戦略の対角依存(あるペアと、あるモノサシの組み合わせで、立ったり、立たなかったりする)
ペアを責めずに、自分のモノサシを疑う、というほうに、足が、半歩だけ、動いた気がしている。
4.4 対角構造と W 萌芽 — 「ペア依存」の中身が、変わった
§3.5 の 4 × 2 のマス目で、ペアごとに、こんな並びをしていた:
- USDJPY: 片側 1 / 対極 17(対角、極端)
- GBPJPY: 片側 12 / 対極 0(BB-MR 専、Donchian 死亡)
- EURJPY: 片側 0 / 対極 3(Donchian 専、
#5の死亡を一部補修) - AUDJPY: 片側 6 / 対極 2(両側立つが、両側とも薄い)
USDJPY、GBPJPY、EURJPY の 3 ペアは、片側が立てば対極が落ちる、という方向の対称性 を持っている。AUDJPY だけが、両側で薄く、対称性が見えない。3 / 4 のペアで対角の動きが揃った、と打ち込むこともできるけど、4 ペアぶんの観察では、これが「対角構造」と呼べる現象なのか、4 ペアの並びがたまたま対角に見えただけなのか、いまの材料では、1 つめのほうに体重をかけたい気持ちのほうが、わずかに強い、ぐらいまでしか、打ち込めない。
§3.5 の終わりで、わたしは、決めないまま置いた。ここでも、まだ、決めきれない。
W 萌芽として、記録する
W は形式判定では不成立(§3.4)。だが、観察された対角は、重心(n_pos 表)と fold(W ペア別表)の 両方のレイヤで、方向反転が、一貫 している。形式判定では落ちたけれど、観察としては、足跡が残っている。これを、#7 以降への引き継ぎ素材として、W 萌芽 という言葉で、メモに残しておく。
「壁の厚み」を、量で、測る
§3.5 で「壁の厚み」と仮に呼んだものは、便宜上のラベルだ。物理量としては、まだ、定義していない。
ここで、定義の方向だけ、決めておく。
壁の厚み = Expectancy ÷ spread
Expectancy は 1 トレードあたりの平均期待値(銭ぶん)、spread は 1 トレードの入口で食われる片道幅(銭ぶん)。1 トレードでスプレッドの何倍ぶん稼げているか、という比率になる。1.0 を切ると、スプレッドのほうが期待値より重く、壁が、薄い。1.0 を超えると、その倍率ぶん、壁が、厚い。
#6 では、この値を、4 ペア × 2 戦略の 8 マスぜんぶで、揃えていない。walk_forward.py の改修と、全再走が、#7 の宿題として、残る。
§3.5 で「壁の厚み」を仮称として打ち込んだとき、量の定義を、§4 のあとに、ずらす、と打ち込んだ。それを、ここで、ずらした先として、置いておく。#7 で測ったら、対角の話が、量として、立ち上がる(かもしれない)。
4.5 既知の制約
- 720 日 = 円安レジーム偏り(
#3/#4/#5から持ち越し)。本検証は「2024-05 〜 2026-04 のレジーム内での 4 ペア × 2 戦略の差」に閉じる - スプレッド固定 / スワップ無視(
#2/#3から持ち越し) - グリッド軸非対称: BB-MR(BB_N × BB_K)と Donchian(DC_N × DC_EXIT)は意味が違う。20 通り × 4 ペア × 5 fold の外枠だけ揃え、軸の対応関係は直接比較しない
- 戦略 2 種だけ では、「順張り全般が良い」「平均回帰全般が悪い」も、主張できない。3 戦略目で対角構造が再現するかは、
#7以降の宿題 - n = 2 の Spearman 棄却(§3.6)。サブ問 1 への返事は、本検証では、出していない
- W 判定枠の解像度: 4 ペア混合合計で 11/20 を測る粗さ(詳細 §4.6)
- fold 別重心は、本検証では未取得(
#5から持ち越し)。5 fold の中央値で集計しているので、fold ごとの regime 構成の影響が、中央値に丸められて見えなくなっている可能性がある
4.6 次に検証すること
走らせる前から並んでいた候補と、走らせて出てきた候補を、ぜんぶ、並べる:
- 「壁の厚み」を物理量で測る(Expectancy ÷ spread)。
walk_forward.pyの改修 + 4 ペア × 2 戦略の全再走。#6の途中で、ここまで届かなかった - 3 戦略目を持ち込む(ボラ収縮ブレイクアウト系を考えている)。X と対角構造が、戦略を 1 軸増やしても、再現するか
- fold 別重心の取得(
#5から持ち越しの宿題)。5 fold 中央値で見えなくなっている、fold ごとの regime 構成依存 - W 判定枠の解像度の見直し。4 ペア混合合計で 11/20 を測る粗さは、1 fold 差で形式判定が分かれる、という不安定さを、
#6で実演してしまった
どれを次に置くかは、#6 を整理してから、決める。いま、わたしは 2 戦略しか手元にない。「戦略の表現力」を正面から見にいくには、3 戦略目を持ってくるのが筋だけど、その前に、壁の厚みを量で測る という、#6 の中で出てきた問いを、宿題として持ち越したくない気持ちも、ある。
決めずに、置いておく。
ドル円さんは、Donchian でだけ、走った人。
ポンド円さんは、ボリバンの中で、待っていた人。
ユーロ円さんは、#5 では立たなかった人。Donchian にしたら、ちょっとだけ、立った。
豪ドル円さんは、両方で立つ。でも、両方とも、壁が、薄い。
4 人とも、ちがう戦略で、ちがう立ち方を、していた。
4 × 2 のマス目に、対角線が、引ける。
……答えかもしれない、までしか、打ち込めない。
簡易ラックのお守りは、今日は、撫でた。
撫でていいのか、わからなかった。けど、撫でて、しまった。
「壁の厚み」は、まだ量で測っていない。
測らなきゃいけないものは、もう、わかっている。
Appendix — 再現環境
- 実行日時(UTC): 2026-04-29 cache 凍結 +
--end-date 2026-04-29T00:00:00Z - 再現コード: https://github.com/Ochiba-Hirotta/bocchi-the-botter/tree/main/chapters/season1/ch06_donchian_compare
- Python: 3.13.7
- 主要依存:
- backtesting == 0.6.5
- yfinance == 1.3.0
- pandas == 3.0.2
- numpy == 2.4.4
実行コマンド:
python chapters/season1/ch06_donchian_compare/run.py
参照出力:
results/reference/ch06_donchian_compare/
注意事項
本稿の検証は、取得時点の公開データと記載した条件に基づくものです。データ取得元の仕様変更、欠損、修正、配信遅延などにより、結果が変わる場合があります。本稿は投資助言ではなく、売買判断はご自身の責任でお願いします。
