
Модель кредитного риска, обученная на данных до 2009 года, ранжирует займы с ROC-AUC 0.89. Ожидаемые потери портфеля она оценила в 161 млн долларов, реальные составили 546. Увидеть эту ошибку можно было еще в 2007 году, за год до дна ROC-AUC, но не в метриках качества, а взвесив ошибку модели деньгами. Ниже — прогон на 26.5 млн реальных ипотечных записей, метрики против денег. Числа воспроизводятся до последнего разряда — код движка и инструкции в опенсорсе.
Привет, Хабр!
Я собрал MAMIR (Multi-domain Analytics & Modeling for Incident Risk) — движок риск-аналитики. Он принимает поток событий, выдает вероятности, а поверх них считает портфель — сколько денег под риском, где они сосредоточены и что модель про них говорила. Первым делом прогнал на нем ипотечный кризис 2008 года. Проект соло, весь код и ошибки ниже мои.
Идея «деньги поверх модели» не моя. Ей почти сорок лет. Она появилась после того, как ипотечное подразделение First Boston потеряло за три месяца сто миллионов долларов.
Сначала про Aladdin
В 1986 году Ларри Финк руководил ипотечным направлением в First Boston и за один квартал потерял около 100 миллионов долларов1. Страховка от движения ставок строилась на неверном предположении о том, как поведут себя досрочные погашения. Важнее суммы оказалась формулировка, которую Финк повторял потом десятилетиями: «мы не знали, какой риск на себя взяли». Позиция была сложной, и никто в фирме не мог разложить ее на составляющие.
BlackRock, который Финк основал через два года, строился как ответ на тот квартал. Внутренняя риск-система выросла в Aladdin — платформу, на которой сегодня считает риск сам BlackRock с его примерно 15 триллионами долларов2 под управлением, а вместе с ним пара сотен3 банков и фондов, включая прямых конкурентов.
Про Aladdin ходят два заблуждения. Первое — что он предсказал кризис 2008 года и заранее вывел BlackRock из ипотеки. В октябре 2006-го, на самом пике пузыря, BlackRock с партнерами купил жилой комплекс Stuyvesant Town4 на Манхэттене за 5.4 миллиарда долларов. В январе 2010-го объект отдали кредиторам5. В историю кризиса BlackRock вошел с другой стороны. В марте 2008-го ФРС наняла его разбирать портфель уже рухнувшего Bear Stearns6. Это не прогноз, а вскрытие.
Второе заблуждение — будто Aladdin это очень хорошая модель риска. Модель там как раз заменяемая. Похожие расчеты риска продают MSCI, Bloomberg и еще полдюжины компаний. Ценность в портфельном слое. Aladdin складывает десятки тысяч разнородных позиций в один портфель и отвечает на вопросы, которых у отдельной позиции не существует — сколько денег под риском, где они сосредоточены, что будет при заданном шоке, насколько плохим может быть год. Риск здесь — свойство портфеля, а не отдельной позиции.
Это и хотелось проверить руками. Саму модель оценки вероятности дефолта сегодня можно собрать за вечер. Вопрос — что добавляет денежный слой поверх модели и увидит ли он то, чего не видят метрики. Настоящий кризис — лучший тест, потому что правильный ответ известен заранее.
Данные и правила проверки
Данные — Freddie Mac Single-Family Loan-Level, открытая помесячная история ипотечных займов: просрочки, дефолты, продажи залога. Я взял 50 000 займов каждого года выдачи с 1999 по 2007. Всего вышло 450 000 займов и 26 538 649 помесячных записей.
Данные официальные и доступны любому. На странице датасета регистрируешься и качаешь sample-файлы, по паре на каждый год выдачи: выдача и помесячное обслуживание. Структура полей описана в официальном User Guide. Перераспространять данные лицензия запрещает, поэтому в репозитории лежит только то, что из них посчитано (метрики, кейсы, графики), а загрузчик собирает базу из скачанных файлов одной командой.
Модель — градиентный бустинг из библиотеки scikit-learn со стандартными настройками. Поверх стоит калибровка, она превращает сырые оценки модели в вероятности. Модель здесь самая обычная, интерес — в протоколе и слоях над ней.
Протокол проверки называется walk-forward. Шесть годовых шагов с 2005 по 2010. На каждом шаге модель обучается только на том, что было известно до начала тестового года, и оценивается на годе, которого не видела. Делить случайно нельзя — на временных данных это подглядывание в будущее.
Фичи — это признаки, по которым модель судит о займе: сколько месяцев просрочки за год, какая ставка, какой остаток долга. Каждая фича описывается коротким объявлением, а считает ее движок:
// сколько месяцев за последний год заем был в просрочке { name: 'loan_dlq_months_365d', entity: 'loan', agg: 'count', window: '365d', where: [{ field: 'CurrentLoanDelinquencyStatus', op: 'gte', value: 1 }], }
Из одного объявления компилируются две формы SQL: оконная для бэктеста и точечная для real-time скоринга. Что обе формы дают одно и то же, проверяет тест на 3 200 парах «событие, момент», и расхождений ноль. Сам тест испытан поломкой — замена < на <= в одной из форм дает 272 расхождения. Окно фичи фильтруется по моменту, когда событие стало известно системе, а не когда произошло. Метка должна успеть подтвердиться до момента обучения, иначе бэктест учится на будущем. Все слои ниже считаются из одних и тех же векторов, второго кодового пути нет.
Проверка, что бэктест не использует будущих данных, встроена в проект вторым доменом — синтетическим потоком карточных транзакций, где метка специально сделана случайной и не зависит ни от одной фичи. Правильный ответ известен заранее, ROC-AUC обязан быть 0.5. Движок выдает 0.492–0.504 по трем окнам. Любой результат лучше случайного означал бы утечку будущего в фичи.
Домен — плагин, который говорит движку, что считать. Ипотека, карточные транзакции или что-то другое.
Что видит модель
У вероятностной модели есть два независимых свойства.
Ранжирование — из двух займов назвать более рискованным тот, который действительно сломается. Его меряет ROC-AUC.
Калибровка — когда модель говорит «30%», из таких займов должен ломаться примерно каждый третий. Ее меряют Brier (средний квадрат ошибки вероятности) и ECE (средний разрыв между обещанной вероятностью и наблюдаемой частотой).
тестовое окно | событий | доля дефолтов | ROC-AUC | PR-AUC | Brier | ECE |
|---|---|---|---|---|---|---|
2005 | 1 782 314 | 0.579% | 0.9347 | 0.3298 | 0.004571 | 0.00206 |
2006 | 2 129 557 | 0.535% | 0.9245 | 0.2763 | 0.004438 | 0.00186 |
2007 | 2 505 082 | 0.727% | 0.8627 | 0.2182 | 0.006306 | 0.00334 |
2008 | 2 606 167 | 2.044% | 0.8175 | 0.2788 | 0.017666 | 0.01428 |
2009 | 2 263 057 | 4.521% | 0.8943 | 0.5072 | 0.032767 | 0.02769 |
2010 | 1 878 314 | 6.081% | 0.9306 | 0.6038 | 0.033760 | 0.01040 |
Полная таблица доступна в README репозитория, а пять независимых прогонов дают эти числа до последнего разряда. В спокойных окнах на один дефолт приходится около 170 записей без дефолта, и на таком дисбалансе высокий ROC-AUC дается легко. А рост PR-AUC к 2010-му — не улучшение модели, а прямое следствие доли дефолтов, которая выросла в десять раз.
ROC-AUC просел с 0.935 до 0.818 и к 2010-му вернулся к 0.931. Колебание, которое на дашборде спишут на шум или сезонность. За те же окна Brier вырос в 7.4 раза, ECE в 14.9. Модель продолжала верно ранжировать, кто рискованнее, а вероятности при этом врали в разы.
Калибровочная кривая кризисного окна показывает масштаб. Модель, обученная до 1 января 2009-го, обещала на 2009-й 0.40% дефолтов там, где случилось 1.92%, а в верхних группах 16% против 42%. Вероятностей выше 0.73 она не выдает вовсе. Калибровочный слой не видел в докризисной истории таких частот, и подняться выше ему не из чего. «Модель не знала, что так бывает» — здесь буквальное описание механизма, а не фигура речи.

