Устойчивое функционирование кредитной сети Affirm зависит от нашей способности точно оценивать эффективность наших кредитов. Мы измеряем эффективность ссуды несколькими способами, в том числе, сколько мы ожидаем потерять из-за списания ссуд (т.е.кто-то, кто не погашает часть или всю ссуду), как быстро погашается ссуда, и ежемесячный денежный поток по заданному набору ссуд. Точная оценка этих значений полезна для широкого спектра анализов и приложений. Для большего контекста мы рассмотрим два мотивирующих примера:

Андеррайтинговое решение

Макроэкономические условия и сезонность имеют большое влияние на бизнес Affirm. В ответ на эти эффекты мы часто настраиваем рычаги системы андеррайтинга, чтобы гарантировать устойчивое управление рисками. Оценка убытков играет решающую роль в прогнозировании воздействия изменений в системе андеррайтинга, прежде чем мы сможем реально наблюдать за результатами по вновь выданным кредитам.

Моделирование будущего денежного потока для составления бюджета

Для целей финансового планирования и составления бюджета финансовая команда Affirm должна иметь точное представление о сумме денег, которую мы ожидаем получить в любой конкретный месяц. Для этого необходимо прогнозировать помесячные денежные потоки по всему нашему кредитному портфелю на месяц, квартал или год вперед.

Имея в виду эти варианты использования, мы решили создать единую унифицированную систему, которая сможет ответить на следующий вопрос:

Как мы ожидаем, что погашение и денежный поток будут выглядеть для конечного набора частей нашего кредитного портфеля?

В нашем первоначальном решении этой проблемы использовались исторические данные для моделирования помесячной предоплаты (ссуды выплачиваются досрочно) и убытков для каждого сегмента. Эти стратификации разделяли источники на разные уровни кредитоспособности, диапазоны годовых и длительности сроков, рассматривая все ссуды в рамках данной группы как однородные.

Поскольку потребность в более точных прогнозах погашения для нашего все более сложного портфеля ссуд росла, модели требовалось обрабатывать все большее количество измерений, по которым можно было бы различать отдельные ссуды. Поскольку вышеупомянутая постановка задачи ограничивает нас конечным набором стратификаций, этого недостаточно для более сложных случаев использования, когда набор ссуд является произвольным. Кроме того, это не позволяет нам моделировать общие свойства погашения между различными частями. Имея это в виду, мы решили переформулировать проблему следующим образом:

Каковы ожидаемые выплаты и денежный поток по индивидуальному кредиту?

Мы создали модель перехода ссуды (или LTM), которая работает в тандеме с механизмом движения денежных средств, чтобы ответить на этот вопрос для каждого отдельного кредита в нашем портфеле. Это позволяет нам рассчитать совокупные выплаты потребителей по любому произвольному набору ссуд. LTM отвечает за моделирование ежемесячных вероятностей перехода между различными состояниями просрочки, в то время как механизм денежных потоков применяет логику амортизации ссуды к поведению потребителей при погашении для вычисления таких аспектов динамики погашения, как разделение между выплатой основной суммы и процентов. Ниже мы углубимся в обе эти части.

Моделирование перехода ссуды с использованием деревьев принятия решений с градиентным усилением

LTM моделирует погашение индивидуальной ссуды. Но что мы подразумеваем под поведением в отношении погашения? Мы рассматриваем это как путь, через который проходит заем с момента его предоставления до дня его полного погашения или списания. Мы формализуем это как прогулку по следующему конечному автомату:

  • текущий: пользователь произвел все необходимые платежи. Это также начальное состояние вновь выданной ссуды.
  • dq (n-m): пользователь пропустил платеж и задерживается от n до m дней.
  • списано: пользователь просрочил платеж более чем на 120 дней, после чего мы предполагаем убыток по этой ссуде. Это конечное состояние.
  • погашен: кредит полностью погашен. Это конечное состояние.

За последние восемь лет Affirm наблюдало очень большое количество обходов этого графика, которые мы можем использовать, чтобы оценить, как будут вести себя будущие займы. LTM делает именно это.

