TL;DR
- バックテストの「平均 ROI +5%」だけ見ても意味がない。信頼区間 (CI) を見る習慣が要る
- t-test は正規性を仮定。ベッティング・トレードのリターンは fat-tail で前提が崩れ、CI が too narrow になる
- Bootstrap (Efron 1979) は分布仮定なしで CI を計算する。B=10,000 程度の resampling を回す
- 時系列構造があれば block bootstrap で連続性保持
- Numpy で数行、計算コストは N=1000 で 10 秒程度。実装の手間に対して得るものが大きい
Hook
あるバックテストが N=1,000 betting で「平均 ROI +5%」を返したとする。「これは戦略 edge がある証拠か?」と聞かれて、即答できるだろうか。
+5% はただの点推定。真の値が -1% から +11% の幅に分布していたら、edge と呼ぶには弱い。点推定だけでは戦略の有無を語れない。必要なのは信頼区間 (Confidence Interval, CI)。だが、それをどう計算するか。
標準的な選択肢: t-test based CI
統計の教科書で最初に習うのが t-test 由来の CI。
CI = x̄ ± t(α/2, n-1) × s/√n
仮定: 標本平均が正規分布に近い (中心極限定理が効く)、観測値の分散が安定。サンプル数 N が十分大きく、分布が「素直」なら、これは強力。
問題は、ベッティング・トレードのリターン分布は素直ではない こと。fat-tail (kurtosis 高)、ときに skew、たまに極端な勝ち負け。1 回の outlier が分布全体を支配する。t-test は正規性に依存するので、こうした性質を持つデータでは:
- 標本標準偏差 s が真の variability を underestimate
- 結果として CI が too narrow になる
- 「有意」と出ても false positive の可能性
つまり「t-test で p<0.05、edge あり」と判断したら、それは信用しすぎ。
Bootstrap — 分布仮定なしの CI
Efron (1979) が提案した Bootstrap は、観測データそのものから分布を再構成する という発想。
アルゴリズム
- 元データ (N サンプル) から with replacement で N 個ランダム抽出 = 1 回の resample
- その resample から平均 (or 任意の統計量) を計算
- これを B 回繰り返す (典型 B = 10,000)
- B 個の平均値の経験分布から percentile (例: 2.5%, 97.5%) を取り出して CI とする
Numpy 擬似コード
import numpy as np
returns = ... # backtest returns array, length N
rng = np.random.default_rng(42)
B = 10_000
bootstrap_means = np.array([
rng.choice(returns, size=len(returns), replace=True).mean()
for _ in range(B)
])
ci_low, ci_high = np.percentile(bootstrap_means, [2.5, 97.5])
print(f"95% CI: [{ci_low:.4f}, {ci_high:.4f}]")数行で書けて、N=1,000 / B=10,000 で数秒〜10 秒程度。
Bootstrap の利点
- 分布仮定なし (distribution-free)
- heavy-tail / skew があっても robust
- 平均だけでなく、Sharpe・MaxDD・任意の関数の CI が同じ枠組みで取れる
- 実装が簡単
Bootstrap の限界
- 元データ自体に bias があれば補正できない (survivorship bias、look-ahead bias は別途扱う)
- iid (独立同分布) 仮定。時系列で autocorrelation があると CI が誤る → block bootstrap
- B が小さすぎる (例: 100) と percentile 推定が荒い
時系列を保つ Block Bootstrap
trading リターンは独立ではない。volatility cluster (大きい動きの後に大きい動きが来る)、autocorrelation (前日の sign が今日に影響) などが普通に存在する。
単純 Bootstrap (iid) はこの構造を破壊する。代替が Block Bootstrap (Künsch 1989、Politis-Romano 1994)。
- 連続する k 個のサンプルをひと塊で resample
- 時系列 autocorrelation が保たれる
- block size k の選び方が研究テーマ (典型 k = N^(1/3) 程度)
財務データの CI 推定では block bootstrap がデフォルトと言ってよい。
どれくらい違うか — 数値感覚
教科書例として、N=200 の fat-tailed リターンで両者の CI を比べると、Bootstrap CI は t-test CI より 20-40% ほど広い ことが多い (具体は分布形状に依存)。「t-test だと有意、Bootstrap だと有意ではない」境界に乗っかっている戦略は、現実には信用できないと思った方が安全。
個人的経験
backtest で「+X% ROI」が出ても、Bootstrap CI を取ると CI 下限が 0 を割っていることが珍しくなかった。t-test だけ見ていれば「有意」と判断したであろう戦略が、Bootstrap で見ると有意性が消える、という現象を何度も経験した。
これは「真に edge がある」のか「サンプル分布の偶然」なのかの違い。Bootstrap は backtest の自尊心を傷つける道具 だが、その傷を運用前に受けるか、運用後に金で受けるかの差を作る。
まとめ
- 平均値の点推定だけでは「edge あり」と言えない
- t-test の CI は heavy-tail 分布で過小評価される
- Bootstrap は分布仮定なしで CI を計算、実装簡単
- 時系列なら block bootstrap で構造保持
- backtest 評価ルーチンに最初から組み込むべき道具
次回は、12 か月から「最強月」を選ぶと、それは本当に強いのか? Bonferroni 補正と複数検定の罠 を扱う。
参考文献
- Efron, B. (1979). Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics, 7(1), 1-26.
- Efron, B., Tibshirani, R.J. (1993). An Introduction to the Bootstrap. Chapman & Hall.
- Politis, D.N., Romano, J.P. (1994). The Stationary Bootstrap. Journal of the American Statistical Association, 89(428), 1303-1313.
- Künsch, H.R. (1989). The Jackknife and the Bootstrap for General Stationary Observations. The Annals of Statistics, 17(3), 1217-1241.
- Lopez de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Ch. 7.
- Wikipedia, “Bootstrapping (statistics)”.