先週、ドル円が一気に161円台まで駆け上がった日。僕は普段の2倍近いロットでポジションを持っていて、正直かなり冷や汗をかきました。。。なんとか損切りラインで耐えましたが、後で「なんでそのロット数にしたの?」と自分に聞かれたら、たぶん「いや、なんとなく」としか答えられなかったと思います→これはまずいと。
子供が生まれてからチャートに張り付く時間がなくなった僕にとって、「なんとなく」でロットを決めるのは一番危険なパターンです。そこで今回は、勝率と期待値から数学的にポジションサイズを決める「Kelly基準(ケリー基準)」をPythonで試してみました。
Kelly基準とは何か
Kelly基準は、1950年代にベル研究所のJohn L. Kelly Jr.が考案した資金配分の理論です。長期的な資産成長率を最大化する「賭け金の比率」を、勝率と損益の比率(ペイオフレシオ)から導き出します。式はシンプルで、以下のように表されます。
f* = (bp − (1−p)) / b
ここで p は勝率、b はペイオフレシオ(勝った時の利益÷負けた時の損失)です。例えば勝率52%、ペイオフレシオ1:1なら、f*はおよそ4%。つまり資金の4%を1トレードに賭けるのが理論上の最適解、ということになります。
6月のFOMC・ドル円急騰で痛感したこと
今回ロットを見直すきっかけになったのは、6月のFOMCです。政策金利は3.50〜3.75%で据え置きだったものの、内容はタカ派的で、ドル円は160円台後半から一時161.81円前後まで急伸しました。普段なら問題ないロットでも、これくらいのレンジが一気に動くと評価損が想像以上に膨らみます。「期待値があるから多めに張る」ではなく、「期待値はあっても張りすぎない」ための仕組みが必要だと痛感しました。
Pythonで実装してみる
過去のトレード履歴から勝率とペイオフレシオを計算し、Kelly比率を出す簡単なコードを書きました。
def kelly_fraction(win_rate: float, payoff_ratio: float) -> float:
"""
win_rate: 勝率 (0~1)
payoff_ratio: 平均利益 / 平均損失
"""
b = payoff_ratio
p = win_rate
f_star = (b * p - (1 - p)) / b
return max(f_star, 0) # マイナスなら賭けない
# 直近50トレードの実績から算出した例
win_rate = 0.52
payoff_ratio = 1.3
full_kelly = kelly_fraction(win_rate, payoff_ratio)
half_kelly = full_kelly / 2
quarter_kelly = full_kelly / 4
print(f"フルKelly: {full_kelly:.2%}")
print(f"ハーフKelly: {half_kelly:.2%}")
print(f"クォーターKelly: {quarter_kelly:.2%}")
このwin_rateとpayoff_ratioは、実際には自分の過去トレード履歴やバックテスト結果から計算する必要があります。僕の場合は直近の手動トレードを集計しましたが、サンプル数が少なすぎて正直あまり信頼できる数字ではなかったです(このあたりは今後の課題)。
フルKellyは危険、ハーフ〜クォーターKellyが現実的
調べてみると、多くのクオンツファンドはフルKellyではなく1/4〜1/2 Kellyを採用しているそうです。理由は、勝率やペイオフレシオの推定誤差に弱いから。フルKellyだと、推定がちょっとズレるだけでドローダウンが一気に大きくなります。僕のような「サンプル数も少ない・推定も怪しい」個人トレーダーは、クォーターKelly程度から始めるのが現実的だと感じました。
まとめ
Kelly基準は「なんとなくロットを決める」という僕の悪い癖に、数学的な歯止めをかけてくれる仕組みだと感じました。ただし入力する勝率・ペイオフレシオの精度がすべてなので、まずは自分のトレード履歴をちゃんと記録するところから見直そうと思います。次回は、このKelly比率を過去のドル円トレードに当てはめてバックテストしてみる予定です。

