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

Этот пост будет охватывать:

  1. Базовая стратегия
  2. Точная настройка стратегии для легкого внедрения и диверсификации
  3. Параметры стратегии и их оптимизация
  4. Метрики эффективности стратегии
  5. Бэктестинг

Резюме. В первом сообщении мы построили модель XGBoost, чтобы предсказать, вырастет ли цена более чем на 5% в следующие 10 дней. Это единственная модель, обученная на 100 акциях S & P500. Мы использовали несколько функций, созданных с использованием прошлых данных OHLC, и поняли, как они влияют на прогноз.

Что должна делать стратегия?

Главный вопрос, который меня интересовал, был:

Ежедневно выборочно покупая акции, которые являются частью индекса, такого как S & P500, и удерживая их в течение короткого периода, возможно ли превзойти индекс в долгосрочной перспективе?

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

Давайте вернемся к основной торговой стратегии, о которой мы говорили в первом посте:

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

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

Покупка акций

Мы можем изучить несколько способов покупки акций:

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

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

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

Нам также необходимо решить, сколько денег вкладывать каждый день. Если мы будем держать акции на срок до n = 10 дней, нам необходимо инвестировать поровну в течение 10-дневного периода. При общей сумме инвестиций в 100 тысяч долларов каждый из первых 10 дней будет получать по 10 тысяч долларов. К 11-му дню инвестиции с 1-го дня будут ликвидированы, а затем эти деньги можно будет использовать для инвестирования на 11-й день. Но не все так просто:

  1. Проблема 1. В некоторые дни может не быть рекомендаций к покупке из-за низкого порогового ограничения.
  2. Проблема 2: Некоторые акции будут ликвидированы досрочно, если они вырастут на x% или упадут на y%.

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

  1. Получите общую стоимость портфеля (V) и количество дней, вложенных за последние n дней (n_invested). n - максимальный период удержания.
  2. Сегодняшние инвестиции = (V / n_invested) * множитель. Если доступные денежные средства меньше сегодняшних инвестиций, они будут установлены как доступные денежные средства.

Разделение на n_invested решает первую проблему. Он выделяет больше денег, если за последние 10 дней было много дней без инвестиций. «Множитель» может быть основан на том, сколько излишков наличных у нас в настоящее время, или может быть просто установлен на константу, немного превышающую единицу.

Итак, вот окончательная торговая стратегия с еще несколькими ограничениями:

  1. Выберите k лучших акций по y_pred, которые выше определенного порога (y_pred ›p_low).
  2. Определите сумму сегодняшних инвестиций: (V / n_invested) * множитель.
  3. Если сегодняшние инвестиции имеют ›доступную денежную наличность, установите ее как« Доступные денежные средства ». Не вкладывайте больше, чем daily_amt_limit в любой день (возможно, 15 тысяч долларов на 100 тысяч долларов начальных инвестиций).
  4. Равным образом инвестируйте эти деньги в подходящие акции. Если в акции уже вложены инвестиции, превышающие «per_stock_limit» (скажем, 4 тысячи долларов), не инвестируйте в нее, чтобы избежать концентрированного портфеля.
  5. Продайте любую акцию, если она на x% выше (тейк-профит) или на y% (стоп-лосс) цены покупки. Если ни одно из двух событий не произошло, продайте через n дней.

Стратегия и параметры обучения модели

На данный момент мы знаем нашу стратегию, и ее можно определить с помощью этих параметров, описанных выше: k, p_low, multiplier, daily_amt_limit, per_stock_limit, x, y, n. Назовем эти параметры стратегии.

Также есть несколько параметров обучения модели, которые влияют на эффективность стратегии:

  1. Модель периода данных поезда: использование более длительных периодов времени поможет уменьшить переобучение из-за большего количества данных. Но для обучения модели будут использоваться устаревшие данные за более ранние периоды времени.
  2. Параметры, используемые для создания цели в данных поезда: x, y, n (объяснено в предыдущем посте). Подобно стратегии x, y, n, но те, которые используются для данных поезда, могут иметь разные значения.
  3. Параметры модели Xgboost.
  4. Набор функций, используемых для обучения модели.

Поиск лучших параметров

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

  1. Выберите разумный набор параметров стратегии и параметров модели xgboost. Найдите лучшие параметры генерации данных о поездах на основе эффективности стратегии.
  2. Теперь для этих параметров (которые определяют данные поезда) найдите лучшие параметры модели xgboost на основе производительности модели (AUC).
  3. Для этих параметров обучающих данных и обученной модели найдите лучшие параметры стратегии на основе эффективности стратегии.

Немного сложный, но определенно что-то, что помогло мне получить более эффективные модели и стратегии. Вы всегда можете придумать что-то более простое или более эффективное, чем это.

Результативность стратегии

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

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

Другие показатели, за которыми мы должны следить, чтобы понять, что делает стратегия:

  1. % дней, вложенных в
  2. Ежедневно доступные денежные средства, ежедневное количество вложенных акций и т. Д.
  3. % прибыльных сделок,% прибыльных дней

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

Бэктестинг

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

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

  1. Объект торговой среды с доступом к ценовым данным через dataframe / csv. Он также предоставляет интерфейс для размещения заказов и отслеживает все данные для измерения эффективности стратегии.
  2. Код стратегии, реализующий вашу стратегию. Он взаимодействует с торговой средой для размещения заказов на покупку / продажу.

Я публикую свой код на случай, если кто-то захочет понять, как написать фреймворк для тестирования на истории с нуля:



Следует помнить о нескольких вещах:

  1. Результаты тестирования на истории ненадежны, потому что вы никогда не сможете получить ту цену, которая указана в ваших данных. Особенно максимумы / минимумы, которые могут быть агрегированы на нескольких биржах. Я только использовал цены открытия и закрытия для тестирования на истории.
  2. Проскальзывание, комиссии и транзакционные издержки не следует игнорировать.

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

И после всего этого у вас есть собственная торговая стратегия, основанная на машинном обучении!

В следующем посте мы рассмотрим, как реализовать все это в реальном мире и заработать $$$: D. При построении производственной системы я придерживался двух критериев: 1. Не быть привязанным к какой-либо платформе для алгоритмической торговли и 2. Постройте ее за 0 долларов!

Я буду размещать обновления для следующего поста в Twitter.



Не стесняйтесь обращаться к нам! Большое спасибо за чтение! 💸💸💸