Чтобы ограничить сложность проблемы, мы сделали несколько упрощающих предположений. Во-первых, нам нужно было выбрать размер временного шага для обхода конечного автомата. Учитывая, что подавляющее большинство наших кредитов имеет ежемесячный график платежей, естественным выбором здесь было смоделировать переходы, которые происходили помесячно. Во-вторых, мы предположили, что эта задача имеет марковское свойство. Свойство Маркова гласит, что:

Вероятность перехода в другое состояние в будущем зависит только от текущего состояния, а не от последовательности состояний, которые ему предшествовали.

Это предположение позволяет нашей модели прогнозировать переход между состояниями каждый месяц независимо от всех других переходов для ссуды.

Собирая все вместе, LTM предсказывает вероятности перехода между состояниями для данной ссуды в заданном возрасте (количество месяцев с момента выдачи). Функции, которые выступают в качестве входных данных в модели, можно разделить на контекстные и ковариативные. Контекстные функции, c, описывают сам ссуду, включая такие сигналы, как кредитный рейтинг, присвоенный ссуде, сумма ссуды и продолжительность срока. Ковариатные характеристики меняются от перехода к переходу и предназначены для описания состояния ссуды каждый месяц. Основными ковариатными характеристиками являются состояние ссуды s и возраст t. Модель выводит вероятность состояния s ’ в момент времени t’ = t + 1, являющегося каждым из семи возможных состояний ссуды. Более формально он пытается предсказать:

P (s ’= S | c ∩ s ∩ t) для S в {cur, dq1, dq31, dq61, dq91, co, po}

Фактически, для каждого возможного возраста ссуды модель может генерировать матрицу перехода, которая выглядит примерно так:

Например, если на момент t ссуда является текущей, то модель предсказывает, что ссуда также будет текущей на момент t + 1, с вероятностью 89,5%. Поскольку списание и выплата являются терминальными состояниями, вероятность остаться в них составляет 100%.

Сама модель представляет собой дерево решений с градиентным усилением, которое обучено минимизировать перекрестную энтропию или потери журнала нескольких классов, где каждый класс представляет одно из возможных состояний ссуды. Мы выбрали эту функцию потерь, потому что интерпретируем выходные данные модели как распределение вероятностей по возможным состояниям целевого кредита, как показано в матрице перехода. Набор данных, используемый для обучения модели, содержит по одной строке за наблюдаемый месяц для каждой ссуды в истории Affirm. Строки для разовой ссуды выглядят так:

Здесь следует отметить, что следующее состояние для возраста t совпадает с текущим состоянием для возраста t + 1.

Преобразование вероятностей перехода в денежные потоки

После того, как мы вычислили набор матриц перехода для данной ссуды, по одной для каждого возможного временного шага, мы используем Механизм денежных потоков для вычисления различных ежемесячных и общих оценок по ссуде, таких как выплаченные проценты, выплаченная основная сумма, предоплата основной суммы. , и основная сумма списана. Это делается путем итеративного применения матриц перехода из LTM для вычисления основных балансов, взвешенных по месяцам с учетом вероятности. Чтобы лучше проиллюстрировать этот процесс, мы проследим за трехмесячным займом в размере 100 долларов США с годовой ставкой 0% через пару итераций Механизма движения денежных средств.

Мы начинаем с начального взвешенного по вероятности вектора основного баланса (временной шаг t = 0), в котором вся основная сумма, 100 долларов США, находится в текущем состоянии, поскольку это начальное состояние для всех ссуд. .

Затем этот вектор построчно умножается на матрицу перехода для перехода t = 1, которая очень похожа на ту, которая представлена ​​в таблице 2:

Результирующая матрица определяет, насколько взвешенный по вероятности принципал будет переходить из каждого предыдущего состояния в каждое следующее состояние. Например, у нас есть переход 89,50 доллара США с текущего на текущий, представляющий того, кто совершает платеж, и 4,00 доллара США при переходе с текущего на dq 1. –30, что означает отсутствие платежа.

