Типичной проблемой для многих финансовых фирм является идея взаимозаменяемости инструментов. Если вы маркетмейкер облигаций, у вас может быть клиент, который говорит, что хочет 5-летний выпуск GM, но ликвидности нет, что вы можете предложить вместо этого? Если вы менеджер по инвестициям, возможно, вам нужен долг автомобильной промышленности, чтобы привести свой портфель в соответствие с желаниями клиента, вы думаете, что GM — лучший выпуск для клиента, но он недоступен, так чем вы можете его заменить? Возможно, вы хедж-фонд и у вас есть мнение о кредитоспособности GM, но оно недоступно, поэтому вы хотите найти другие способы прокси сделки.

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

Совместная фильтрация сложна в финансовых условиях, поскольку у пользователей может быть множество ограничений. Представьте, что у вас есть два аналитика с пересекающимися обязанностями. Первый охватывает североамериканский кредит. Второй охватывает глобальный майнинг. Им обоим может «нравиться» долг Freeport McMoran, потому что он входит в их компетенцию. Наивная модель предполагала бы долг Alcoa в австралийских долларах перед североамериканским кредитным аналитиком, но в силу их компетенции им это «не понравится». В крупномасштабной реализации эти ограничения невозможно смоделировать. Некоторые клиенты могут не захотеть инвестировать в табачные изделия/огнестрельное оружие, другие могут не иметь возможности торговать в определенных странах из-за нормативных требований, а у третьих могут быть особые взгляды на части рынка. Это не значит, что такой подход невозможен, но он слишком сложен для этой статьи!

Мы рассмотрим фильтрацию по элементам, где мы фильтруем на основе характеристик долга. Давайте представим, что у нас есть модель, в которой у нас есть название эмитента, отрасль, кредитный рейтинг, доходность к погашению и количество лет до погашения. На высоком уровне было бы логично, если кто-то ищет 5-летний долг GM, он также может быть заинтересован в 7-летнем долге GM, 5-летнем долге Ford и, возможно, в меньшей степени 5-летнем долге другой отрасли с аналогичным кредитным рейтингом и доходностью. .

Прежде чем мы перейдем к коду. Рассмотрим, откуда взялся этот подход. Косинусное сходство — это метод, используемый во многих случаях «похожи ли эти две вещи». Он часто используется в НЛП для определения сходства документов. Ключевое поведение математической функции заключается в том, что она не принимает во внимание масштаб. Например. он скажет, что «1,2,3» больше похоже на «10,20,30», чем на «1,2,4». В зависимости от вашей точки зрения, это хорошо или плохо. Вы не претендуете на то, чтобы узнать все тонкости косинусного подобия, но если вам нравится направление статьи, вам следует сделать углубленный обзор. Для поверхностного понимания подумайте о терминах с сильным сходством, имеющих одинаковый угол косинуса от центра.

Код

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

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

Шаг 1: Предварительно обработайте данные. Мы превратим текстовые элементы в категориальные столбцы с горячим кодированием и сохраним числовые столбцы. Единственным числовым столбцом является «maturity_date», который для упрощения выражается в годах до погашения.

Шаг 2: Сгенерируйте подобия косинусов в виде матрицы

Шаг 3: Используйте heapq, чтобы найти наиболее похожие результаты

В примере у нас есть только 3 эмитента, и в последней ячейке вы увидите, что мы хотели посмотреть на 10-летнюю облигацию Калифорнии. В какой-то момент результаты решили, что 11-летняя облигация Нью-Йорка больше похожа на нее, чем калифорнийская 8-летняя облигация…

Некоторые вещи, которые мы хотели бы сделать позже:

  • Преобразуйте оценки в числовой столбец (например, BBB может быть 10, BBB+ может быть 10,5, BBB- может быть 9,5 и т. д.). Это уменьшит размер матрицы, и модель «поймет» относительный риск, который придают эти рейтинги.
  • Отбросьте лишние значения. Например. нам не нужно 3 столбца для 3 эмитентов, нам нужно только 2
  • Включите отраслевые подсекторы, чтобы найти эмитентов, которые более похожи внутри сектора (например, MongoDB находится в технологическом подсекторе Corp, как и Twilio; поэтому они будут более похожи, чем Ford, при прочих равных условиях)
  • Добавьте валюту!

Настройка веса объектов

В приведенном выше примере мы преобразовали некоторые текстовые элементы в отдельные функции, просто закодировав их одним горячим способом с помощью pandas.get_dummies. Мы также использовали дату погашения (в годах до погашения в качестве признака). Из-за свойств математической функции косинуса мы дали время для созревания большего веса в нашей модели. Это добавляет интересную сложность, поскольку мы можем нормализовать все функции в диапазоне от 0 до 1, но это даст время для зрелости меньше веса в модели. Способ справиться с этим (если мы этого хотим) состоит в том, чтобы разделить диапазоны, а затем использовать одно горячее кодирование. Например, для приведенных выше данных у нас может быть два сегмента: 0–5 лет и 5–10 лет. Каждая строка будет иметь 1 или 0 в любом столбце. В этот момент все функции имеют равные веса, но две облигации со сроком погашения 4 и 6 лет будут вычислять такое же сходство, как и две облигации со сроком погашения 1 и 10 лет. Как всегда, проектирование функций будет диктовать вашу модель, и вам нужно будет подумать о том, как вы хотите, чтобы она вела себя.

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

Добавление поддержки поведенческих характеристик

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

Функции регистрации облигаций: 144A, RegS и т. д.

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

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

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

Дальнейшие шаги

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

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

Но я хочу использовать нейронную сеть!!

Итак, у этого подхода есть один большой недостаток. Он требует памяти. Существует так много выпусков облигаций, что, если у вас нет узкой вселенной облигаций, вам понадобится куча памяти и вычислительной мощности. Давайте предположим, что у вас есть огромная вселенная и вы хотите сделать общий процесс, мы можем позаимствовать из другого подхода НЛП, встраивания.

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

  • Создайте нейронную сеть, в которой функции являются входными данными
  • Создайте скрытый слой с определенным набором узлов
  • Создайте механизм обратной связи, чтобы NN знала, правильно это или нет.

Важен механизм обратной связи. В НЛП подход будет заключаться в том, чтобы предсказать слово на основе предшествующих слов. Функция потерь помогает нам оптимизировать для уменьшения количества ошибок. Имея только необработанные справочные данные, вам нужно будет создать для модели способ узнать, какие сходства являются «правильными». Это можно сделать из исторических торговых данных, если они у вас есть, или вы можете вручную собрать некоторые данные обратной связи.