Проект состоит из набора скриптов и модулей, реализующих модель оценки однотраншевых ипотечных ценных бумаг (ИЦБ).
В проекте представлена демонстрационная версия кода модели и некоторых ее общих настроек, предназначенная для ознакомления с методами оценок ИЦБ. Результаты расчетов с использованием проекта являются индикативными и не должны рассматриваться пользователями в качестве замены проведения ими самостоятельного анализа. Результаты расчетов, полученные с использованием проекта, не могут быть использованы в качестве заверения о том, что какая-либо определенная сделка непременно могла быть или может быть осуществлена по определенной цене, либо с определенной доходностью.
- Примеры расширены и актуализированы на 2019-09-01;
- Серия обновлений, исправлений и оптимизаций в основных модулях;
- Добавлен экспериментальный модуль sensitivity для проведения графического анализа поведения модели;
- Добавлена возможность использовать произвольные выражения в качестве переменных модели;
Проект состоит из нескольких блоков:
- Импорт данных из внешних источников (историческое погашение облигаций, данные макроэкономики);
- Валидация и подготовка данных о покрытии ИЦБ (LLD);
- Моделирование процентной ставки и макроэкономических показателей с использованием симуляций;
- Построение денежных потоков по портфелю закладных, соответствующих реализациям макроэкономических показателей;
- Структурирование денежных потоков по пулу в прогнозные потоки по ИЦБ (транширование);
- Оценка приведенной стоимости потоков и расчет основных метрик ИЦБ.
Проект реализован на языке программирования Python (версии 2.7.14) с использованием внешних библиотек:
-
Numpy 1.14.1
-
Pandas 0.22.0
-
Scipy 1.0.0
-
wxPython 4.0.6 (опционально)
Предполагается, что основные скрипты проекта могут быть использованы как самостоятельные программы, например, вызовом из командной строки с передачей параметров, так и в качестве импортируемых модулей вызовом из других скриптов Python.
runner.py - основной скрипт, который позволяет провести комплексную оценку стоимости ценной бумаги и сопутствующих показателей.
pricing.py - вспомогательный скрипт, который позволяет создать json-файл с входными параметрами модели.
reader.py - вспомогательный скрипт, который позволяет провести проверку корректного заполнения входного LLD.
testing.py - вспомогательный скрипт, который позволяет провести графический анализ поведения моделей на фоне исторических данных.
Основной модуль с системными файлами модели. Состоит из набора логически независимых моделей, в последовательности их применения:
- model_lld - кластеризация входных данных по закладным;
- model_cir - моделирование процентных ставок и макроэкономических показателей, необходимых для расчета денежных потоков;
- model_cfm - прогноз денежных потоков по пулу закладных в результате моделирования поведения заемщиков и жизненного цикла пула;
- model_mbs - структурирование и оценка денежных потоков по ИЦБ.
Вспомогательный модуль с необходимыми для проведения оценок внешними данными:
- gparams.py – исторические данные для параметризации КБД;
- histcf.py – исторические данные по амортизации и купонным выплатам ИЦБ;
- history.py – исторические данные макропоказателей;
- hpi.py – исторические данные индекса цен на недвижимость;
- mbs.py – перечень основных параметров ИЦБ;
- regions.py – справочник кодов регионов.
Вспомогательный модуль с настройками различных моделей миграций.
Вспомогательный модуль для проведения графического анализа поведения моделей миграций на фоне исторических данных (доступен при установленном модуле wxPython).
Примечание: модуль временно поддерживает только мониторы с разрешением 1920x1080. На мониторах с отличным разрешением отображение не будет корректным.
examples - набор примеров входных данных по закладным в составе ИЦБ.
В качестве примера реализована возможность оценки стоимости двух ИЦБ, с фиксированным и плавающим купоном соответственно: RU000A0ZYJT2 (оригинатор – банк ВТБ), выпущенной в рамках проекта ДОМ.РФ «Фабрика ИЦБ», и RU000A0ZYL89 (оригинатор – Райффайзенбанк), аналогично выпущенной в рамках Фабрики.
Дата оценки – 15 апреля 2019. Процесс оценивания выстроен согласно следующей логике (для удобства команды запуска собраны в файлах runme.bat в папках примеров):
-
Оценка осуществляется путем запуска скрипта runner.py, который принимает на вход json-файл с параметрами модели и облигации, а также csv-файл с данными по ближайшему к дате оценки срезу портфеля закладных (loan-level data, LLD). В примере представлен LLD на 1 апреля 2019, в папке examples.
-
При запуске runner.py сначала проводится валидация данных LLD. По завершении исправления ошибок будет проведена процедура кластеризации портфеля.
-
На первом шаге моделирования запускается блок макроэкономики (model_cir.py), который создает сценарные симуляции короткой ставки, доходности, а также макроэкономических показателей: ставки МосПрайм 6-мес., ставки по ипотеке, индекса цен на недвижимость. Количество сценариев определяется параметром ‘NumberOfMonteCarloSimulations’ в json-файле, горизонт моделирования - параметром ‘ModelingHorizon’. Переменные симулируются помесячно.
-
Второй шаг моделирования – блок модели досрочных погашений (model_cfm.py), в котором для каждого макро-сценария моделируется жизнь портфеля закладных, входящих в обеспечение ИЦБ: остаток основного долга в портфеле на каждый месяц, помесячные поступления по процентам, помесячные досрочные погашения, и т.д.
-
Третий шаг моделирования реализован в скрипте model_mbs.py: для каждого макро-сценария на основе результатов блока модели досрочных погашений производится расчет всех будущих денежных потоков по облигации (купонных выплат и погашений номинала). Для каждого макро-сценария оценка текущей стоимости ИЦБ будет рассчитана как сумма дисконтированных денежных потоков, где в качестве ставки дисконтирования выступит сценарная ставка доходности. Как следствие, будет получено эмпирическое распределение оценки текущей цены, среднее по которому даст оценку ИЦБ.
-
В калькуляторе по умолчанию проводятся три варианта оценки: «центральный» - для указанных значений КБД (кривой бескупонной доходности) на дату оценки, а также два «стрессированных» - для сдвига текущей КБД вниз на 100 б.п. и вверх на 100 б.п.
-
По окончании работы скрипта runner.py в папке c LLD данными будут сохранены все промежуточные и финальные результаты моделирования (в формате csv):
-
temp_LLD, stat_LLD, data_LLD – исправленные данные по срезу портфеля, необходимая статистика по срезу, результат кластеризации портфеля соответственно;
-
macroscr_central, macroscr_m100bp, macroscr_p100bp – результирующие таблицы блока макроэкономики для трех вариантов оценки («центральный», «минус 100 б.п.» и «плюс 100 б.п.» соответственно);
-
cashflow_central, cashflow_m100bp, cashflow_p100bp – результирующие таблицы блока модели досрочных погашений для трех вариантов оценки;
-
mbsflows_central, mbsflows_m100bp, mbsflows_p100bp - результирующие таблицы блока транширования (расчета будущих денежных потоков по бумаге) для трех вариантов оценки;
-
pricing_result – общая таблица с основными результатами оценивания для трех вариантов; включает в себя средние по симуляциям грязные/чистые цены ИЦБ, а также дополнительные статистики: IRR при грязной цене, дюрация Маколея, модифицированная дюрация, эффективная дюрация, выпуклость и CPR.