Розроблення системи управління ризиками
Управління ризиком — це не набір інструментів, а архітектура, яка пронизує всю торгову систему. Один неконтрольований ризик може знищити місяці прибуткової торгівлі. Система управління ризиками визначає, коли торгувати, скільки торгувати та коли повністю зупинитися.
Ієрархія ризиків
Ринковий ризик — збитки від несприятливого руху ціни. Керується через розміру позиції, стоп-лосс, диверсифікацію.
Ризик виконання — відхилення ціни виконання від очікуваної (ковзання). Особливо критично при високочастотній торгівлі та великих ордерах.
Ризик ліквідності — неможливість закрити позицію за розумною ціною. Актуально для позицій в малоліквідних активах.
Контрагентський ризик — ризик біржі (хак, банкрутство, нормативне заморозження). Вирішується диверсифікацією між кількома біржами та виведенням більшості коштів з бірж.
Операційний ризик — технічні збої, втрата з'єднання, помилки в коді. Вирішується надійною інфраструктурою, автоматичними вимикачами та моніторингом.
Ризик концентрації — надмірна залежність від одного активу або стратегії.
Рівні контролю ризику
Рівень угоди — контроль кожної окремої угоди:
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"
Рівень портфеля — контроль сукупного портфеля:
- Максимальна кількість відкритих позицій (наприклад, 10)
- Максимальна сукупна експозиція (наприклад, 80% капіталу)
- Максимальна Net Delta (сума всіх дельт позицій)
- Концентрація сектора: не більше 30% в одному секторі (DeFi, Layer-1 тощо)
Рівень сеансу — денні/тижневі обмеження:
- Максимальне денне втрат: 3% депозиту → автоматична зупинка торгівлі
- Максимальна тижнева просадка: 8% → потребує ручного втручання
- Максимум угод на день: 20 → захист від перетрадування
Реалізація монітора ризику портфеля
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 = {}
# Перевірка просадки
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_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 = 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])
Стрес-тестування та аналіз сценаріїв
Історичні сценарії: як би портфель поводився під час:
- Краху в березні 2020 року (BTC -60% за тиждень)
- Краху в травні 2021 року (BTC -50% за місяц)
- Краху Terra/LUNA (>99% за 48 годин)
- Банкрутства FTX (паніка на ринку -25%)
Гіпотетичні сценарії:
- Усі активи коррелюють 0.9 (як під час кризи)
- Ліквідність зникає (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)
Історичний VaR: при поточному портфелю з ймовірністю 95% максимальний однодневний збиток не перевищить X USD. Рраховується на основі історичних повернень портфеля за останні 252 дні.
Моніторинг у реальному часі
Панель приладів (Grafana + Prometheus):
- Поточний P&L та просадка
- Усі відкриті позиції з ризиком кожної
- Сукупний ризик портфеля
- Статус автоматичного вимикача
- Прогрес-бар щоденних втрат
Сигналізація (Telegram Bot з рівнями пріоритету):
- Жовтий: просадка > 50% від ліміту
- Помаранчевий: просадка > 75% від ліміту
- Червоний: автоматичний вимикач спрацював, торгівля зупинена
Журнал аудиту: кожне рішення ризик-системи (блокування ордера, спрацьовування автоматичного вимикача) фіксується з часовою міткою та причиною.
Інтеграція з торговими стратегіями
Risk Management System — це незалежний компонент, вбудований перед виконанням будь-якого ордера. Усі торгові боти та стратегії відправляють ордери через єдиний шлюз ризику:
Trading Strategy → Risk Gateway → Exchange API
Risk Gateway перевіряє всі ліміти, оновлює внутрішній стан, логує. При блокуванні повертає помилку з причиною.
Розробляємо повноцінну систему управління ризиками: перевірки на рівні угоди, моніторинг портфеля, автоматичні вимикачі, модуль стрес-тестування, панель приладів у реальному часі та сигналізація Telegram.







