#6.斜めに、答えがあった

FX Bot開発ログ

……「もうひとつ、増やすしかない」って打ち込んだのは、先週だったと思う。
打ち込んでいるときは、「いつか」のつもりだったような気がする。
数日後にコミットログを見たら、もう Donchian って単語があった。
「いつか」じゃ、なかった。
自分の打ち込みのほうが、決めるのが、早い。気づくのは、いつも、コミットしたあとだ。


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.pynext() 一箇所が、いちばん近い:

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 戦略の n_pos マス目

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 を 2 つのモノサシで測ったヒートマップ

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 次に検証すること

走らせる前から並んでいた候補と、走らせて出てきた候補を、ぜんぶ、並べる:

  1. 「壁の厚み」を物理量で測る(Expectancy ÷ spread)。walk_forward.py の改修 + 4 ペア × 2 戦略の全再走。#6 の途中で、ここまで届かなかった
  2. 3 戦略目を持ち込む(ボラ収縮ブレイクアウト系を考えている)。X と対角構造が、戦略を 1 軸増やしても、再現するか
  3. fold 別重心の取得(#5 から持ち越しの宿題)。5 fold 中央値で見えなくなっている、fold ごとの regime 構成依存
  4. W 判定枠の解像度の見直し。4 ペア混合合計で 11/20 を測る粗さは、1 fold 差で形式判定が分かれる、という不安定さを、#6 で実演してしまった

どれを次に置くかは、#6 を整理してから、決める。いま、わたしは 2 戦略しか手元にない。「戦略の表現力」を正面から見にいくには、3 戦略目を持ってくるのが筋だけど、その前に、壁の厚みを量で測る という、#6 の中で出てきた問いを、宿題として持ち越したくない気持ちも、ある。

決めずに、置いておく。


ドル円さんは、Donchian でだけ、走った人。
ポンド円さんは、ボリバンの中で、待っていた人。
ユーロ円さんは、#5 では立たなかった人。Donchian にしたら、ちょっとだけ、立った。
豪ドル円さんは、両方で立つ。でも、両方とも、壁が、薄い。

4 人とも、ちがう戦略で、ちがう立ち方を、していた。
4 × 2 のマス目に、対角線が、引ける。
……答えかもしれない、までしか、打ち込めない。

簡易ラックのお守りは、今日は、撫でた。
撫でていいのか、わからなかった。けど、撫でて、しまった。

「壁の厚み」は、まだ量で測っていない。
測らなきゃいけないものは、もう、わかっている。


Appendix — 再現環境

実行コマンド:

python chapters/season1/ch06_donchian_compare/run.py

参照出力:

  • results/reference/ch06_donchian_compare/

注意事項

本稿の検証は、取得時点の公開データと記載した条件に基づくものです。データ取得元の仕様変更、欠損、修正、配信遅延などにより、結果が変わる場合があります。本稿は投資助言ではなく、売買判断はご自身の責任でお願いします。