「ドローダウンが-10%を超えたのに、同じロットでトレードし続けてさらに損失が拡大した」——自動売買における最も危険な状態は、損失が膨らんでいるのにリスクを取り続けることだ。
人間なら「最近負けてるから少しロットを落とそう」と判断できるが、自動売買は設定されたルール通りに機械的にトレードし続ける。ドローダウン(直近高値からの資産減少率)が一定水準を超えたとき、自動的にロットを段階的に縮小し、資産の減少速度を抑える「適応的ドローダウン回復モード」を実装した。
ドローダウンとは
ドローダウン(Drawdown、DD)とは、口座残高が過去の最高値からどれだけ減少したかを示す指標だ。
口座残高の推移: 100万 → 110万 → 105万 → 95万 → 102万
最高値: 110万円
現在値: 95万円(最悪時点)
ドローダウン: (110 - 95) / 110 = 13.6%
最大ドローダウン(Max DD)が大きいほど、精神的にも資金的にも厳しい状態になる。DD 50%からの回復には+100%のリターンが必要だ(50万が元の100万に戻るには2倍にする必要がある)。
3段階ソフトストップの設計
なぜ「ハードストップ」ではないのか
一般的なリスク管理では「DD 10%で全トレード停止」のようなハードストップ(即時停止)が使われる。しかしこれには問題がある。
- 停止タイミングが最悪: DDが最大になった直後はV字回復の可能性も高い。最悪のタイミングで止めてしまう
- 再開の判断が難しい: 一度止めると「いつ再開するか」の明確な基準がない
- 全か無か: 全停止か通常運転のどちらかしかなく、中間の選択肢がない
そこで「段階的にロットを縮小する」ソフトストップ方式を採用した。
3段階の設定
DRAWDOWN_RECOVERY_STAGES = {
"STAGE_1": {
"dd_threshold": 0.03, # DD 3%以上
"lot_multiplier": 0.5, # ロットを50%に縮小
"label": "警戒モード",
},
"STAGE_2": {
"dd_threshold": 0.05, # DD 5%以上
"lot_multiplier": 0.25, # ロットを25%に縮小
"label": "回復モード",
},
"STAGE_3": {
"dd_threshold": 0.10, # DD 10%以上
"lot_multiplier": 0.0, # 新規エントリー停止
"label": "停止モード",
},
}
| ステージ | DDトリガー | ロット倍率 | 意味 |
|---|---|---|---|
| 通常 | DD < 3% | 1.0(100%) | 通常通りのトレード |
| STAGE 1 | DD 3〜5% | 0.5(50%) | ロット半分で慎重にトレード |
| STAGE 2 | DD 5〜10% | 0.25(25%) | 最小限のロットで様子見 |
| STAGE 3 | DD ≥ 10% | 0.0(停止) | 新規エントリーを完全停止 |
ソフトストップの数学的根拠
DD 3%でロットを半分にすると、その後の損失速度が半分になる。仮にDD 3%→5%まで追加で-2%のDDがあった場合:
- 通常ロット: 追加損失 = -2%
- 半分ロット: 追加損失 = -1%(DDは4%で済む)
ロット縮小は「損失の加速を止めるブレーキ」として機能する。
DDの計算方法
ハイウォーターマーク方式
DDは「ハイウォーターマーク」(過去最高値)からの下落率として計算する。
def calculate_drawdown(
current_equity: float,
high_water_mark: float,
) -> float:
if high_water_mark <= 0:
return 0.0
return (high_water_mark - current_equity) / high_water_mark
ハイウォーターマークは「これまでの口座残高の最大値」であり、利益が出るたびに更新される。
口座推移: 50万 → 53万(HWM更新) → 51万(DD=3.8%) → 55万(HWM更新) → 52万(DD=5.5%)
計算頻度
DDの計算はトレードの損益確定ごとに実行する。ポジション保有中の含み損益は計算に含めない(確定損益ベース)。これは「含み損が一時的に膨らんでも、決済されるまでは損失ではない」という考え方に基づく。
回復判定
DDが改善(口座残高が回復)した場合、ステージを1段階ずつ戻す。
DD 12%(STAGE 3: 停止中)
→ 利益確定でDD 8%に改善 → STAGE 2に移行(ロット25%で再開)
→ さらにDD 4%に改善 → STAGE 1に移行(ロット50%)
→ DD 2%に改善 → 通常モードに復帰(ロット100%)
注意点として、「STAGE 3からいきなり通常モードに戻さない」ことが重要だ。段階的にロットを増やすことで、「回復したと思ったら再度下落」のリスクに対処する。
FX + JS 両エンジンへの適用
この仕組みはFXエンジンと日本株(JS)エンジンの両方に適用している。エンジンの共通レイヤー(core/shared/)に実装し、各エンジンから参照する設計だ。
ただしDD閾値はエンジンごとに異なる。
| エンジン | STAGE 1 | STAGE 2 | STAGE 3 |
|---|---|---|---|
| FX | DD 3% | DD 5% | DD 10% |
| JS | DD 3% | DD 5% | DD 10% |
現時点では同じ閾値を使っているが、エンジンごとのボラティリティ特性に応じて将来的に調整する余地を残している。
Slack通知
ステージ遷移時にSlack通知を送る。
[DD-RECOVERY] ドローダウン回復モード移行
エンジン: FX
DD: 3.2%(STAGE 1: 警戒モード)
ロット倍率: 0.5(50%に縮小)
HWM: ¥545,888 → 現在: ¥528,442
[DD-RECOVERY] 通常モード復帰
エンジン: FX
DD: 1.8%
ロット倍率: 1.0(通常に復帰)
学んだこと
1. 「段階的」は「一発停止」より優れている
ハードストップはシンプルだが、DDが閾値付近で行き来するとON/OFFが頻繁に切り替わる(チャタリング)。3段階のソフトストップはこの問題を自然に回避する。
2. DD計算は確定損益ベースが安全
含み損益ベースでDDを計算すると、ポジション保有中に頻繁にステージ遷移が発生する。含み損はまだ損失ではない。確定損益ベースにすることで、過剰反応を抑制できる。
3. 回復も段階的に行う
STAGE 3(停止)からいきなりフルロットに戻すと、「回復したと思ったら再度急落」で大ダメージを受ける。1段階ずつ戻すことで、回復が本物かどうかを確認しながら通常運転に戻す。
まとめ
適応的ドローダウン回復モードの設計で重要なのは以下の3点だ。
- 3段階ソフトストップ: DD 3%/5%/10%でロットを50%/25%/0%に段階縮小。一発停止より安定的
- 確定損益ベースのDD計算: 含み損の一時的な膨張で過剰反応しない
- 段階的な回復: STAGE 3→通常の直接復帰はしない。1段階ずつ戻してリスクを管理
ドローダウン管理は「損失を出さない」ためではなく「損失の加速を止める」ためにある。トレードで負けること自体は避けられないが、負けが連鎖して資産が壊滅的に減ることは防げる。