Как мы моделируем каскадный коллапс финансового рынка. И зачем это нужно всем
В прошлом посте мы рассказывали, как дообучили SLM для финансовой аналитики. Сегодня — про то, что эта модель питает данными: движок системных рисков, который моделирует каскадный коллапс целого финансового рынка.
Не одного банка. Не одного портфеля. Всего рынка — с сотнями участников, сетями взаимных обязательств и цепными реакциями, которые превращают локальный шок в системный кризис.
Зачем это нужно
Кризис 2008 года показал: финансовая система — это не набор независимых институтов. Это граф. Банк A должен банку B, банк B должен банку C, все держат одни и те же активы. Падает один — через сеть экспозиций падают все.
Lehman Brothers был 4-м по размеру инвестбанком. Но его банкротство запустило каскад, который обрушил мировую экономику. Потому что никто не моделировал сеть — только отдельные узлы.
Сегодня это задача макропруденциального надзора: ЦБ как мегарегулятор должен видеть не отдельные банки, а всю систему целиком. Кто является системно значимым? Какой минимальный шок сломает рынок? Как распространяется заражение?
Модуль 1: Сетевая Contagion-симуляция
Финансовый рынок — это направленный граф. Узлы — участники (банки, брокеры, УК, инфраструктура). Рёбра — взаимные обязательства: кредиты, репо, OTC-деривативы, депозиты.
Что мы считаем
DebtRank — метрика системной значимости каждого узла. Алгоритм Battiston et al.: принудительно дефолтим участника, запускаем каскад и измеряем, какую долю совокупного капитала системы уничтожит его падение.
Не размер определяет опасность — а связность. Средний по размеру банк с экспозициями на всех остальных участников может быть опаснее крупнейшего.
Каскадная симуляция — до 50 раундов распространения:
1. Раунд 0: прямые дефолты (капитал < шока)
2. Раунды 1–50: убытки от дефолтов контрагентов распространяются по сети
3. Каждый раунд — новые дефолты, новые убытки, пока система не стабилизируется
Идентификация SIFI — системно значимые финансовые институты. Топ-20% участников по DebtRank автоматически помечаются как SIFI. Это те узлы, чей дефолт вызовет непропорциональный каскадный эффект.
Community Detection — кластеризация участников по структуре связей. Показывает, какие группы институтов связаны сильнее всего и где проходят линии разлома.
Технические детали
– Матрица экспозиций N×N (до 500 участников)
– Eigenvector centrality для оценки влияния в графе
– Absorption Ratio — спектральный анализ матрицы (топ-2 собственных значения), метрика интеграции рынка
– Force-directed layout для визуализации сети (50 итераций spring-алгоритма, серверный расчёт)
– Топ-50 рёбер по весу — ключевые каналы заражения
Модуль 2: Batch Stress Testing с Fire-Sale Feedback
Классический стресс-тест проверяет один сценарий за раз. Мы прогоняем до 200 сценариев на одной сети из 500 узлов за один запрос.
Сценарии
Пять типов шоков, каждый с настраиваемой магнитудой:
– rate_shock — процентный шок (ставка ЦБ +500 б.п.)
– fx_shock — девальвация рубля
– liquidity_shock — замораживание рынка
– credit_shock — принудительный дефолт ~20% целевых участников
– equity_shock — обвал стоимости активов
Fire-Sale Feedback
Это то, чего нет в большинстве стресс-тестов. Когда участник дефолтит, он вынужден ликвидировать активы. Массовая ликвидация давит цены вниз. Упавшие цены обесценивают залоги у других участников — и запускают новый виток дефолтов.
Наша реализация — модель fixed-point iteration:
– Piecewise-linear price impact: `impact = elasticity × (volume / market_depth)`
– До 20 итераций до сходимости
– Discount floor 50% — максимальное падение цены актива
Без fire-sale feedback стресс-тест занижает потери на 30–60%. С ним — показывает реальную картину.
Модуль 3: Reverse Stress Testing
Обычный стресс-тест спрашивает: «Что будет, если?»
Reverse stress test спрашивает: «Какой минимальный шок сломает систему?»
Это задача оптимизации: найти вектор шоков с минимальной L1-нормой, при котором каскад приводит к заданному уровню дефолтов.
Два солвера
MIP Solver (основной) — Mixed-Integer Programming через PuLP + CBC:
– Минимизирует суммарный объём шока
– Ограничение: каскад должен вызвать ≥ N% дефолтов
– Линеаризованная формулировка: `shock[i] ≥ (capital[i] + ε) × default[i]`
Greedy Fallback — если MIP не сходится за отведённое время:
– Сортирует узлы по DebtRank (самые влиятельные первыми)
– Последовательно применяет шоки, пока не достигнет целевого уровня дефолтов
Зачем это нужно
Reverse stress test показывает хрупкость системы. Если для 30% дефолтов достаточно шока на 3 узла из 100 — это сигнал. Система выглядит устойчивой, но имеет критическую точку.
Результат: вектор шоков по каждому узлу, общий объём шока, количество раундов каскада, статус солвера (OPTIMAL / FEASIBLE / INFEASIBLE / TIMEOUT).
Hard timeout через ProcessPoolExecutor — CBC-солвер может зависнуть на сложных задачах, поэтому жёсткий wall-clock лимит обязателен.
Что под капотом
C++ ускорение
Каскадная симуляция на 500 узлах × 200 сценариев — это вычислительно тяжело. Критический путь переведён на C++ с OpenMP-параллелизмом:
– `systemic_native.simulate_cascade()` — нативный каскад
– `systemic_native.batch_cascade()` — батч с OpenMP
– Python fallback с `asyncio.Semaphore(4)` для совместимости
Rate Limiting
Тяжёлые эндпоинты защищены:
– Batch stress: 5 запросов/минуту
– Network contagion: 10 запросов/минуту
– Reverse stress: 5 запросов/минуту
Валидация
– Максимум 500 узлов, 200 сценариев
– До 50 раундов каскада
– Pydantic v2 модели с автоматическим отклонением NaN/Inf
– Упавшие сценарии трекаются отдельно — батч никогда не прерывается целиком
Уровни зума
Системные риски — это макро-уровень нашей платформы. Но все модули связаны:
Macro → системные риски, contagion, рыночная стабильность (этот модуль)
Meso → секторы, отдельные участники, сети экспозиций
Micro → портфели, инструменты, тики, ордера
VaR портфеля (micro) ничего не стоит, если не учитывает, что рынок может испытать системный шок (macro). Наша платформа соединяет все уровни в единую картину.
Для кого это
– Центральные банки — макропруденциальный надзор, идентификация SIFI, стресс-тестирование всего рынка
– Риск-менеджеры банков и УК — понимание своего места в сети, оценка контрагентного риска
– Регуляторные команды — compliance со стресс-тестами по Указанию 6556-У
– Исследователи — инструмент для моделирования финансовых сетей без написания кода с нуля
Вместо итога
Мы не строим «ещё один дашборд для трейдера». Мы строим инфраструктуру для тех, кто отвечает за стабильность финансового рынка целиком.
200 сценариев. 500 участников. Fire-sale feedback. Reverse stress testing. Каскадная contagion-симуляция. DebtRank. Всё — в одном терминале, с C++ ускорением и production-grade валидацией.
Строим публично. Продолжение следует.
Егор Галкин, основатель Zeta Terminal
go.zetaterminal.dev