Разработка системы максимальной просадки (max drawdown control)
Максимальная просадка (Maximum Drawdown, MDD) — наибольшее снижение от пика до дна портфеля за период. Это ключевая метрика риска: трейдер может пережить многие плохие периоды, но катастрофический drawdown психологически и финансово разрушителен.
Расчёт drawdown
import numpy as np
def calculate_max_drawdown(equity_curve):
equity = np.array(equity_curve)
peak = np.maximum.accumulate(equity)
drawdown = (equity - peak) / peak
max_drawdown = drawdown.min()
# Найти период максимального drawdown
end_idx = drawdown.argmin()
start_idx = equity[:end_idx].argmax()
return {
'max_drawdown': max_drawdown,
'start_date_idx': start_idx,
'end_date_idx': end_idx,
'drawdown_duration': end_idx - start_idx
}
def calculate_current_drawdown(equity_history):
peak = max(equity_history)
current = equity_history[-1]
return (current - peak) / peak
Уровни реакции системы
Система работает по принципу светофора:
Зелёный (drawdown < 50% лимита): нормальная торговля.
Жёлтый (50–75% лимита): предупреждение. Уменьшить размер позиций на 25%.
Оранжевый (75–90% лимита): серьёзное предупреждение. Уменьшить размер на 50%. Только высококачественные сигналы.
Красный (> 90% лимита): почти достигнут лимит. Закрыть половину открытых позиций.
Стоп (= 100% лимита): автоматическое закрытие всех позиций. Полная остановка торговли до ручного подтверждения.
class DrawdownController:
LEVELS = [
(0.50, 'yellow', 0.75), # at 50% of limit: trade at 75% size
(0.75, 'orange', 0.50),
(0.90, 'red', 0.25),
(1.00, 'halt', 0.00)
]
def __init__(self, max_drawdown_limit=0.15):
self.limit = max_drawdown_limit
self.peak_equity = None
def update_and_check(self, current_equity):
if self.peak_equity is None or current_equity > self.peak_equity:
self.peak_equity = current_equity
current_dd = (self.peak_equity - current_equity) / self.peak_equity
dd_ratio = current_dd / self.limit # как доля от лимита
for threshold, level, size_mult in reversed(self.LEVELS):
if dd_ratio >= threshold:
return {
'level': level,
'current_dd': current_dd,
'dd_ratio': dd_ratio,
'size_multiplier': size_mult,
'halt': level == 'halt'
}
return {'level': 'green', 'size_multiplier': 1.0, 'halt': False}
Drawdown recovery tracking
Time to recovery: сколько времени понадобилось для восстановления после предыдущих drawdown. Помогает оценить качество стратегии.
Recovery factor: общая прибыль / максимальный drawdown. Показывает, насколько система «окупает» риск.
Underwater chart: график времени нахождения портфеля в просадке — важный инструмент психологической оценки для трейдера.
Калибровка лимитов
Типичные значения max drawdown по типу стратегии:
| Тип стратегии | Рекомендуемый MDD limit |
|---|---|
| Консервативная (trend following) | 15–20% |
| Умеренная (mean reversion) | 10–15% |
| Агрессивная (HFT, scalping) | 5–8% |
| Маркет-мейкинг | 3–5% |
Разрабатываем систему контроля просадки с многоуровневым реагированием, автоматическим уменьшением позиций, circuit breaker halt и отчётностью по recovery времени.







