複利運用のFXシステムで、「口座残高が増えたけど、ロットサイズの更新を忘れていた」という経験はないだろうか。利益が出ているのにロットが固定のままでは、複利効果が得られない。
本記事では、毎日23:10 JSTに自動実行され、現在の口座残高(equity)に基づいて最適なロットサイズをSlackで提案するシステムの設計と実装を記録する。「提案」であり「自動変更」ではない——この設計判断の理由も含めて解説する。
複利運用の基本
単利 vs 複利
単利運用は「初期資金に対する固定ロット」で取引し続ける。複利運用は「現在の口座残高に対するロット」で取引する。
例: 初期資金50万円、月利7%
単利: 50万 × 7% = 3.5万/月 → 12ヶ月後: 92万円
複利: 50万 × (1.07)^12 → 12ヶ月後: 113万円(+21万円の差)
期間が長くなるほど複利効果は劇的に大きくなる。資産1億円到達のロードマップでは複利運用が前提だ。
フラクショナルケリーとの組み合わせ
ロットサイズの決定にはフラクショナルケリー(Kelly Criterion の保守的な適用)を使っている。
Kelly% = (勝率 × RR比 - 敗率) / RR比
実際のリスク% = Kelly% × fraction(0.25〜0.50)
ロットサイズ = 口座残高 × リスク% / (SL幅 × pip価値)
口座残高が変われば最適ロットも変わる。利益が出て残高が増えたら、ロットも増やすべきだ。逆にドローダウンで残高が減ったら、ロットを減らしてリスクを抑える。
なぜ「自動変更」ではなく「提案」にしたか
ロットサイズを自動で変更するシステムは技術的に可能だ。しかし、あえて「Slackで提案し、人間が確認して適用する」設計にした。理由は3つある。
1. 誤算のリスクが致命的
ロットサイズの計算に使うequity(口座残高)が何らかの理由で異常値になった場合——たとえばAPI障害で残高が0円と返ってきた場合——自動変更だとロットが激減し、翌日のトレードがほぼ無効になる。逆に残高が二重カウントされると過大なロットでエントリーしてしまう。
2. ドローダウン中の心理的判断が必要
大きなドローダウン後、複利計算通りにロットを下げるのは数学的に正しいが、「一時的なドローダウンなのか、戦略の劣化なのか」は人間が判断すべきだ。戦略が劣化しているなら、ロットを下げるのではなく戦略そのものを見直す必要がある。
3. 規制・ブローカー制約
GMO Coin FXでは、ロットサイズに最小/最大制約がある。自動計算の結果がこの制約を超える場合、エラーハンドリングが必要だが、制約値はブローカーが予告なく変更する可能性がある。人間が最終チェックすることで、このリスクを回避する。
システム設計
実行タイミング
毎日23:10 JSTにlaunchd(macOSのタスクスケジューラ)で自動実行される。この時刻を選んだ理由は:
- 日本のFX市場が閉じた後(ポジションが確定した状態)
- 翌日のトレード開始前(07:00 JST)に十分な余裕がある
- 手動でロット変更を反映するのに適した時間帯
計算ロジック
def calculate_recommended_lot(
equity: float, # 現在の口座残高(円)
win_rate: float, # 直近の勝率
avg_rr: float, # 直近のリスクリワード比
kelly_fraction: float, # フラクショナルケリー係数(0.25)
sl_pips: float, # SL幅(pips)
pip_value: float, # 1pip の価値(通貨ペア依存)
) -> dict:
# Kelly%算出
kelly_pct = (win_rate * avg_rr - (1 - win_rate)) / avg_rr
risk_pct = max(0.0, kelly_pct * kelly_fraction)
# リスク金額
risk_amount = equity * risk_pct
# ロットサイズ
lot_size = risk_amount / (sl_pips * pip_value)
# GMO Coin制約(最小1,000通貨、1,000通貨単位)
lot_size = max(1000, round(lot_size / 1000) * 1000)
return {
"equity": equity,
"kelly_pct": kelly_pct,
"risk_pct": risk_pct,
"recommended_lot": lot_size,
"risk_amount": risk_amount,
}
Slack通知のフォーマット
[FX-ADD-C2] 複利再投資提案(2026-03-27)
口座残高: ¥545,888
前日比: +¥3,200 (+0.59%)
推奨ロット:
EUR_JPY: 12,000通貨 (現行: 10,000) +2,000
GBP_JPY: 10,000通貨 (現行: 10,000) 変更なし
AUD_JPY: 8,000通貨 (現行: 8,000) 変更なし
Kelly%: 18.2% (fraction=0.25 適用後: 4.6%)
リスク額: ¥25,111 / トレード
※ 提案のみ。適用は手動で設定ファイルを更新してください。
変更が必要なペアには増減を付けて視覚的にわかりやすくしている。変更なしのペアは明示する。
運用上の工夫
変更閾値の設定
微小な残高変動で毎日ロット変更を提案するのは煩雑だ。ロット変更を提案する条件として「推奨ロットが現行ロットから10%以上変化した場合のみ」としている。
CHANGE_THRESHOLD = 0.10 # 10%以上の変化で提案
if abs(recommended - current) / current > CHANGE_THRESHOLD:
notify_change(pair, current, recommended)
else:
notify_no_change(pair, current)
ドローダウン中の安全装置
直近30日の最大ドローダウンが10%を超えている場合、ロット増加の提案を抑制する。
[FX-ADD-C2] ドローダウン警告中
直近30日 最大DD: -12.3%
ロット増加提案を保留しています。
ロット削減のみ提案します。
学んだこと
1. 自動化すべきは「計算」であり「意思決定」ではない
ロットの最適値を毎日計算するのはシステムの仕事だ。しかし「実際にロットを変更するか」は、市場環境・ドローダウン状態・自分のリスク許容度を考慮した人間の判断が必要だ。
2. 複利効果は「忘れないこと」で実現する
複利運用の最大の敵は「ロット更新の忘れ」だ。口座残高が増えてもロットが固定のままでは、単利運用と同じだ。毎日のSlack通知が「複利更新の忘れ」を防ぐ最も確実な方法だった。
3. 提案のフォーマットが継続性を決める
毎日見るSlack通知は、簡潔で一目で判断できるフォーマットが必須だ。「変更が必要かどうか」が1秒で分かるように視覚化した。冗長な通知は読まれなくなる。
まとめ
複利再投資提案システムの設計で重要なのは以下の3点だ。
- 「提案」であり「自動変更」ではない: equity異常値のリスクを人間がチェックする安全設計
- 変更閾値10%: 微小な変動では提案しない。通知疲れを防止
- 毎日23:10の定時通知: 翌日トレード前に判断できるタイミングで、忘れを防止
複利運用は「正しい計算」よりも「忘れずに更新すること」が実は一番難しい。それをSlack通知で自動化することが、このシステムの本質的な価値だ。