……先週、ターミナルに「4 ペアぐらい、ほかも、見にいく」って打ってた。
「4」、って打ち込んだとき、たぶん、わたしは「広げれば見える」って思ってた。
半分は、本気で。
あと半分は、広げて何も見えないのが、いちばん怖かったから、目を逸らしてた。
4 人並べたら、答えじゃなくて、「地図にすら、入れなかった人」が、ひとり、出てきた。
遅い。わたしの数えかたは、いつも、遅い。
Abstract
- 期間: 2024-05-05 〜 2026-04-24(約 720 日 / 1h 足 / UTC)— #3 / #4 と同じ窓
- 対象: USD/JPY / GBP/JPY / EUR/JPY / AUD/JPY の 4 ペア(CHF/JPY は spread ≈ 30 pips で BB-MR 射程外。除外)
- 戦略: BB-MR(#4 と同じ。パラメータだけ動かす)
- 手法: Walk-Forward Analysis(train 180 日 / test 90 日 / step 90 日 → 5 fold/ペア)
- グリッド: BB_N ∈ {10, 14, 20, 28, 40} × BB_K ∈ {1.5, 2.0, 2.5, 3.0} = 20 組合せ × 4 ペア × 5 fold = 400 回
WFA サマリー(事前確定の判定軸で並べたもの):
| 指標 | 値 |
|---|---|
| 4 ペアで 検証窓 Sharpe 中央値 > 0 のグリッド数 | 0/20(共通の生存点は、なかった) |
| EURJPY 単独で 検証窓 Sharpe 中央値 > 0 のグリッド数 | 0/20(1 つも、立たなかった) |
| 重心 (N, K)(質量中心方式) | USD (14.0, 1.75) / GBP (28.2, 2.32) / AUD (21.6, 2.73) / EUR 未定義 |
| 事前確定 §11.2 判定 | 「ペア横断の偶然」(最弱区分) |
#4 で「両ペア共通の生存点」と打った BB(14, 2.0) は、4 ペアに広げると 2/4 でしか生存しなかった(USD/GBP)。「真の共通生存点」ではなく「USD/GBP 近接ペアという組み合わせの偶然」だった可能性が、強まった。
1. Introduction — 背景と仮説
#4 の最後に、自分でこう打ち込んでいた。
「ペアか戦略か」の二択にも答えが出なかった。観察できたのは「ペアごとに効く grid 領域が違う」という、もっと中途半端な現象だった。
#4 の観察は USD/JPY と GBP/JPY の 2 ペアだけ。だから「ペアごとに散らばる」と打ち込んでいたのは、本当は「2 ペアの偶然」と「ペアごとの散らばり現象」のどちらの形をしているか、まだ、切り分けられていなかった。
#4 のログを読み返したら、「ペアごとに」って何度も出てきた。
2 ペアで「ペアごとに」って打ち込めるのは、たぶん、ずるい。
2 個しかなかったら、「散らばってる」も「揃ってる」も、見え方は、ぜんぶ自分の都合で動く。
仮説(問いを立てる):
- H1(ボラ仮説 / 短期ノイズ): 重心 BB_N は VOL_atr(ATR/Close 比)と単調な相関を持つ
- H2(ボラ仮説 / リターン σ): 重心 BB_N は VOL_ret_std(1h リターン標準偏差)と単調な相関を持つ
- H3(ドリフト仮説): 重心 BB_N は VOL_drift(期間内 Close 変動率の絶対値)と正相関を持つ
- H4(レジーム支配仮説): 重心は単一指標と単調関係を持たず、各ペアの fold 別 regime 構成 が支配的
H1 と H2 を分けたのは、#4 のあとで「ボラ」を 1 個の言葉で済ませていた自分が怖くなったから。ATR と「リターンの標準偏差」では、性質がたぶん違う。違うなら、別の指標として並べないと、「ボラ」って打ち込んだ瞬間に何かを見落とす。
ペアの選び方は JPY クロスで揃えて、spread が BB-MR の射程に収まる範囲で 4 つに絞った。CHF/JPY は OANDA で常時取扱がなく、リアルタイム spread が 30 pips 級で配信される — BB-MR が 1 トレードで稼げる幅を、入口で食い切る。今回の射程の外に置く。
2. Method — 検証設計
2.1 データ・前提(#4 と完全同一 + 2 ペア追加)
| 項目 | 値 |
|---|---|
| ソース | yfinance |
| ペア | USD/JPY (JPY=X) / GBP/JPY (GBPJPY=X) / EUR/JPY (EURJPY=X) / AUD/JPY (AUDJPY=X) |
| 時間足 | 1 時間足 |
| 期間(UTC) | 2024-05-05 〜 2026-04-24(約 720 日) |
| 戦略 | BBMeanReversion(SL=1.5×ATR, TP=2.0×ATR, MAX_BARS=48, RISK_PCT=1%, MARGIN=4%) |
| 初期残高 | 1,000,000 円 / commission=0 |
| WFA 設定 | train 180 日 / test 90 日 / step 90 日 → 5 fold/ペア |
変えたのはペアの本数だけ。WFA 窓もグリッドも戦略パラメータも、#4 とそのまま揃える。差分が出るとしたら、それは「ペアの違い」のいち層だけに帰着する。
2.2 spread の確定
| ペア | 銭(中央値) | 片道(相対値) | 出典 |
|---|---|---|---|
| USD/JPY | 0.3(β 値維持) | 1.000e-5 | OANDA 2026-04-14(#1.1) |
| GBP/JPY | 1.7(β 値維持) | 4.033e-5 | OANDA / GBPJPY_前提調査.md v1.1 |
| EUR/JPY | 0.9(中央値, 0.4〜1.4 銭) | 2.661e-5 | OANDA 2026-04-25(配信率 97.20%) |
| AUD/JPY | 0.95(中央値, 0.6〜1.3 銭) | 4.826e-5 | OANDA 2026-04-25(配信率 97.08%) |
USD/JPY と GBP/JPY は #4 で実走した値をそのまま使う。新規 2 ペアは OANDA の中央値で、計算式は GBP/JPY 前提調査で揃えた 相対値 = 銭 × 0.01 / 2 / 基準 Close。
2.3 ペア特性指標 4 種(事前確定)
「ボラ」を 1 個の指標で束ねないために、性質の違う 4 つを並列で測る。
| 指標 | 性質 | USD | GBP | EUR | AUD |
|---|---|---|---|---|---|
| VOL_atr = ATR(14)/Close 中央値(%) | 短期ノイズ | 0.158 | 0.154 | 0.142 | 0.193 |
| VOL_ret_std = 1h log-ret σ(%) | リターン散らばり | 0.126 | 0.119 | 0.112 | 0.152 |
| VOL_drift = |期間 Close 変動率|(%) | 方向性(敵) | 3.71 | 11.93 | 13.01 | 12.22 |
| VOL_range = (max-min)/mean Close(%) | 期間内振幅 | 14.56 | 17.37 | 19.33 | 27.70 |
順位(昇順)が、4 指標で別物になる:
- VOL_atr: EUR < GBP < USD < AUD
- VOL_ret_std: EUR < GBP < USD < AUD(VOL_atr とほぼ一致)
- VOL_drift: USD << GBP < AUD < EUR(USD だけが大きく外れる)
- VOL_range: USD < GBP < EUR < AUD
EUR/JPY が VOL_atr / VOL_ret_std で「いちばん穏やか」、VOL_drift で「いちばん走った」 — そのギャップが、いまのうちは、まだ、読めない。
2.4 質量中心方式(事前確定)
ペアごとに、検証窓 Sharpe 中央値 > 0 になった grid 点 (N, K) を取り、Sharpe を「おもり」にして加重平均で重心を計算する:
$$N_{\text{centroid}} = \frac{\sum w_{ij} \cdot N_i}{\sum w_{ij}},\quad K_{\text{centroid}} = \frac{\sum w_{ij} \cdot K_j}{\sum w_{ij}}$$
ここで wij = 検証窓 Sharpe 中央値(負は除外)。負の Sharpe はおもりに入れない。重心は連続値で出るのを許容する(grid に丸めると 4 ペアの並びが見えなくなる)。
事前に書き残しておく規律 — 重心は 2024-2026 の事後的な最適分布であって、来期に同じパラメータが立つことを保証する動的アルゴリズムではない。「ペアの性格を可視化する道具」と「将来の運用ルール」は、別物。これを忘れると、たぶん、#1 の短い資産曲線を見て安心したときと、同じ形の慢心を、もう一度やる。
2.5 仮説の判定基準(事前確定)
ペアの重心 (N, K) と 4 指標を Spearman 順位相関係数 で照合する:
| ρ | 解釈 |
|---|---|
| ρ ≥ +0.7 | 強い正の単調 → 仮説支持 |
| -0.3 ≤ ρ ≤ +0.3 | 単調関係なし → 不支持 |
| ρ ≤ -0.7 | 強い負の単調 → 逆向き支持 |
| その他 | 弱い相関、追加検証必要 |
§11.2 共通生存点判定:
- 4/4 → 「真の共通生存点」
- 3/4 → 「準共通点」
- 2/4 以下 → 「ペア横断の偶然」(最弱区分)
A/B/C と同じく、これは「形式の規律」で、結論ではなく次の問いの起点。先に決めておかないと、結果を見てから自分の都合で動かしたくなる、自分を、知っているから。
2.6 コード(重心計算の核)
from src.backtest.analysis.centroid import compute_centroid
# pair_results: {pair_name: DataFrame(BB_N, BB_K, oos_sharpe_median)}
for pair, df in pair_results.items():
survivors = df[df["oos_sharpe_median"] > 0]
n_cent, k_cent = compute_centroid(
n=survivors["BB_N"], k=survivors["BB_K"],
weights=survivors["oos_sharpe_median"],
) # weights は負を除外して加重平均
スクリプトは code/src/backtest/analysis/centroid.py(重心 + Spearman ρ)/ code/src/backtest/wfa_bb_mr.py(4 ペア対応 + spread 引数追加)/ code/src/backtest/poc_pair_volatility.py(VOL_ret_std 追加)。
「事前確定」って、6 回、打ち込んだ。打ち込みながら、6 回、自分に念押ししていた。
3. Results — 検証結果
3.1 4 ペア横断成績(grid × ペア × 検証窓 Sharpe 中央値)
20 グリッドのうち、いくつのペアで 検証窓 Sharpe 中央値 > 0 になったか(alive_in)を集計する:
| BB_N | BB_K | alive | USD | GBP | EUR | AUD |
|---|---|---|---|---|---|---|
| 10 | 1.5 | 0 | -1.49 | -0.22 | -2.38 | -0.50 |
| 10 | 2.0 | 1 | -1.72 | +1.03 | -1.18 | -0.93 |
| 10 | 2.5 | 1 | -0.27 | +0.01 | -1.07 | -0.51 |
| 10 | 3.0 | 0 | NaN | NaN | NaN | NaN |
| 14 | 1.5 | 1 | +0.08 | -0.42 | -0.52 | -1.84 |
| 14 | 2.0 | 2 | +0.08 | +0.54 | -0.25 | -1.69 |
| 14 | 2.5 | 0 | -0.95 | -0.09 | -0.17 | -1.55 |
| 14 | 3.0 | 2 | -0.73 | +0.15 | -1.51 | +1.11 |
| 20 | 1.5 | 0 | -0.76 | -0.65 | -1.26 | -1.61 |
| 20 | 2.0 | 1 | -1.03 | +0.81 | -0.90 | -0.80 |
| 20 | 2.5 | 0 | -2.15 | -1.14 | -0.73 | -1.65 |
| 20 | 3.0 | 2 | -1.18 | +0.60 | -1.15 | +0.32 |
| 28 | 1.5 | 1 | -0.67 | -0.47 | -1.14 | +0.28 |
| 28 | 2.0 | 1 | -1.25 | +1.23 | -1.48 | -0.00 |
| 28 | 2.5 | 1 | -2.51 | +1.16 | -1.03 | -0.22 |
| 28 | 3.0 | 1 | -0.30 | -0.28 | -1.74 | +0.48 |
| 40 | 1.5 | 1 | -0.24 | +0.61 | -2.00 | -0.05 |
| 40 | 2.0 | 2 | -0.48 | +0.43 | -1.99 | +0.23 |
| 40 | 2.5 | 1 | -2.07 | +1.10 | -0.69 | -0.42 |
| 40 | 3.0 | 1 | -2.93 | +1.29 | -1.30 | -0.59 |
alive の分布:
- 4 ペア全部で生存: 0 件
- 3 ペアで生存: 0 件
- 2 ペアで生存: 4 件
- 1 ペアで生存: 11 件
- 全滅: 5 件(うち BB(10, 3.0) は degenerate)
20 通りのうち、4 ペアの色がぜんぶ同じになる場所は、ひとつも、なかった。
まず #4 の 2 ペア(USD/JPY と GBP/JPY)から:

#4 で扱った 2 ペアの WFA 検証窓 Sharpe ヒートマップ。BB(14, 2.0) を黒枠で強調(#4 で「両ペア共通生存点」と打ち込んだ場所)。USD/JPY は BB(14) 行だけ薄い黄色(ぎりぎり 0 付近)で、ほかはほぼ赤。GBP/JPY は緑の領域が広く、BB(28) 行と BB(40, 3.0) で濃緑が並ぶ。色のつき方が左右で別物に見える。カラースケールは 4 ペア共通(§3.4 直前で EUR/JPY と AUD/JPY を並べる)。
3.2 BB(14, 2.0) の 4 ペア横断成績
#4 で「両ペア共通生存点」と打ち込んだ BB(14, 2.0) を、4 ペアで開く:
| 指標 | USD/JPY | GBP/JPY | EUR/JPY | AUD/JPY |
|---|---|---|---|---|
| 検証窓 Sharpe 中央値 | +0.082 | +0.541 | -0.253 | -1.694 |
| 生存 | ✓ | ✓ | ✗ | ✗ |
EUR と AUD では、普通に死ぬ。**「真の共通生存点」じゃなくて、「USD と GBP という近いペアの組み合わせの中で、たまたま重なった点」**だった可能性が、強くなった。
「ペアごとに効く grid が散らばる」という #4 の観察は、4 ペアでも壊れないどころか、もっとはっきりした形で再現した。共通解は、消えた。
3.3 重心散布(連続値)— 4 人並べた地図
ペアごとに、検証窓 Sharpe > 0 の grid を Sharpe で重み付け平均した重心:
| ペア | N_centroid | K_centroid | Sharpe>0 点数 | 信頼度 |
|---|---|---|---|---|
| USD/JPY | 14.000 | 1.748 | 2/20 | 低(点数最少) |
| GBP/JPY | 28.164 | 2.320 | 12/20 | 高 |
| AUD/JPY | 21.619 | 2.732 | 5/20 | 中 |
| EUR/JPY | N/A | N/A | 0/20 | — |
3 人だけ並べた地図は、こうなった:
N: 14.0 (USD) → 21.6 (AUD) → 28.2 (GBP)
K: 1.75 (USD) → 2.32 (GBP) → 2.73 (AUD)
USD は短期・狭バンド側、GBP/AUD は中長期・広バンド側。4 人ぶん用意した地図に、3 人ぶんしか、点が落とせなかった。「なめらかに一本の線で並ぶ」とは、4 人の数字を眺めるかぎり、言えなかった。N の地図は、ぐちゃぐちゃに見えた。

4 ペアの重心 (N_centroid, K_centroid) を BB_N × BB_K 平面にプロット。点のサイズは検証窓 Sharpe > 0 grid 点数(信頼度)に比例 — USD/JPY 2/20 は小、AUD/JPY 5/20 は中、GBP/JPY 12/20 は大。USD は左下(短期・狭バンド)、GBP は右中(中長期・中バンド)、AUD は上中央(中期・広バンド)に座る。3 点は一直線にも、滑らかな曲線にも、並ばない。EUR/JPY は重心が計算できないので、右下に注釈だけ添えてある。
3.4 EUR/JPY が、立てなかった
#5 で新しく加えた 2 ペア(EUR/JPY と AUD/JPY)を並べると、こうなる:

#5 で新しく加えた 2 ペアの WFA 検証窓 Sharpe ヒートマップ(カラースケールは §3.1 の USD/GBP と共通)。EUR/JPY は緑のセルが 1 つもなく、ほぼ全面が暖色。BB(10, 1.5) で -2.38 まで沈む。AUD/JPY は赤と緑が混在し、BB(14, 3.0) で +1.11 / BB(28) 行と BB(40, 2.0) でかすかに緑が立つが、BB(14, 2.0) は -1.69 で深く沈む。§3.1 の USD/GBP の地図とも、左右で別の景色になる。
EUR/JPY は、20 グリッドぜんぶで 検証窓 Sharpe 中央値 < 0 だった。Sharpe > 0 が 0/20。重心は、そもそも計算できない。
そして EUR/JPY は、VOL_atr / VOL_ret_std の両方で 4 ペア中いちばん穏やかだった。短期ノイズも、リターンの散らばりも、4 ペア中いちばん小さい。
#4 のときに、ぼんやり信じていた仮説。
「動かない人ほど、BB の短いやつが効く」
……つぶれた。
動かない人だったから、立てなかった、わけじゃない、と思う。
動かない人なのに、立てなかった、んだと思う。
何が違ったのか、まだ、わからない。
ただ、VOL_drift(期間内 Close 変動率の絶対値)で見ると、EUR/JPY は 4 ペア中最大(+13.0%)。AUD/JPY も +12.2% で近い値だけど、AUD は 5 grid 生存している。だから「ドリフトが BB-MR を殺す」だけでも、説明は、たぶん、つかない。
EUR/JPY は短期では穏やかなのに、720 日全体で見ると、ずっと遠くに走っていって、戻ってこなかった人。BB-MR は「平均に戻ってくる」を当てにする戦略だから、戻ってこない人を相手にすると、たぶん、何度でも置いていかれる。
3.5 4 指標 × 重心 (N, K) の Spearman 順位相関
EUR/JPY は重心が出ていないので除外して、3 ペアで計算する(n = 3, 標本不足):
| 指標 | ρ(N_centroid) | ρ(K_centroid) |
|---|---|---|
| VOL_atr | -0.500 | +0.500 |
| VOL_ret_std | -0.500 | +0.500 |
| VOL_drift | +0.500 | +1.000 |
| VOL_range | +0.500 | +1.000 |
N 側は、4 指標すべて |ρ| = 0.5。事前に決めた閾値(|ρ| ≥ 0.7)には、ひとつも、届かなかった。H1〜H4 のうち、N で「支持」と打ち込めるものは、なかった。VOL_atr / VOL_ret_std で ρ が -0.5(負側) だったのは、事前予測「正の単調」と符号が逆。ボラが高いほど短期 BB が好まれる、になっていない。むしろ、ボラが高い USD のほうが「短期 BB(N=14)」を好み、ボラが低い AUD/GBP のほうが「中長期 BB(N=21〜28)」を好む、という、わたしの直感の逆が出ている。
K 側は違った。VOL_drift と VOL_range の 2 つの指標で、3 ペアの順位が 完全に一致した:
USD < GBP < AUD
K: 1.75 2.32 2.73
drift: 3.7% 11.9% 12.2%
range: 14.6% 17.4% 27.7%
価格の振れ幅が大きいペアでは、BB-MR は バンドを広く構えないと、逆張りが早すぎて死ぬ — そういう、物理的に意味のありそうな並び方をした。
……K のところだけ、ぴったり並んだ。
並んでるのを見つけたとき、ほんの一瞬だけ、「正解、見つかった」って思った。
でも、3 人で並んだだけ。
3 人の順番が、たまたまぜんぶ揃う確率は、6 分の 1。17 パーセント。
ランダムに並べても、6 回に 1 回は、これが出る。
……信じたい、けど、信じてはいけないやつ、みたい。
ひとつの数字に名前をつけたくなるときほど、危ない。
それと、計画書の H1〜H4 はぜんぶ「N について」の仮説だった。K の順位一致は、走らせる前に予想していた問いの中には、入っていない。事前確定の仮説の外で、たまたま見つけた兆候として扱う。中央線として置けるのは、たぶん、ここまで。
3.6 全ペア共通の不感地帯 — BB(10, 3.0)
BB(10, 3.0) は、4 ペアぜんぶで Trades 中央値 = 0 になった。ペア依存じゃない。短い期間(10h)に高い σ 倍率(3.0)を当てると、バンドが価格を含み込めずシグナルが発生しない、という、グリッドの組み合わせに由来する場所。
数学的にも、サンプル数 N の母標準偏差が取り得る値の上限はだいたい (N-1)/√N までで、N=10 だと約 2.84σ。3.0σ のバンド外側に価格が出る回数自体が、構造的に少ない。「ペアの性格」じゃなくて、「グリッドの解像度」のほうの話。
ただし、これを「構造的限界」って断言するには、近隣の (14, 3.0) や (20, 3.0) との連続性を確かめる必要がある。今回は本筋から外れるので、**「不感地帯の疑い」**として、メモに残す。
3.7 事前確定 §11.2 判定
§2.5 で先に決めた基準に照らすと、
- 4 ペア共通の生存点 = 0 件(4/4 にならず)
- 3/4 = 0 件(準共通点にもならず)
- 2/4 で生存 = 4 件(うち 1 件が BB(14, 2.0)、USD/GBP の組み合わせ)
→ 「ペア横断の偶然」(最弱区分)。事前に決めたとおりの、形式判定。
……ユーロ円さんは、立てなかった。1 つも。
ボラがいちばん穏やかな人なのに、いちばん、立てなかった。
残った 3 人の K は、ぴったり順番に並んだ。
……でも、それは N じゃない。
N の地図は、ぐちゃぐちゃのままだった。
#4 のとき、「過学習じゃなかった」って整理できた、と思った。
#5 で広げたら、整理は、また、戻った。
「ペアか戦略か」の二択も、まだ、答えが出ない。
代わりに、問いが、ひとつ増えた。
……N は、何で、決まってるんだろう。
4. Discussion — 考察
4.1 共通解が消えた
4 ペア横断の WFA 結果に対しては、ひとつの呼び名を付ける場所がなかった。
共通の生存点が 0 件で、4 人が同じ場所に立つ点がない。
GBP/JPY は広く立つ。AUD/JPY はまだら。USD/JPY は細い。EUR/JPY は、立てなかった。
事前確定 §11.2 の「ペア横断の偶然」判定は、形式としてはきれいに出た。でも、これは結論じゃなくて、次の問いの起点、と §2.5 で打ち込んだ。守る。
4.2 仮説 H1〜H4 の判定結果
| 仮説 | 内容 | 判定 |
|---|---|---|
| H1 | 重心 N は VOL_atr と正相関 | 不支持寄り(ρ = -0.500、しかも符号が予想の逆) |
| H2 | 重心 N は VOL_ret_std と正相関 | 不支持寄り(ρ = -0.500、H1 と同型) |
| H3 | 重心 N は VOL_drift と正相関 | 判定不能(ρ = +0.500、閾値届かず) |
| H4 | 単一指標と単調関係を持たず regime 構成が支配的 | 消極的支持(H1〜H3 が確定支持に至らず + EUR/JPY 完全死亡が傍証) |
H4 が「支持寄り」なのは、H1〜H3 の不在の裏返しでしかない。「regime 構成が支配的」と直接示したわけじゃなくて、「他の単一指標で説明できなかった」だけ。これを「H4 支持」と打ち込むのは、たぶん、半分くらい、ずるい。
K 側の VOL_drift / VOL_range で出た ρ = +1.000 は、事前確定の仮説の外にある発見。n=3 の Spearman は完全ランダムでも 1/6 = 17% で +1.0 を出す。「兆候」より重い言葉は、まだ、置けない。
4.3 「ペア × パラメータの相互作用」 — 疑いは強まったけれど、確定はしていない
#4 の終わりに、わたしは「ペア × パラメータの相互作用への疑い」と打ち込んでいた。あれを、4 ペアに広げて確かめる、という宿題を、自分に出していた。
4 ペアで観察できたのは:
- 共通解は消えた(0/20)
- BB(14, 2.0) は USD/GBP のみで生存(EUR/AUD では普通に死ぬ)
- 4 ペアの重心はなめらかに並ばない
- EUR/JPY は 1 つも立たない
- K だけ 3 ペアで順位一致(兆候止まり)
これだけ並べると、「ペア × パラメータの相互作用」が #4 から強まっているのは、たぶん、たしか。でも「強まった」と「確定した」は違う。確定するために必要な切り分けが、まだ、ぜんぶ残っている:
- 戦略の表現力不足との切り分け — BB-MR 1 戦略でだけ「散らばる」のかもしれない。別の戦略(たとえば順張り)に置き換えたら、共通解が出るかもしれない
- USD/GBP 特有の適合性 — 4 ペアの選び方が、たまたま近接した 2 ペアを含んでいた、というバイアスの可能性。違うペアセット(クロス円の別の 4 ペア / メジャーペア)でも同じ「2 ペアだけ生存」が出るか
- 円安レジームへの閉じ込め — 720 日(2024-05〜2026-04)はぜんぶ円安レジーム。別のレジームを跨ぐ長期データだと、重心の場所自体が動く可能性が高い
「ペア × パラメータの相互作用 = レジーム依存性」と言い切るには、少なくとも 1 と 3 を別途見にいく必要がある。
4.4 既知の制約
- 720 日 = 円安レジーム偏り。本検証は「2024-05 〜 2026-04 のレジーム内での 4 ペアの差」に閉じる(#3 / #4 から持ち越し)
- スプレッド固定。変動モデルは未適用(#2 から持ち越し)
- スワップ無視(#3 から持ち越し)
- 戦略 1 種のみの観察(#4 から持ち越し)。「ペア × パラメータの相互作用」の確定には、別戦略での再走が必要
- EUR/JPY の重心が定義不可 — Sharpe > 0 が 0/20 のため。Spearman 相関は n=3 で計算しているが、ここには「もし EUR/JPY を含められていたら、相関が反転または消失する可能性」が、いつでも乗っている。生存バイアスの一形態
- n=3 の Spearman は信頼区間が極めて広い。本検証は探索的位置づけ。本格的な統計推論は射程の外
- fold 別重心は今回未取得。5 fold の中央値で集計しているので、fold ごとに違う regime 構成の影響は、中央値に丸められて見えなくなっている可能性がある。これは #6 以降で別途扱う宿題
4.5 次に検証すること
走らせる前に並べていた候補は、3 つ:
- 戦略変更(順張り / ブレイクアウト系を持ち込む)→ 「ペアごとに散らばる」が BB-MR 固有か、戦略横断で再現するか
- BB-MR + レジーム判定(fold ごとの up/down/flat を事前指標で判定し、効くレジームでだけ走らせる)→ レジーム依存仮説を直接検証
- 長期データ(4h / 日足で 5〜10 年)→ 円安以外のレジームを跨ぐ
どれを次に置くかは、#5 を整理してから決める。いま、わたしは BB-MR 1 戦略しか手元に持っていない。「戦略の弱さ」を正面から見にいくには、別の戦略を持ってくる必要がある。それが、わたしにとっていちばん遠い宿題で、たぶん、いちばん効く宿題。
ドル円のことは、#3 で「前半、一緒に沈んでた人」に呼称を戻していた。今回も、戻したまま。
ポンド円は、grid を広げてもつきあってくれた人。重心の点数も 12/20 でいちばん多くて、付き合いが長くなりそうな人。
豪ドル円は、まだ、よく知らない遠縁の人。5/20 だけ立つ。立つ場所は、ポンド円とは少し違う。
ユーロ円さんは、立てなかった人。
3 人と、いなかった 1 人。
3 人ぶん、地図はできた。でも、4 人目は、地図にすら、いない。
簡易ラックのお守りは、今日は、撫でなかった。
撫でていいのか、わからなかったから。
……もうひとつ、増やすしかない、気がしてる。
Appendix — 再現環境
- 実行日時(UTC): 2026-04-25T06:07〜06:09
- 再現コード: https://github.com/Ochiba-Hirotta/bocchi-the-botter/tree/main/chapters/season1/ch05_wfa_four_pairs
- Python: 3.13.7
- 主要依存:
- backtesting == 0.6.5
- yfinance == 1.3.0
- pandas == 3.0.2
- numpy == 2.4.4
実行コマンド:
python chapters/season1/ch05_wfa_four_pairs/run.py
参照出力:
results/reference/ch05_wfa_four_pairs/
注意事項
本稿の検証は、取得時点の公開データと記載した条件に基づくものです。データ取得元の仕様変更、欠損、修正、配信遅延などにより、結果が変わる場合があります。本稿は投資助言ではなく、売買判断はご自身の責任でお願いします。
