Разработка системы управления рисками (risk management)
Risk management — не набор инструментов, а архитектура, которая пронизывает всю торговую систему. Один неуправляемый риск способен уничтожить месяцы прибыльной торговли. Система управления рисками определяет когда торговать, сколько торговать и когда полностью останавливаться.
Иерархия рисков
Рыночный риск — потери от неблагоприятного движения цены. Управляется через position sizing, stop-loss, диверсификацию.
Execution risk — отклонение цены исполнения от ожидаемой (slippage). Особенно критично при high-frequency торговле и крупных ордерах.
Liquidity risk — невозможность закрыть позицию по разумной цене. Актуально для позиций в малоликвидных активах.
Counterparty risk — риск биржи (hack, bankruptcy, regulatory freeze). Решается диверсификацией между несколькими биржами и выводом большей части средств с бирж.
Operational risk — технические сбои, потеря соединения, ошибки в коде. Решается через надёжную инфраструктуру, circuit breakers и мониторинг.
Concentration risk — чрезмерная зависимость от одного актива или стратегии.
Уровни risk controls
Trade level — контроль каждой отдельной сделки:
class TradeRiskCheck:
def __init__(self, max_position_size_pct=0.10, max_risk_per_trade_pct=0.02):
self.max_position_pct = max_position_size_pct
self.max_risk_pct = max_risk_per_trade_pct
def validate(self, trade, portfolio_value, current_positions):
# Проверка 1: максимальный размер позиции
position_value = trade.qty * trade.price
if position_value / portfolio_value > self.max_position_pct:
return False, "Position size exceeds limit"
# Проверка 2: риск на сделку
trade_risk = abs(trade.price - trade.stop_loss) * trade.qty
if trade_risk / portfolio_value > self.max_risk_pct:
return False, "Risk per trade exceeds limit"
# Проверка 3: корреляция с текущим портфелем
portfolio_corr = self.calculate_portfolio_correlation(
trade.symbol, current_positions
)
if portfolio_corr > 0.8:
return False, "Too correlated with existing positions"
return True, "OK"
Portfolio level — контроль совокупного портфеля:
- Максимальное количество открытых позиций (например, 10)
- Максимальная совокупная экспозиция (например, 80% капитала)
- Максимальный Net Delta (сумма всех position deltas)
- Sector concentration: не более 30% в одном секторе (DeFi, Layer-1, etc.)
Session level — дневные/недельные лимиты:
- Maximum daily loss: 3% депозита → автоматический стоп торговли
- Maximum weekly drawdown: 8% → требует ручного вмешательства
- Maximum trades per day: 20 → защита от overtrading
Реализация Portfolio Risk Monitor
from dataclasses import dataclass
from typing import List, Dict
import numpy as np
@dataclass
class Position:
symbol: str
qty: float
avg_price: float
stop_loss: float
current_price: float
@property
def unrealized_pnl(self):
return (self.current_price - self.avg_price) * self.qty
@property
def position_value(self):
return self.current_price * self.qty
@property
def risk_amount(self):
return abs(self.current_price - self.stop_loss) * self.qty
class PortfolioRiskMonitor:
def __init__(self, initial_capital: float, config: dict):
self.initial_capital = initial_capital
self.peak_capital = initial_capital
self.config = config
self.positions: List[Position] = []
self.daily_pnl = 0
self.session_start_capital = initial_capital
def update_capital(self, current_capital: float):
self.peak_capital = max(self.peak_capital, current_capital)
self.daily_pnl = current_capital - self.session_start_capital
def get_current_drawdown(self, current_capital: float) -> float:
return (self.peak_capital - current_capital) / self.peak_capital
def check_circuit_breakers(self, current_capital: float) -> dict:
alerts = {}
# Drawdown check
dd = self.get_current_drawdown(current_capital)
if dd > self.config['max_drawdown']:
alerts['max_drawdown'] = f"CRITICAL: Drawdown {dd:.1%} exceeded limit"
# Daily loss check
daily_loss_pct = -self.daily_pnl / self.session_start_capital
if daily_loss_pct > self.config['max_daily_loss']:
alerts['daily_loss'] = f"HALT: Daily loss {daily_loss_pct:.1%} exceeded"
# Total risk exposure
total_risk = sum(p.risk_amount for p in self.positions)
risk_pct = total_risk / current_capital
if risk_pct > self.config['max_portfolio_risk']:
alerts['portfolio_risk'] = f"WARNING: Total risk {risk_pct:.1%}"
return alerts
def get_correlation_matrix(self, price_data: Dict[str, list]) -> np.ndarray:
symbols = list(price_data.keys())
returns = {s: np.diff(np.log(price_data[s])) for s in symbols}
return np.corrcoef([returns[s] for s in symbols])
Stress testing и scenario analysis
Historical scenarios: как бы повёл себя портфель при:
- Краш марта 2020 (BTC -60% за неделю)
- Краш мая 2021 (BTC -50% за месяц)
- Terra/LUNA collapse (>99% за 48h)
- FTX bankruptcy (рыночная паника -25%)
Hypothetical scenarios:
- Все активы коррелируют 0.9 (as in crisis)
- Ликвидность исчезает (bid-ask spread ×10)
- Одновременное срабатывание всех стопов
def stress_test_portfolio(positions, scenarios):
results = {}
for scenario_name, price_shocks in scenarios.items():
total_pnl = 0
for position in positions:
shock = price_shocks.get(position.symbol, price_shocks.get('DEFAULT', 0))
pnl = position.qty * position.current_price * shock
total_pnl += pnl
results[scenario_name] = total_pnl
return results
VAR (Value at Risk) интеграция
Historical VAR: при текущем портфеле, с вероятностью 95%, максимальный однодневный убыток не превысит X USD. Рассчитывается на основе исторических returns портфеля за последние 252 дня.
Мониторинг в реальном времени
Dashboard (Grafana + Prometheus):
- Текущий P&L и drawdown
- Все открытые позиции с риском каждой
- Совокупный portfolio risk
- Circuit breaker статус
- Daily loss progress bar
Алерты (Telegram Bot с priority levels):
- 🟡 WARNING: drawdown > 50% от лимита
- 🟠 ALERT: drawdown > 75% от лимита
- 🔴 HALT: circuit breaker сработал, торговля остановлена
Audit log: каждое решение риск-системы (блокировка ордера, срабатывание circuit breaker) логируется с timestamp и причиной.
Интеграция с торговыми стратегиями
Risk Management System — независимый компонент, который встраивается перед исполнением любого ордера. Все торговые боты и стратегии отправляют ордера через единый risk gateway:
Trading Strategy → Risk Gateway → Exchange API
Risk Gateway проверяет все limits, обновляет internal state, логирует. При блокировке — возвращает ошибку с причиной.
Разрабатываем полноценную систему risk management: trade-level checks, portfolio monitoring, circuit breakers, stress testing модуль, realtime dashboard и Telegram алерты.







