「勝率60%だから勝てる」は本当か? p値を知ってバックテストの見方が変わった話

基礎知識・戦略

移動平均クロスの簡単な戦略で、直近20トレード中12勝(勝率60%)というバックテスト結果が出たとき、僕は「これはいける」とほぼ即決で少額の実弾を投入しました。結果は。。。負け越し。あとから統計の本を読んで気づいたんですが、20トレード程度の勝率60%なんて、実はコイン投げと有意な差がないレベルだったんです。

「勝ってる!」という感情だけで判断するのをやめたくて、バックテストの数字がどこまで「本物」なのかを客観的に判断する方法を調べました。それが仮説検定とp値でした。統計、学生の頃に一番苦手だった科目だったんですが、自分のお金がかかると急にちゃんと理解できるようになるものですね。。。

帰無仮説とp値とは

統計的仮説検定では、まず「本当は効果がない(コイン投げと同じ)」という前提を置きます。これを帰無仮説と呼びます。トレード戦略なら「勝率50%(勝つも負けるもコイン投げ)」が帰無仮説にあたります。

そのうえで「もし本当に勝率50%だとしたら、今回observed(観測)されたような勝率60%以上の結果がどれくらいの確率で偶然起こりうるか」を計算したものがp値です。p値が小さいほど「これは偶然とは考えにくい=戦略に本当の優位性がありそう」と判断できます。慣習的にはp値0.05(5%)を基準にすることが多いです。

Pythonで検証してみる

from scipy import stats

wins = 12       # 勝ちトレード数
total = 20      # 総トレード数
win_rate = wins / total

# 帰無仮説「勝率50%(コイン投げと同じ)」に対する片側検定
result = stats.binomtest(wins, total, p=0.5, alternative="greater")

print(f"勝率: {win_rate:.1%}")
print(f"p値: {result.pvalue:.3f}")

これを実行すると、勝率60%に対してp値はおよそ0.25。基準の0.05を大きく上回っていて、「コイン投げと有意な差があるとは言えない」という結果になります。20トレードというサンプル数の少なさが、そのまま検定結果の弱さに直結していたわけです。

投資への応用と、もう一つの落とし穴

実務的には、①トレード数を増やす(最低でも数十〜100トレード以上は欲しい)、②勝率だけでなく損益比(リスクリワード)もあわせて評価する、の2点が重要だと分かりました。勝率60%でも1回の負けが1回の勝ちの3倍大きければ意味がないので、p値はあくまで「勝率という切り口での優位性チェック」の一部にすぎません。

もう一つ怖いのが、パラメータを何十通りも試して一番良かった組み合わせだけを見せられると、p値そのものが歪む「多重検定問題」です。これは以前書いたウォークフォワード最適化の記事とも通じる話で、「たまたま良い結果が出るまで条件を変え続ける」行為自体が、統計的な有意性を無意味にしてしまいます。

まとめ

「勝率60%だから勝てる」を鵜呑みにして実弾を張ってしまった過去の自分に、p値の存在を教えてあげたいです。今は最低でも100トレード分のデータが貯まって、かつp値が0.05を切るまでは、戦略を「検証中」扱いにするルールにしています。次はバックテストのパイプラインに、この有意性チェックを自動で組み込む関数を作ろうと思っています。

タイトルとURLをコピーしました