Это потолок метрик, которые считаются по событиям. Ранжирование, калибровка, кривые — все это вопросы про модель. Ни одна из этих цифр не говорит, сколько денег стоит ошибка и где она лежит.
Теперь взвесим ошибку деньгами
Все метрики выше считаются по событиям, где заем на 50 тысяч долларов весит столько же, сколько заем на 700 тысяч. Портфелю не все равно. Поэтому рядом считается вторая ECE, в которой каждое событие весит своей суммой под риском. Отношение взвешенной к обычной — перекос. Пока перекос меньше единицы, ошибка сидит на мелких займах. Больше единицы — ошибка переехала на крупные, туда, где деньги.

тестовое окно | ECE | ECE, взвеш. | перекос |
|---|---|---|---|
2005 | 0.00206 | 0.00184 | 0.89 |
2006 | 0.00186 | 0.00182 | 0.98 |
2007 | 0.00334 | 0.00412 | 1.24 |
2008 | 0.01428 | 0.01933 | 1.35 |
2009 | 0.02769 | 0.04018 | 1.45 |
2010 | 0.01040 | 0.02018 | 1.94 |
Переход через единицу случился на окне 2007 года, за год до дна ROC-AUC. Обычная ECE в 2007-м тоже выросла, слом виден и по ней. Но она не говорит, где ошибка. Перекос говорит — на крупных займах.
Первым напрашивался вывод, что модель не умеет учитывать размер позиции. Проверка эталонами его опровергла. Тем же протоколом посчитаны три эталона: сортировка по одной колонке просрочки без всякого обучения, логистическая регрессия на тех же фичах и бустинг без балансировки классов. Перекос переходит через единицу в 2007-м у всех четырех разом, 1.18–1.30. Сортировка без обучения дает тот же сдвиг, что четыреста деревьев. Значит, перекос измеряет не слабость конкретной модели, а свойство самого кризиса. Он переехал на крупные займы, и это попадает в ошибку любого способа оценки, который не учитывает размер позиции. Заметить такое можно только метрикой, взвешенной деньгами. У событийных метрик веса нет.
По обычным метрикам 2010-й читается как выздоровление. ROC-AUC вернулся к 0.931, ECE упала в 2.7 раза. Взвешенная ECE упала только вдвое, а перекос вырос до максимума за все шесть окон. Разбивка по децилям остатка долга (займы делятся на десять равных групп, от мелких к крупным) показывает, что произошло. Модель выучила новый уровень риска и стала переоценивать мелкие займы (×0.64 к факту в первом дециле), продолжая недооценивать крупные (×1.44 в десятом). В среднем ошибки гасят друг друга, и калибровка выглядит починившейся. Портфелю гасить нечем. Недооценка крупного займа не компенсируется переоценкой мелкого, в деньгах они складываются.
Сколько это стоило портфелю

