Как думать об обучении и использовании моделей машинного обучения для алгоритмической торговли.

Многие люди пытались предсказать фондовые рынки. Я потратил около 6 месяцев на создание сквозной системы машинного обучения для алгоритмической торговли. Я использовал производственную систему для размещения заказов на бумагу в течение последних 5 месяцев и получил прибыль 23% по сравнению с 10,7% индекса S&P-500. Доходность и показатели риска для бумажной торговли и тестирования на истории показаны ниже.

Любая алгоритмическая торговая система на основе машинного обучения требует следующих компонентов:

  1. ML модели
  2. Торговая стратегия с использованием моделей
  3. Система тестирования на исторических данных для оценки доходности за предыдущие годы
  4. Производственная система для автоматизации ETL данных, прогнозов и размещения заказов на покупку / продажу. Панель мониторинга для отслеживания заказов и показателей портфеля.

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

  1. Что предсказывать?
  2. Какие данные использовать?
  3. Цели, особенности и данные о поездах
  4. Производительность модели
  5. Интерпретация модели

Что предсказывать?

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

  1. Покупайте акции на основе рекомендаций модели.
  2. Если акция вырастет на x%, продайте, чтобы зафиксировать прибыль, а если она упадет на y%, продайте, чтобы остановить дальнейшие убытки.
  3. Если ни одно из двух событий не произошло, продайте акции через n дней.

Поскольку мы хотим зафиксировать прибыль, когда акция вырастет на x%, имеет смысл предсказать, действительно ли акция вырастет на x% за n дней. Мы можем использовать эти прогнозы для покупки акций. Мы до сих пор не знаем, какими должны быть x, y и n. Может быть, мы сможем это решить, немного подумав о том, какие данные мы хотим или можем использовать.

Данные

Я решил для начала использовать только дневные данные о ценах открытия, максимума, минимума и цены закрытия (OHLC), потому что с ними легко иметь дело. Также гораздо проще создать систему, которая принимает торговые решения ежедневно, а не, скажем, ежечасно. Есть много других данных, таких как фундаментальные данные компании, настроения СМИ, данные о фьючерсах, которые легко доступны. Я решил не использовать их в первой итерации, чтобы упростить производственную систему.

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

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

Определение цели

Итак, теперь мы знаем, что используем только исторические данные OHLC для прогнозирования. Долгосрочное движение цены акций зависит от того, как работает компания. Маловероятно, что исторические данные могут спрогнозировать цену на длительный период (скажем, на 1 год). Однако это может быть полезно для прогнозирования краткосрочных движений (скажем, более 10 дней?). Дневные трейдеры использовали различные технические индикаторы для такой краткосрочной торговли (также известной как свинг-трейдинг).

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

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

Думая о x, мы не хотим, чтобы слишком много или слишком мало акций вырастали более чем на x% за n = 10 дней, поскольку это + пять примеров для модели. Я решил начать с x = 5%, что дало около 13% + 5 обучающих выборок (% акций, выросших на x = 5% за 10 дней).

Цель: выросла ли цена более чем на 5% в следующие 10 дней?

Данные по обучению

Каждый день для каждой акции будет одна строка в данных обучения. Целевым будет, если цена этой акции вырастет на 5% в течение следующих 10 дней. Для создания функций мы можем использовать данные OHLC за последние 3 месяца с этого дня.

Я придерживался данных за последние 5 лет от 100 крупнейших компаний по рыночной капитализации в S & P500 для генерации обучающих данных. Мы можем агрегировать данные обучения по всем 100 акциям и обучать единую модель. В этом объединенном наборе данных будет (100 акций) x (5 лет) x (250 торговых дней в году) = 125 тыс. Строк.

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

Функциональная инженерия

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

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

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

  1. Индекс относительной силы (RSI) за 5, 10, 30, 60 дней
  2. Средняя дневная / недельная / ежемесячная доходность за последние 5, 10, 30, 60 дней
  3. Дивергенция схождения скользящих средних (MACD): разница между скользящими средними за разные периоды. Вычислено для этих пар периодов: [10, 30], [5, 10], [2, 10]. Нормализовано по текущей цене закрытия.
  4. Изменение значения MACD относительно значения MACD предыдущего дня.
  5. Отношение средней цены закрытия за последние m дней к цене закрытия

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

Модель

Теперь мы можем использовать все типы алгоритмов машинного обучения для обучения модели. Я использовал XGBoost, потому что он хорошо работает, прост в использовании и легко интерпретируется. Модель неплохо показала себя на наборах train / val / test

И вот несколько основных функций:

  1. Средняя дневная доходность за последние 30 дней
  2. RSI за 5 и 60 дней
  3. Изменение MACD для пары (5,10) периодов
  4. Соотношение средней цены закрытия за последние 2 дня и текущей цены закрытия

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

Особенности интерпретации

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

Я использовал featexp для создания графиков целевых и функциональных характеристик на основе данных поезда. Эти графики имеют целевое среднее значение (% запасов в данных поездов, которые выросли на 5% за 10 дней) по оси Y относительно значения сгруппированного признака (ось X). Бункеры создаются таким образом, что все они имеют одинаковое количество образцов.

Для функции средней доходности за последние 30 дней акции с очень высокой (›8,3%) и очень низкой (‹ -5%) стоимостью с гораздо большей вероятностью будут иметь + ve выборку (выросли на ›5%). Около 24% запасов в первом контейнере и 17% в последнем.

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

Для RSI, показанного на следующем рисунке, тренд в точности соответствует ожидаемому. Акции с низкими значениями RSI с большей вероятностью вырастут на 5%. Акция с низким RSI называется «недокупаемой», что означает, что ее следует покупать, потому что цена будет расти.

Я включил графики для еще двух характеристик: MACD (30,10) и отношения средней 2-дневной цены к текущей цене. Тенденции для обоих означают, что акции, которые недавно сильно упали или выросли, с большей вероятностью вырастут в следующие 10 дней.

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

Наконец, очень важно смотреть на временные ряды цен и видеть, где модель дает высокую вероятность роста. Это должно помочь понять, как действует модель. Давайте посмотрим на две компании: TJX и AAPL.

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

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

Следующие шаги

Результаты определенно выглядят обнадеживающими! Но до реальной торговой системы еще далеко.

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

Если у вас есть какие-либо мысли или вопросы, напишите нам в twitter или linkedin.



Изменить: Вот второй пост о разработке торговых стратегий с использованием этой модели.



Если вам это понравилось, возможно, вам понравится мой другой пост об исследовании функций: