Риск-движок — это список того, чего боту делать нельзя
Управление риском в торговом боте — не вычисление. Это набор отказов, зашитых в код, с которыми стратегия не может спорить.
Инженеры Vizanix · об авторе
- РАЗДЕЛ
- Архитектура ботов
- ОПУБЛИКОВАНО
- 2026-08-28
- ГЛАВ
- 6
- ЧИТАТЬ ДАЛЬШЕ
- 3
- ЯЗЫК
- написано на русском
Стратегии оптимистичны по построению — они существуют, чтобы находить поводы торговать. Риск-движок существует, чтобы говорить нет. Если эти двое живут в одном коде, побеждает оптимизм: тот, кто пишет стратегию, находится под давлением показать результат.
Отказы, а не поправки
Риск-движок оценивает намерение и возвращает: одобрено, уменьшено или отклонено — и в любом случае с записанной причиной. Он не даёт вежливых советов. Слой исполнения ему подчиняется, и пути от кода стратегии к бирже в обход него не существует.
@dataclass
class Verdict:
approved: bool
qty: Decimal # может быть меньше запрошенного
reason: str # заполняется всегда, в том числе при одобрении
def evaluate(intent, portfolio, day) -> Verdict:
for rule in RULES: # порядок важен: сначала дешёвые и жёсткие
v = rule(intent, portfolio, day)
if not v.approved:
return v
return Verdict(True, intent.qty, "ok")Правила, которые оправдывают своё место
| Правило | Что ограничивает | Типичный отказ, который предотвращает |
|---|---|---|
| Максимум позиции по символу | Потолок номинала по инструменту | Один сигнал, многократно срабатывающий в огромную позицию |
| Максимум общей экспозиции | Валовая и нетто по всей книге | Десять «независимых» монет, все с бетой к BTC |
| Число одновременных позиций | Лимит слотов | Смена режима рынка, открывающая всё разом |
| Дневной лимит убытка | Реализованный плюс нереализованный с начала сессии | Плохой день, складывающийся в катастрофический |
| Стоп по просадке | От пика эквити к текущему | Медленное кровотечение, которого никто не заметил |
| Потолок плеча | Жёсткий предел ниже биржевого | Эффективное плечо, ползущее вверх по мере падения эквити |
| Расстояние до ликвидации | Минимальный буфер по каждой позиции | Биржа закрывает позицию за вас и по своей цене |
| Серия убытков по символу | Автоблэклист после N убытков | Инструмент, который стратегия перестала понимать |
Последнее стоит реализовать, хотя оно и кажется грубым. Наш сигнальный движок считает серию убытков по каждой монете и автоматически заносит в чёрный список. Иногда инструмент меняет характер — листинг созревает, ликвидность уходит, маркет-мейкер уходит — и стратегия про него теперь просто не права. Счётчик — дешёвый заменитель наблюдательности.
Позиции коррелируют, и риск-движок обязан это знать
Самый частый тихий отказ: пять позиций по одному проценту риска каждая, описываемые как пять процентов риска. На коррелированном рынке это одна позиция с риском в пять процентов, и стопы у них сработают в одну минуту.
Чтобы это улучшить, полная матрица ковариаций не нужна. Грубая группировка — мейджоры, альты, всё, что ходит за BTC, — с потолком экспозиции по группе снимает большую часть ущерба. Наш калькулятор риска делает арифметику видимой: одновременный риск против дневного лимита — то самое сравнение, которое обычно пропускают.
Kill switch должен быть тупым
Любому риск-движку нужно одно действие, которое снимает все ордера и закрывает все позиции, и это должен быть самый простой код в системе. Без совещаний со стратегией, без хитрого расформирования, без ожидания цены получше.
Требования, которые звучат очевидно и постоянно нарушаются:
- Работает с высшим приоритетом запросов — отмены уходят раньше всего остального.
- Доступен вручную с пульта одной командой.
- Идемпотентен. Второе срабатывание не делает ничего.
- Работает, когда слой стратегии завис, потому что не обращается к нему.
- Протестирован. Kill switch, который никто не нажимал, — это гипотеза.
Нереализованное считается
Дневной лимит убытка, считающий только закрытые сделки, может быть соблюдён, пока счёт глубоко под водой в открытых позициях. Считайте реализованное и нереализованное вместе, по текущей цене, и пересчитывайте при каждом обновлении позиции, а не по таймеру.
Каждый отказ логируется
Риск-движок, который молча отклоняет, неотличим от сломанной стратегии. Записывайте намерение, правило, которое его отклонило, и состояние на тот момент. Это та же дисциплина, что запись причины несработавшего сигнала: «бот сегодня ничего не делал» превращается из тревоги в запрос.
Это же даёт материал для настройки. Лимиты, которые никогда не срабатывают, — украшение; лимиты, срабатывающие постоянно, либо откалиброваны неверно, либо сообщают, что стратегия хочет больше риска, чем вы согласились дать. И то и другое стоит знать.
Статья описывает инженерную практику. Это не инвестиционная рекомендация. Vizanix разрабатывает программное обеспечение и не обещает торговую доходность.