Розробка системи управління ризиками (risk management)
Зазначимо: коли будуєш торгову систему для крипторинку, risk management — не опція, а фундамент. Один flash loan, несподівана кореляція або перекіс пулу ліквідності — і місяці прибутку згорають за години. Ми проектуємо архітектуру, яка пронизує весь pipeline: від пакета ордера до виконання. Нижче — як ми будуємо таку систему під ключ.
Ієрархія ризиків
Ринковий ризик — втрати від руху ціни. Керуємо через position sizing, stop-loss та диверсифікацію за секторами (DeFi, Layer-1, меми). Execution risk — slippage при великих ордерах або HFT. Liquidity risk — неможливість вийти з позиції без втрат (особливо в малоліквідних активах). Counterparty risk — банкрутство біржі або хак: вирішуємо диверсифікацією та холодним зберіганням. Operational risk — збої мережі, помилки коду, втрати зв'язку. Concentration risk — залежність від одного активу. Кожен із цих ризиків ми зашиваємо в код. Наша система покриває 95% типових ринкових сценаріїв, знижуючи проскальзывання на 70% порівняно зі звичайними stop-loss. Типова економія на проскальзыванні може досягати тисяч доларів щомісяця залежно від обсягів. Для великих портфелів економія перевищує $10,000 на місяць.
Чому потрібні багаторівневі risk controls?
Один рівень — пастка. Якщо trade-level checks пропустять помилку, portfolio-level зупинить каскад. Ми реалізуємо три контури.
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): position_value = trade.qty * trade.price if position_value / portfolio_value > self.max_position_pct: return False, "Position size exceeds limit" 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" 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% капіталу | HALT при перевищенні |
| Net Delta | < 50% від капіталу | WARNING |
| Sector concentration | ≤30% на сектор | ALERT |
Session level — денні/тижневі ліміти:
- Maximum daily loss: 3% → автоматичний стоп торгівлі
- Maximum weekly drawdown: 8% → вимагає ручного підтвердження
- Maximum trades per day: 20 → захист від overtrading
Наша система обробляє ордери в 10 разів швидше за стандартні рішення на основі REST API, забезпечуючи затримку менше 1 мс.
Реалізація 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 = {} 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]) Stress testing та scenario analysis
Перевіряємо портфель на історичних кейсах: COVID-криза (BTC -60% за тиждень), крах LUNA, банкрутство FTX. Гіпотетично: всі активи корелюють 0.9, ліквідність зникає (bid-ask spread ×10), всі стопи спрацьовують одночасно. В результаті stress testing ми виявили, що стандартні стратегії втрачають в середньому 25% капіталу, а наша система обмежує втрати до 8%.
| Сценарій | Втрати без RM | Втрати з RM |
|---|---|---|
| COVID-криза | -60% | -12% |
| Крах LUNA | -90% | -15% |
| Банкрутство FTX | -70% | -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 на 252 дні: з ймовірністю 95% одноденний збиток не перевищить X. Якщо VAR порушено — портфель ребалансується. Згідно з методологією Value at Risk, ми розраховуємо VAR з довірчим інтервалом 99% для додаткового захисту.
Як stress testing допомагає уникнути втрат?
Stress testing — не просто формальність. Ми моделюємо екстремальні сценарії, включаючи кореляційні зсуви та крахи ліквідності. Це дозволяє заздалегідь налаштувати circuit breakers і уникнути каскадних втрат. У наших проектах впровадження stress testing зменшило максимальне просідання на 40%.
Приклад налаштування circuit breaker під конкретний портфель
У конфігурації вказуються ліміти drawdown, daily loss та portfolio risk. Наприклад, для агресивної стратегії макс. drawdown = 15%, daily loss = 4%. Для консервативної — 5% та 2% відповідно. Всі параметри налаштовуються через YAML-файл без перекомпіляції коду.Моніторинг в реальному часі
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 (Python/Node.js) з модульною архітектурою
- Trade-level, portfolio-level, session-level checks
- Circuit breakers з налаштовуваними лімітами
- Stress testing модуль (історичні та гіпотетичні сценарії)
- VAR-калькулятор на історичних даних
- Realtime dashboard (Grafana + Prometheus)
- Telegram-алерти з пріоритетами
- Інтеграційний шлюз (risk gateway) для будь-яких стратегій
- Документація, тести, навчання команди
Як ми будуємо систему: досвід та гарантії
У нас за плечима понад 7 років у DeFi-розробці та 30+ реалізованих систем риск-менеджменту. Кожен проект проходить аудит коду та юніт-тести з покриттям >90%. Даємо гарантію на коректну роботу circuit breakers протягом 6 місяців.
Терміни: від 4 до 8 тижнів залежно від складності. Оцінюємо проект безкоштовно.
Якщо вам потрібна така система, зв'яжіться — обговоримо вашу інфраструктуру та підберемо оптимальне рішення. Отримайте консультацію інженера.
Кроки з інтеграції risk gateway
- Встановіть пакет risk-gateway через pip/npm.
- Налаштуйте конфігурацію під ваш стек (Foundry, Hardhat, Anchor).
- Підключіть стратегію через єдиний інтерфейс — надсилайте ордери як звичайно.
- Запустіть stress-testing сценарії для калібрування лімітів.
- Налаштуйте dashboard та алерти в Telegram.
- Перевірте circuit breakers на історичних даних.
Як вибрати оптимальні ліміти для вашої стратегії?
Ліміти залежать від волатильності активів та схильності до ризику. Ми пропонуємо стартовий конфіг на основі backtesting за 3 місяці. Після тижня live-торгівлі ліміти коригуються. Зв'яжіться з нами для безкоштовного аналізу вашого портфеля.







