В предыдущем посте мы рассмотрели, как строить модели машинного обучения для торговли. В этом посте мы рассмотрим, как придумывать торговые стратегии, использующие эти модели, и тестировать их на исторических данных. Вот снова результаты моей стратегии:
Этот пост будет охватывать:
- Базовая стратегия
- Точная настройка стратегии для легкого внедрения и диверсификации
- Параметры стратегии и их оптимизация
- Метрики эффективности стратегии
- Бэктестинг
Резюме. В первом сообщении мы построили модель XGBoost, чтобы предсказать, вырастет ли цена более чем на 5% в следующие 10 дней. Это единственная модель, обученная на 100 акциях S & P500. Мы использовали несколько функций, созданных с использованием прошлых данных OHLC, и поняли, как они влияют на прогноз.
Что должна делать стратегия?
Главный вопрос, который меня интересовал, был:
Ежедневно выборочно покупая акции, которые являются частью индекса, такого как S & P500, и удерживая их в течение короткого периода, возможно ли превзойти индекс в долгосрочной перспективе?
В отличие от других стратегий, ориентированных на одну акцию, эта диверсифицирована. Но он также привязан к индексу. Если индекс упадет, эта стратегия, скорее всего, также даст -ve доходность. Есть надежда, что даже если он коррелирует с рынком, в среднем он дает лучшую доходность при аналогичных рисках.
Давайте вернемся к основной торговой стратегии, о которой мы говорили в первом посте:
- Покупайте акции на основе рекомендаций модели.
- Если акция вырастет на x%, продайте, чтобы зафиксировать прибыль, а если она упадет на y%, продайте, чтобы остановить дальнейшие убытки.
- Если ни одно из двух событий не произошло, продайте акции через n дней.
С помощью этой стратегии мы можем распределять наши инвестиции по разным акциям, а также по дням и иметь диверсифицированный портфель.
Покупка акций
Мы можем изучить несколько способов покупки акций:
- В любой день покупайте акции с y_pred выше определенного порога. y_pred - вероятность из модели машинного обучения.
- Купите k лучших акций, ранжированных по y_pred, равными суммами в $.
Проблема с 1 в том, что это может привести к длительным периодам без вложений, потому что все прогнозы ниже порогового значения. Отсутствие уверенности затрудняет размещение капитала.
Вторая стратегия, с другой стороны, может быть хорошей отправной точкой, потому что у нас всегда будет несколько акций, в которые можно инвестировать ежедневно. Но это может привести к снижению прибыли, потому что мы будем инвестировать, даже когда прогнозы довольно низкие. Итак, мы можем наложить ограничение, что топ k акций следует покупать только в том случае, если прогноз выше некоторого нижнего порога.
Нам также необходимо решить, сколько денег вкладывать каждый день. Если мы будем держать акции на срок до n = 10 дней, нам необходимо инвестировать поровну в течение 10-дневного периода. При общей сумме инвестиций в 100 тысяч долларов каждый из первых 10 дней будет получать по 10 тысяч долларов. К 11-му дню инвестиции с 1-го дня будут ликвидированы, а затем эти деньги можно будет использовать для инвестирования на 11-й день. Но не все так просто:
- Проблема 1. В некоторые дни может не быть рекомендаций к покупке из-за низкого порогового ограничения.
- Проблема 2: Некоторые акции будут ликвидированы досрочно, если они вырастут на x% или упадут на y%.
Дополнительные деньги из-за этих проблем необходимо реинвестировать в ближайшие несколько дней. Я придумал простую херистику, которая в некоторой степени позаботится об этом:
- Получите общую стоимость портфеля (V) и количество дней, вложенных за последние n дней (n_invested). n - максимальный период удержания.
- Сегодняшние инвестиции = (V / n_invested) * множитель. Если доступные денежные средства меньше сегодняшних инвестиций, они будут установлены как доступные денежные средства.
Разделение на n_invested решает первую проблему. Он выделяет больше денег, если за последние 10 дней было много дней без инвестиций. «Множитель» может быть основан на том, сколько излишков наличных у нас в настоящее время, или может быть просто установлен на константу, немного превышающую единицу.
Итак, вот окончательная торговая стратегия с еще несколькими ограничениями:
- Выберите k лучших акций по y_pred, которые выше определенного порога (y_pred ›p_low).
- Определите сумму сегодняшних инвестиций: (V / n_invested) * множитель.
- Если сегодняшние инвестиции имеют ›доступную денежную наличность, установите ее как« Доступные денежные средства ». Не вкладывайте больше, чем daily_amt_limit в любой день (возможно, 15 тысяч долларов на 100 тысяч долларов начальных инвестиций).
- Равным образом инвестируйте эти деньги в подходящие акции. Если в акции уже вложены инвестиции, превышающие «per_stock_limit» (скажем, 4 тысячи долларов), не инвестируйте в нее, чтобы избежать концентрированного портфеля.
- Продайте любую акцию, если она на x% выше (тейк-профит) или на y% (стоп-лосс) цены покупки. Если ни одно из двух событий не произошло, продайте через n дней.
Стратегия и параметры обучения модели
На данный момент мы знаем нашу стратегию, и ее можно определить с помощью этих параметров, описанных выше: k, p_low, multiplier, daily_amt_limit, per_stock_limit, x, y, n. Назовем эти параметры стратегии.
Также есть несколько параметров обучения модели, которые влияют на эффективность стратегии:
- Модель периода данных поезда: использование более длительных периодов времени поможет уменьшить переобучение из-за большего количества данных. Но для обучения модели будут использоваться устаревшие данные за более ранние периоды времени.
- Параметры, используемые для создания цели в данных поезда: x, y, n (объяснено в предыдущем посте). Подобно стратегии x, y, n, но те, которые используются для данных поезда, могут иметь разные значения.
- Параметры модели Xgboost.
- Набор функций, используемых для обучения модели.
Поиск лучших параметров
Мы можем выполнить поиск в сетке по всем этим стратегиям и параметрам обучения модели и выбрать набор параметров с наилучшей отдачей. Но пространство для поиска будет огромным! Чтобы уменьшить пространство поиска, я сделал следующее:
- Выберите разумный набор параметров стратегии и параметров модели xgboost. Найдите лучшие параметры генерации данных о поездах на основе эффективности стратегии.
- Теперь для этих параметров (которые определяют данные поезда) найдите лучшие параметры модели xgboost на основе производительности модели (AUC).
- Для этих параметров обучающих данных и обученной модели найдите лучшие параметры стратегии на основе эффективности стратегии.
Немного сложный, но определенно что-то, что помогло мне получить более эффективные модели и стратегии. Вы всегда можете придумать что-то более простое или более эффективное, чем это.
Результативность стратегии
Есть несколько различных показателей, на которые следует обратить внимание, чтобы оценить эффективность инвестиций:
- Возврат: средн. ежедневно, ежемесячно и за полный период.
- Альфа и бета: они взяты из модели CAPM. Альфа - это возрастающая доходность вашего портфеля над рынком. Бета показывает, насколько портфель коррелирует с рынком.
- Соотношение шарпа и сортино.
- Максимальная просадка.
Другие показатели, за которыми мы должны следить, чтобы понять, что делает стратегия:
- % дней, вложенных в
- Ежедневно доступные денежные средства, ежедневное количество вложенных акций и т. Д.
- % прибыльных сделок,% прибыльных дней
Выбирая лучший набор параметров, я рассмотрел комбинацию вышеуказанных показателей, чтобы окончательно определить параметры стратегии, а не только одну метрику, например доходность.
Бэктестинг
Тестирование на исторических данных помогает понять, как стратегия работала бы на исторических данных. Мы не будем вдаваться в подробности того, как проводить бэктестинг, поскольку он заслуживает отдельного поста.
Доступно несколько фреймворков для тестирования на истории. Мне показалось простым в использовании PyAlgoTrade. К сожалению, я не смог понять, как использовать эти фреймворки для моей стратегии с несколькими акциями. Все стало слишком сложно, и тестирование на истории заняло много времени. Поэтому я решил с нуля написать свой собственный фреймворк для тестирования на истории. На самом деле это не так уж и сложно. Обычно вам нужны две вещи:
- Объект торговой среды с доступом к ценовым данным через dataframe / csv. Он также предоставляет интерфейс для размещения заказов и отслеживает все данные для измерения эффективности стратегии.
- Код стратегии, реализующий вашу стратегию. Он взаимодействует с торговой средой для размещения заказов на покупку / продажу.
Я публикую свой код на случай, если кто-то захочет понять, как написать фреймворк для тестирования на истории с нуля:
Следует помнить о нескольких вещах:
- Результаты тестирования на истории ненадежны, потому что вы никогда не сможете получить ту цену, которая указана в ваших данных. Особенно максимумы / минимумы, которые могут быть агрегированы на нескольких биржах. Я только использовал цены открытия и закрытия для тестирования на истории.
- Проскальзывание, комиссии и транзакционные издержки не следует игнорировать.
Я провел бэктестинг для обучения, проверки и набора тестов отдельно и убедился, что показатели доходности и риска не сильно различаются.
И после всего этого у вас есть собственная торговая стратегия, основанная на машинном обучении!
В следующем посте мы рассмотрим, как реализовать все это в реальном мире и заработать $$$: D. При построении производственной системы я придерживался двух критериев: 1. Не быть привязанным к какой-либо платформе для алгоритмической торговли и 2. Постройте ее за 0 долларов!
Я буду размещать обновления для следующего поста в Twitter.
Не стесняйтесь обращаться к нам! Большое спасибо за чтение! 💸💸💸