Как мы моделируем каскадный коллапс финансового рынка. И зачем это нужно всем

Как мы моделируем каскадный коллапс финансового рынка. И зачем это нужно всем

В прошлом посте мы рассказывали, как дообучили 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