Прогнозирование прибыли с помощью рекуррентной нейронной сети

Определение проекта

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

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

Постановка задачи

Цель этого проекта - определить конкретную вселенную портфеля (набор акций, доступных для использования в портфеле), которая разграничена акциями, которые были в индексе акций S & P500 по крайней мере с января 2007 года. данные о ценах на подмножество из 10 этих акций, я обучаю модель прогнозирования доходности.

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

Метрики

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

Весь код и более подробное объяснение можно найти в моем репозитории GitHub, в котором в записной книжке представлены процедура и результаты.

Анализ

Исследование и визуализация данных

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

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

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

Дополнительно я использовал историческую информацию по набору факторов, взятых из Quandl API. Используемые факторы: i) спотовая цена на нефть WTI, которая является показателем цен на энергоносители; ii) спред 10–2-летних казначейских облигаций как мера наклона кривой доходности (которая отражает ожидания относительно будущих ставок и, таким образом, является окном для ожиданий участников рынка), который иногда используется как сигнал о грядущих кризисах; iii) 10–3-месячный казначейский спрэд; iv) доходность трехмесячного (3M) казначейского векселя на вторичном рынке, которая также используется в качестве безрисковой ставки; и v) спред TED, который измеряет разницу между ставкой LIBOR и ставкой казначейства 3M, что является сигналом о состоянии ликвидности на денежном рынке.

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

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

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

Следующим шагом является вычисление дневной доходности каждого актива, что выполняется с помощью функции DataFrame.pct_change (1) из библиотеки pandas, которая измеряет одноэтапное изменение исторических цен. Поскольку частота данных - ежедневно, функции вычисляют ежедневную доходность анализируемых активов. Сводку возвратов можно увидеть в таблице ниже:

Важной особенностью доходности акции является ее связь с доходностью рыночного портфеля, иначе известная как бета акции. Это показатель того, насколько разумна в среднем доходность акций в связи с изменениями общей производительности рынка (представленного рыночным портфелем). Я использовал доходность SPY ETF, который является ETF, который следует за индексом S & P500. Результаты для различных акций, где:

Методология

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

Предварительная обработка данных

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

Основные три преобразования, которые я сделал в исторических ценах акций:

  1. Импульс: этот показатель измеряет тенденцию в режиме скользящего окна, а именно:

2. Простое скользящее среднее: этот показатель можно интерпретировать как «истинную» стоимость актива, и он рассчитывается следующим образом:

3. Полосы Боллинджера: этот показатель дает техническим аналитикам сигнал о том, когда покупать или продавать их активы. Он был рассчитан следующим образом:

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

Из-за типа модели, которую я использовал для прогнозирования доходности акций, мне нужно было преобразовать структуру данных. Обычные данные временных рядов представлены в формате списка, где самые старые значения находятся вверху, а новые значения следуют последовательно. Однако для модели мне нужно было переупорядочить данные в пары вход-цель, определив временное окно. Временное окно определяет, сколько прошлых данных (t-1, t-2,…, t-k) я бы использовал для прогнозирования значения t. Для этого я создал класс WindowGenerator, который позволил мне переформатировать данные в парах ввод-цель, в результате чего были созданы объекты tensorflow.data.Dataset с следующие формы:

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

financial_data.py

Реализация: прогнозирование прибыли с помощью рекуррентных нейронных сетей.

Имея данные, пришло время построить модельную архитектуру для прогнозирования доходности активов, соответствующих нашему портфелю игрушек. Из-за того, что данные о цене и доходности являются временными рядами, я решил использовать рекуррентную нейронную сеть. Эта архитектура была разработана, чтобы фиксировать последовательные отношения между переменными. В частности, я использовал блоки Long Short Term Memory (LSTM) для фиксации как краткосрочных, так и долгосрочных отношений между прогнозирующими и целевыми переменными, благодаря использованию памяти, шлюза обновления и вывода, он может хранить долгосрочная и краткосрочная информация, которая затем передается следующему объекту в сети:

Построение и уточнение модели

Очень важным процессом является определение адекватной архитектуры модели прогнозирования. Для этого я создал последовательность различных моделей, начиная с простого 1 повторяющегося слоя (с модулями LSTM), за которым следует 1 плотный слой, до нескольких повторяющихся слоев, за которыми следуют несколько плотных слоев с промежуточными уровнями пакетной нормализации.

Метрики, используемые для измерения производительности различных итераций модели, где используется функция потерь Хубера (менее чувствительная к выбросам) и MSE (которая является квадратом RMSE). Набор данных был разделен на три подмножества в хронологическом порядке: набор данных для поезда содержит первые 70% пар "цель-окно"; набор данных проверки содержит следующие 20%, а набор тестовых данных содержит последние 10%. Эти три подмножества были перемешаны, чтобы уменьшить последовательное смещение.

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

Чтобы определить скорость обучения модели, которая является гиперпараметром для используемого алгоритма Adam Optimizer, я создал обратный вызов расписания скорости обучения, чтобы увидеть, какая скорость обучения обеспечивает более плавное сокращение функции потерь. Ниже вы можете увидеть график, на котором я пробовал разные скорости обучения и вычислял полученные потери. Я выбрал скорость обучения 1e-3 (0,001):

Оценка и проверка модели

Различные модели обучались в среде Google Colab, поскольку наличие аппаратного обеспечения графического процессора, ускоряющего процесс обучения, было ключом к тестированию различных вариантов модели. Окончательная модель была обучена на временных окнах в 5 дней, которые можно было изменить на более длинные временные окна, как упоминалось выше. Однако после некоторой настройки этот размер окна привел к повышению производительности. Я использовал обратный вызов контрольной точки, чтобы сохранить модель с наименьшими потерями. Процесс обучения «сходился» относительно быстро, что можно увидеть на графике потери в зависимости от эпохи ниже:

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

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

Когда я оценил RNN с помощью тестовых данных (которые являются самыми последними данными), я получил:

Потери Хубера = 0,0010

RMSE = 0,0319

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

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

Обоснование

После процесса моделирования выделялось одно: даже несмотря на то, что я использовал относительно сложную модель (с почти 3,4 млн параметров), доходность активов по-прежнему оставалась очень сложной целевой переменной для прогнозирования. Чтобы улучшить результаты, сначала я использовал более сложные архитектуры (как обсуждалось в разделе Построение и уточнение моделей), значительно улучшив результаты по сравнению с более простыми моделями. Другим важным шагом, улучшившим результаты, было использование расписания скорости обучения для выбора лучшей скорости обучения для модели. Более важные шаги на этом пути улучшения описаны в разделах выше.

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

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

Распределение активов: оптимизация портфеля

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

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

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

Заключение: уроки и вызовы

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

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

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