先日、「ケリー基準」という非常に参考になる記事を読ませて頂きました。
@tikeda123 さん、ありがとうございます!
この記事を読んで、
「この考え方を自分のFX自動売買システムにも組み込めそうだ」と感じたので、
実際に導入してみました。
運用ルールの前提
私のシステムでは、もともと以下のようなルールを定めています。
- SL(損切り幅):ATRの3倍
- TP(利確幅):SLの1.1倍(リスクリワード比 ≒ 1.1:1.0)
- 対象通貨ペア:複数(複数通貨でポートフォリオ化)
- ポジション管理:1通貨ペアあたり同時ポジションは最大3つ程度(動的変更)
- トレード間隔:同一通貨ペアは4時間ごとに予測・エントリー(時間分散)
このルールをそのまま維持しつつ、ロット数の決定ロジックだけをケリー基準に置き換えました。
ケリー基準の導入方針
- 勝率(WinRate)と損益率(RewardRisk)をもとに、理論上の最適リスク比率を計算
- 同時オーダー数(3つ)および同時稼働通貨ペア数でケリー比率を分割
- 証拠金維持率200%を下回らないように(強制ロスカット防止)、最終ロットをクリップ
- ATR×3 を StopLossPips、TP:SL=1.1:1.0 を RewardRisk として動的にロットを算出
これにより、「リスクを取りすぎず、資金効率を最大化するロット調整」が自動化できます。
MQL4 実装サンプル
以下は、実際に導入したロット計算メソッドの一部です。
double WinRate = 0.55; // 通貨毎の勝率の例(実績値より算出)
double RewardRisk = 1.1; // TP:SL = 1.1:1.0より
double KellyFraction = WinRate - (1 - WinRate) / RewardRisk; // ≒ 0.14
KellyFraction /= 3; // 1通貨ペアあたり同時ポジション例(3オーダー)
KellyFraction /= 3; // 同時稼働通貨ペア数例(3通貨ペア)
KellyFraction *= 0.5; // ハーフケリーで安全側へ
double Account = AccountBalance(); // 残高
double RiskPerOrder = Account * KellyFraction;
// ATR×3をSLに
double ATR = iATR(Symbol(), PERIOD_H4, 14, 0) * 3;
double StopLossPips = ATR / MarketInfo(Symbol(), MODE_POINT);
double PipValue = MarketInfo(Symbol(), MODE_TICKVALUE); // 1pipsの価値
double LotSize = RiskPerOrder / (StopLossPips * PipValue); // ロットサイズ
※ 実際の運用では、証拠金維持率200%以上を維持できるように
AccountFreeMarginCheck() を用いてロット数を調整しています。
結果と感想
導入してみたところ、計算で得られたロット数は、
これまで固定で設定していた値(残高30万の場合、0.04〜0.06ロット)とほぼ同程度になりました。
偶然ではありますが、過去の経験的なロット設計が、理論的にも妥当だったようです。
今後はこの動的ロット調整を使いながら、勝率と損益率を定期的に更新してケリー比率を再計算し、長期運用での安定性を検証していく予定です。
まとめ
ケリー基準は「期待値最大化の理論」をシンプルにトレードへ応用できる。
ATRやTP/SL比と組み合わせれば、ボラティリティに追従したロット制御が可能。
結果的に、リスクを取りすぎず合理的な運用判断ができるようになる。
と感じました。
最後まで読んでいただきありがとうございました。
今後も新しい理論や考えを導入したら、随時アップデートしていきます。
よろしくお願いいたします。