В портфеле на 1 января 2009 года 207 867 займов на 29.83 млрд долларов остатка долга, причем на 1% позиций приходится 40.2% ожидаемых потерь. Модель, обученная до этой даты, ожидала потерь на 161.4 млн. Реализовалось 546.4 млн, разрыв ×3.39.
В штуках разрыв меньше — 2 272 ожидаемых дефолта против 6 455 фактических, ×2.84. Разница между «в деньгах» и «в штуках» — вторая, отдельная ошибка, и разбивка по децилям остатка долга показывает, откуда она берется:

дециль по остатку долга | обещано | факт | факт/обещано | |
|---|---|---|---|---|
1 | мелкие | 0.85% | 1.43% | ×1.68 |
10 | крупные | 1.28% | 5.78% | ×4.53 |
Фактическая частота дефолтов растет с размером займа вчетверо, обещанная в полтора раза.
На контрольном замере спокойного 2006 года зависимость была обратной. Крупные займы ломались вчетверо реже мелких (0.19% против 0.83%), и модель это верно выучила. Кризис перевернул знак зависимости, а модель за ним не успела. Это хуже, чем просто не заметить размер — модель выучила зависимость, которая перестала быть верной.
Был ли 2009-й вообще возможен по мнению модели

Ожидаемые потери — среднее, и оно не зависит от того, связаны ли дефолты между собой. А вот худшие исходы зависят только от этого. Если считать 207 867 займов независимыми монетками, типичный разброс потерь портфеля выходит около 3 млн, и реализованные 546.4 млн лежат в 130 таких разбросах от предсказания. Модель без корреляции объявляет случившееся невозможным.
Лечится это общим фактором, «состоянием экономики», от которого зависят все займы сразу. Использую однофакторную модель Васичека, ту же, что лежит в основе банковских формул Basel7. У нее один ключевой параметр — связность ρ, мера того, насколько дефолты склонны случаться вместе.
Движок прогоняет 50 000 вариантов года и смотрит, какие потери выпадают. Связность при этом оказалась самым ненадежным параметром всей конструкции. Собственная оценка по годовым частотам гуляет впятеро в зависимости от выбора окна. Поэтому результат — вилка, а не точка:
ρ | откуда взята | VaR99, млн | максимум пути, млн | где легли реальные 546.4 млн |
|---|---|---|---|---|
0.028 | измерена по спокойным годам, до кризиса | 296.0 | 487.3 | выше всех 50 000 вариантов |
0.105 | измерена за весь период, задним числом | 482.8 | 1217.6 | выше 99.48% вариантов |
0.15 | предписание Basel IRB | 577.6 | 1708.3 | выше 98.71% вариантов |
VaR99 в таблице — граница, хуже которой лежит только 1% вариантов. При связности, честно измеренной до кризиса (той, которую видел бы риск-менеджер в 2008-м), 2009-й не случается ни на одном из 50 000 вариантов. При связности, предписанной Basel, реальный год лег выше 98.71% вариантов. Значит, год хуже выпадает с вероятностью 1.29%, то есть примерно раз в 77 лет. Не аномалия, а плохой год, который обязан иногда случаться. Регулятор предписывает константу вместо «измерьте сами» не из бюрократии. Оценка по спокойным годам систематически занижена ровно тогда, когда важнее всего.
Распределение отвечает на вопрос «если вероятности верны, насколько плохо может быть». А верны они не были — разрыв ×3.39 выше. Год такого масштаба лежал в пределах предсказуемого, и увидеть это мог только портфельный слой. У модели нет ни понятия «сумма потерь», ни понятия «связность дефолтов».
Тот же выбор «измерить или предписать» встретился еще раз, в доле потери при дефолте (LGD). По 14 126 займам, закрытым через дефолт, она составила 46.9% остатка долга, но величина сильно зависит от года: 1.4% в 2000-м, 51% в 2011-м. Подставить долю «своего» года нельзя, потому что в январе 2009-го никто не знал, чем кончатся дефолты 2011-го. В домене стоит константа 0.47 с записанным происхождением.
Грабли
Три ошибки, каждая стоила дней и меняла выводы.
Первые два месяца я считал потери без залога. Ожидаемые потери шли как «вероятность дефолта × остаток долга» — без доли невозврата. Формула с пропущенным множителем выглядит правильной: ревью не за что зацепиться, тесты зеленые. Заметил, только когда попытался объяснить себе, что означает итоговое число. Теперь доля невозврата — обязательное поле домена без значения по умолчанию.
Перепрогон дал другие числа. Через три недели, на тех же данных и с тем же сидом, метрики разошлись в третьем знаке. Я искал недетерминизм в модели, а он был в выгрузке: ORDER BY по дате события, данные помесячные, и порядок строк внутри месяца получался случайным — а от него зависят границы калибровочных бинов. После починки пять прогонов подряд дают одинаковые таблицы.
Метки не успели подтвердиться. Метка «дефолт» подтверждается окном вперед, а история конечна. У событий последнего года окно упиралось в край данных, и движок молча писал «убытка не было» — 81 902 раза. В списке источников утечки, который я выписал заранее, этого пункта не было. Нашел его, только когда сел считать.
Итог
Модель отвечает на вопрос «этот заем рискованный?». Денежный слой отвечает на другие — под риском 29.83 млрд, 40% ожидаемых потерь сидят в 1% займов, ошибка модели переехала на крупные позиции за год до слома.
Мониторинг по одному ROC-AUC пропускает слом режима целиком, а средняя калибровка выглядит здоровой, когда ошибки гасят друг друга. В 2010-м обе событийные метрики читались как выздоровление при рекордном перекосе ошибки в деньгах.
Разбивка по величине под риском (децили, взвешенная ECE) — единственное место, где виден переезд ошибки на крупные позиции. В 2008-м именно он случился за год до дна ROC-AUC.
Эталоны, посчитанные тем же протоколом, поменяли вывод. Перекос оказался свойством кризиса, а не дефектом модели.
Подход Aladdin подтвердился на движке размером с соло-проект. Ценность не в модели, модель заменяемая. Ценность в слое, который складывает позиции в портфель и сверяет сказанное с тем, что вышло.
Весь код, домены, результаты и инструкции лежат в репозитории https://github.com/nmrcs/mamir. Данные ипотек можно скачать под своим аккаунтом, как описано в начале статьи.
Источники
Larry Fink — Britannica Money — потеря $100 млн в First Boston и основание BlackRock
BlackRock crosses $15 trillion in AUM — Yahoo Finance — активы под управлением на 2026 год
Aladdin FAQ — BlackRock — 200+ институтов на платформе
Four Things to Know About the 2006 Sale of Stuyvesant Town — Commercial Observer — покупка за $5.4 млрд на пике пузыря
Creditors Take Over $5.4B NYC Housing Complexes — NPR — передача кредиторам в январе 2010
Bear Stearns, JPMorgan Chase, and Maiden Lane LLC — Federal Reserve — наем BlackRock в марте 2008
Basel Framework, CRE31 — BIS — ρ = 0.15 для жилой ипотеки в IRB
Как думаете, следующий кризис получится увидеть за год?