Следующий шаг - определить, сколько основного капитала останется после каждого из этих переходов между состояниями. Например, если мы переходим с текущего на текущего, это означает, что пользователь произвел платеж, в данном случае 33,33 доллара США, поэтому сумма основного долга, которая останется к погашению после этого перехода составляет 0,6667 от существующей суммы. Для перехода с current на dq 1–30 оплата не производится, поэтому у нас будет 1,0 от существующей суммы. Эти основные изменения баланса отражаются в так называемой матрице амортизации. Матрица из предыдущего шага поэлементно умножается на матрицу амортизации для получения матрицы взвешенных по вероятности сумм для каждого перехода после учета платежей:

Наконец, мы суммируем полученную матрицу по столбцам, чтобы получить взвешенный по вероятности вектор главного распределения для временного шага t = 1. В этом случае мы ожидаем, что баланс, взвешенный по вероятности, составит 59,70 долларов США в текущем состоянии и 4,00 доллара США в состоянии dq 1–30 при t = 1. . Давайте сделаем еще одну итерацию:

Мы повторяем этот процесс до тех пор, пока вся основная сумма не будет выплачена платежами, как это зафиксировано матрицей амортизации, или пока она не будет накапливаться в состояниях списано и выплачено, поскольку это терминальные. Для ссуд под проценты мы применяем дополнительную логику, чтобы вычислить, сколько процентов мы будем собирать каждый месяц. В конце концов, мы можем вычислить множество значений, например следующие:

  • Общий убыток: сумма, которую мы ожидаем потерять по ссуде, представляет собой взвешенный с учетом вероятности остаток, оставшийся в состоянии списано.
  • Общий денежный поток: общий входящий денежный поток представляет собой взвешенный с учетом вероятности остаток, оставшийся в состоянии выплачено, плюс сумма всех ежемесячных выплат основной суммы и процентов, произведенных в течение срока действия кредит.

Поскольку этот итерационный процесс также вычисляет эти значения для каждого промежуточного временного шага, мы также можем наблюдать, как эти значения меняются от месяца к месяцу.

Полученные результаты

Из проведенной нами проверки становится ясно, что подход, основанный на LTM и Cash Flow Engine (кривые ML_LTM и LTMV1), намного точнее при прогнозировании списаний, чем подход на основе срезов (кривая LEGACY_VAL).

Расчет денежных потоков в масштабе

Учитывая то, как мы сформулировали проблему, мы столкнулись с проблемами масштабирования, как при обучении LTM, так и при запуске механизма денежных потоков. Предполагая, что у нас есть n ссуд и средний срок ссуды составляет m, тогда размер нашего обучающего набора данных будет n * m . Что еще хуже, каждое вычисление матрицы перехода требует от нас прогнозирования с использованием модели пять раз, по одному разу для каждого предыдущего состояния ссуды. Следовательно, при запуске механизма денежных потоков нам фактически требуется 5 * n * m прогнозов модели. В некоторых случаях моделирование, которое мы запускаем с помощью механизма денежных потоков, содержит сотни миллионов синтетических займов. При займах на срок до 48 месяцев нам необходимо выполнить миллиарды прогнозов моделей для этих симуляций.

Мы решили эти проблемы масштабирования, перенеся обучение как LTM-модели, так и Cash Flow Engine на нашу платформу машинного обучения на базе Spark. Мы используем обучение распределенной модели XGBoost4J-Spark поверх Spark, что позволяет нам обучаться на наборах данных, которые могут не поместиться на одной машине. Кроме того, мы реализовали логику для механизма денежных потоков в PySpark, чтобы иметь возможность легко распределять вычисления, описанные в предыдущем разделе. С помощью Kubernetes мы можем декларативно указать, сколько ресурсов (ядер процессора или памяти) нам нужно для любого из вышеупомянутых заданий. Это позволяет нам адаптировать размер кластера Spark к выполняемой работе и дает нам уверенность в том, что это решение будет горизонтально масштабироваться в будущем.

Благодарности

Все это было бы невозможно без следующих людей:

  • Анибхав Сингла и Бенсон Ли, которые изначально сформулировали проблему и реализовали первые версии LTM и Cash Flow Engine.
  • Адам Джонстон, Хоссейн Рахими и Нилой Гупта, которые создали инфраструктуру, которая позволила нам масштабировать это решение для надежной обработки массивных наборов данных и моделирования.

. . .

Заинтересованы в решении подобных проблем? Присоединяйтесь к нам!