Bootstrap CI vs 単純 t-test — バックテストの「+5% ROI」をどこまで信じるか

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 は、観測データそのものから分布を再構成する という発想。

アルゴリズム

  1. 元データ (N サンプル) から with replacement で N 個ランダム抽出 = 1 回の resample
  2. その resample から平均 (or 任意の統計量) を計算
  3. これを B 回繰り返す (典型 B = 10,000)
  4. 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)”.

コメントする