Monte Carlo Simulation の盲点 — iid 仮定で消える時間構造

TL;DR

  • Monte Carlo (MC) で「戦略 robust 性確認」をするとき、iid (独立同分布) sampling は危険
  • 時間帯・曜日・market regime で edge は変動する。iid はこれを破壊して平均化する
  • 解: block bootstrap、stratified sampling、joint sampling で時間構造を保つ
  • backtest と MC の結果がよく一致したとき こそ、共通の前提が崩れている可能性を疑う

Hook

backtest の CAGR が +30%、Monte Carlo で 10,000 回シミュレートしたら平均 +28% で良く一致。「再現性ある robust な戦略だ」と判断して live 投入。1 ヶ月後、戦略は -3% で停止していた。

何が起きたか。MC が嘘をついたわけではない。MC の仮定が現実と合っていなかった だけだ。

単純 MC = iid Bootstrap という前提

戦略の robust 性を MC で評価する典型手順:

  1. backtest で得られた個別 trade のリターン列を保存
  2. そのリターン列から with replacement でランダム抽出
  3. N 個サンプリングして「シミュレートされた運用」のリターン分布を作る
  4. 何千回繰り返して期待値・分散・MaxDD を推定

この設計は「個別 trade のリターンが i.i.d. (独立同分布)」を仮定している。trade A と trade B が同じ確率分布から独立に出てくる、という仮定。

ところが現実の trading 結果は i.i.d. ではない

なぜ trade は i.i.d. でないのか

具体的な依存性の例:

時間帯依存

  • 朝の市場と夕方の市場で参加者構成が違う
  • volatility regime が時間帯で異なる
  • ベッティング系では「メイン G1 レース」と「平日午後の地方競馬」で edge の質も違う

曜日依存

  • 月曜は週末ニュースを織り込み、変動が大きい
  • 金曜は週末リスクで position 解消、動きが特殊
  • ベッティング系では土日と平日でも参加者層・流動性が違う

Regime 依存

  • low volatility 期と high volatility 期で edge が逆向きに動くことがある
  • bull / bear / sideways で signal の解釈が変わる
  • crash 中は normal time の relationship が崩れる

これらの依存性のもとで、edge の出方は 時間構造を持って分布 している。「いつ trade したか」が「どれくらいの edge があったか」と相関する。

iid sampling が破壊するもの

with replacement でランダム抽出すると、上記の時間構造はすべて 平均化されて消える。月曜の trade と金曜の trade、朝の trade と夜の trade、low vol regime の trade と high vol regime の trade、すべてが「同じ袋から引いたサンプル」として等価に扱われる。

結果として:

  • 実際は「特定時間帯にしか edge が出ない」戦略
  • iid MC の世界では「全時間帯で同じ edge が出る」と誤って evaluated
  • 「robust」と判断して live 投入
  • live では時間構造が復活し、edge の出る場面と出ない場面の差で結果がブレる

構造を保つ Block Bootstrap

Politis & Romano (1994) の Stationary Bootstrap や Künsch (1989) の Moving Block Bootstrap は、連続する k 個のサンプルをひと塊で resample する。

元データ: [a, b, c, d, e, f, g, h, i, j]
iid bootstrap:    [c, h, b, j, a, ...]  (順序破壊)
block bootstrap:  [c, d, e, h, i, j, a, b, ...]  (連続性保持)

block size k の選び方は研究テーマだが、典型的に k ~ N^(1/3) 程度。autocorrelation が強い系列ほど大きい k が必要。

Stratified Sampling — 時間帯/Regime ごとに分ける

別アプローチとして stratified sampling がある:

  1. trade を時間帯/曜日/regime ごとに分類
  2. 各層内で独立に resample
  3. 元と同じ「層別比率」を保ちつつ MC を回す

これで「現実の構成比」を保ったまま不確実性が評価できる。

結果の不一致が示すこと

backtest の数字と MC の数字を比べた時:

  • 大きく一致する → iid 仮定が当てはまっているか、もしくは時間構造が backtest 期間で安定していた
  • 乖離が大きい → iid 仮定が崩れている。時間構造の影響が大きい

実は前者が安心材料に見えて、危険側でもある。「同じ仮定下で同じ結果」は当然のこと。MC が backtest を確認しているのではなく、自分の仮定を確認している だけになりうる。

個人的経験

backtest で見えた CAGR を MC で再現したのに、live で出ない、という現象を経験した。原因を追ったら、戦略の edge は「特定時間帯」にしか発生しておらず、iid MC はその時間構造を破壊して edge を「均一に存在する」と誤って報告していた。

joint sample で時間軸を保持して MC を回し直したら、live により近い結果になった。MC の前提を疑うことが、過信を避ける鍵 だと学んだ。

「シミュレーションが backtest と一致した」のは「同じデータを同じ仮定で再描画した」だけで、現実保証ではない。

まとめ

  • MC は iid 仮定を内包する
  • 時間帯・曜日・regime 構造があれば iid sampling は結果を歪める
  • block bootstrap / stratified sampling で構造保持
  • backtest と MC の数値一致は「同じ仮定下で同じ結論」というだけで、安心材料にしかならない

次回は、Survivorship Bias — 「成功した起業家の習慣」「ヘッジファンドのリターン」、生存者しか見えていないデータ。

参考文献

  • 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. 13.
  • Glasserman, P. (2003). Monte Carlo Methods in Financial Engineering. Springer.
  • Wikipedia, “Monte Carlo method”.

コメントする