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

Рисунок 1: Некоторые типичные рыночные модели, используемые трейдерами для принятия решений о своих торговых стратегиях.

Знакомство

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

До появления машинного обучения рыночные модели описывались с использованием стандартных математических и статистических величин. Например, простая скользящая средняя (SMA) определяется как:

Уравнение SMA можно резюмировать как нахождение среднего значения цены закрытия актива в течение установленного исторического временного окна. Цена закрытия актива — это просто дискретизация движения цены на актив в течение определенного периода времени, обычно называемого «таймфреймом свечи». Это означает, что SMA может быть рассчитана для различных таймфреймов, таких как 5-минутная цена закрытия (5 млн), 1-часовая цена закрытия (1 час) и так далее. Индикаторы, такие как приведенный выше пример SMA, многочисленны. В целом, все эти индикаторы представляют собой различные комбинации скользящих стандартных отклонений и скользящих сумм по объему и цене активов.

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

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

Рисунок 2: Взаимосвязь между техническими индикаторами может быть использована для оценки настроений рынка.

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

Создание пространства параметров

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

Рисунок 3: Ортогональность разрозненных источников данных помогает расширить пространство параметров набора признаков.

Хотя это грубое упрощение истинного пространства параметров (которое само по себе меняется со временем), оно дает представление о взаимоотношениях между некоторыми из ключевых участников в пространстве рыночных параметров. Имейте в виду, что мы не можем идеально описать истинное пространство параметров, мы можем только изо всех сил стараться «заполнить» его нашими наблюдениями (например, данными о ценах, данными о сети, социальными данными, новостями и т. д.). Тем не менее, существуют и другие переменные пространства параметров, которые нам не наблюдаются. Например, мы знаем, что трейдеры, взаимодействующие с рынком, также влияют на рынок. Скажем, трейдер застрял в пробке и у него изменилось настроение, что повлияло на его торговлю в течение дня. Это переменная, вносящая вклад в пространство параметров, которую мы не можем знать или моделировать.

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

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

Более глубокая разработка функций

Курирование набора функций является горячей темой в мире машинного обучения, и это правильно, поскольку оно оказывает глубокое влияние на результат моделирования. Обсуждение здесь состоит в том, чтобы продемонстрировать природу дизайна набора функций в динамике рынка, помочь инженерам наборов функций, когда они начинают творчески преобразовывать свои наборы данных, и представить, как инженерия функций выполняется в FreqAI — проекте с открытым исходным кодом для адаптивного моделирования криптовалютных рынков в реальном времени с использованием машинного обучения, разработанном Emergent Methods с помощью более чем 15 участников с открытым исходным кодом. Подробная информация об архитектуре FreqAI опубликована в журнале Journal of Open Source Software [1].

Первый шаг проектирования набора функций требует создания разнообразного базового набора функций с целью максимально широкого расширения пространства параметров. Технически говоря, это называется «увеличением дисперсии функций». Дисперсия признаков легко поддается количественной оценке, оценивая корреляцию между признаками путем построения «матрицы корреляции». В некоторых приложениях машинного обучения эта матрица корреляции может использоваться для выявления сильных корреляций. Однако в прогнозировании динамики рынка мы стремимся к обратному — мы ищем функции, которые не коррелируют. Эта некорреляция указывает на то, что функция предоставляет некоторую дополнительную информацию о пространстве параметров, которая не фиксируется ни одним из других индикаторов (см. рис. 3). Важность этого шага невозможно переоценить — это основа дизайна набора функций. Слабая основа приведет к плохо описанному пространству параметров, что приведет к неправильной модели и, следовательно, к плохим прогнозам.

Рисунок 4: Компоненты и преобразования, используемые при проектировании набора функций.

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

Прежде чем трансформировать базовые показатели, мы должны учитывать, что любое преобразование, которое мы выполняем с данными, должно быть привязано к происхождению динамики рынка: человеческим эмоциям. Другими словами, нам сначала нужно ответить на вопрос: «Почему трейдеры принимают решения?», прежде чем мы сможем начать трансформировать наш базовый набор функций. Показательно изучить, как трейдеры смотрят на движение цен на своих графиках TradingView. Трейдеры не смотрят на индикатор в один момент времени — они смотрят на историческую эволюцию индикатора во времени, прежде чем принять решение о покупке или продаже актива. В этом есть смысл: растущая SMA может свидетельствовать о том, что рынок набирает силу, в то время как снижающаяся SMA может свидетельствовать об обратном. Таким образом, при проектировании функций для модели машинного обучения мы должны преобразовать базовый набор данных, включив в него изменение показателей. Это можно сделать различными способами, например, взяв первую производную временного ряда или сведя желаемое количество временных шагов во входной вектор модели. Это означает, что длина входного вектора является 1-мерной с длиной N объектов x T точек интереса времени.

Функция FreqAI: Расширение базового набора функций с временным сдвигом осуществляется путем установки целого числа для количества запрошенных сдвигов: ‘»include_shifted_candles»: 4’.

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

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

Функция FreqAI: Расширение базового набора функций для нескольких таймфреймов осуществляется путем предоставления списка таймфреймов: ‘»include_timeframes»: [«5m», «15m», «4h», «1d»]’.

Трейдеры также любят варьировать окно ретроспективного анализа на своих индикаторах. Эти окна часто довольно личные, и трейдеры настраиваются на свои «предпочтительные» окна ретроспективного просмотра. Это означает, что набор функций также должен включать в себя различные периоды ретроспективного анализа, такие как SMA (10 свечей), SMA (20 свечей) и SMA (30 свечей). Включая эти периоды ретроспективного анализа, модель получает представление об этом дополнительном измерении, которое трейдеры используют перед нажатием кнопки «купить» или «продать».

Функция FreqAI: Расширение базового набора функций для нескольких окон ретроспективного анализа осуществляется путем предоставления списка размеров окон: ‘»include_periods_candles»: [10, 20, 30]’.

Вот некоторые из преобразований, которые мы можем учитывать при создании нашего набора функций. Но следует отметить, что эти преобразования начинают экспоненциально увеличивать набор данных. Например, если нам нужны три периода ретроспективного анализа для каждого из трех таймфреймов, и нам нужны последние три свечи для каждого из них, общий набор функций становится 3 * 3 * 3 = 27 функций на основе одного индикатора, выбранного на первом этапе проектирования функций. Если набор функций включает 20 индикаторов, то общий набор функций содержит 540 признаков.

Трейдеры также часто учитывают «информативные активы» при входе или выходе из сделки по активу. Информационные активы, как правило, являются лидерами рынка, которые, как правило, оказывают сильное влияние на движения рынка. Например, криптовалютный трейдер будет работать плохо, если он не будет постоянно помнить о здоровье Биткойна при входе и выходе из сделок. Аналогичным образом, S&P500 играет аналогичную роль на традиционных фондовых рынках. Таким образом, хороший набор функций должен включать информативные данные об активах по всем базовым показателям, а также все рассмотренные выше преобразования. Кроме того, трейдеры обычно используют более одного информативного актива. Добавление информативных активов еще больше расширяет набор функций: если мы включим два информативных ресурса в наш набор функций, базовый набор функций из 20 индикаторов теперь вырос до 1620 в общей сложности.

Функция FreqAI: Включение информативных активов в набор функций осуществляется простым предоставлением списка активов: ‘»include_corr_pairlist»: [«BTC/USDT», «ETH/USDT»]’.

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

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

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

Рисунок 5: Этапы предварительной обработки для обеспечения статистически надежного набора признаков.

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

Работа с отсутствующими данными

Первым шагом предварительной обработки этого набора данных является идентификация несуществующих записей данных и их удаление (рис. 5: Удаление NaN). В науке о данных они называются «NaN», и их неправильное управление является типичной ловушкой для ранних энтузиастов машинного обучения. NaN возникают из отсутствующих точек данных. Эти отсутствующие точки данных могут быть дырами в наборе данных из-за сложности сбора данных из исходного источника, но чаще всего в рыночной аналитике NaN происходят из периода ретроспективного анализа, связанного с большинством рыночных индикаторов. Например, SMA (‘1h’, window=30) вычисляет SMA на 1-часовых свечах, используя статистические величины, связанные с предыдущими 30 свечами. Таким образом, функция требует 30 часов точек данных о цене закрытия, прежде чем SMA (‘1h’, window=30) получит достаточно данных. До этого момента набор данных заполняется NaN. Эти NaN должны быть правильно обработаны, иначе пространство параметров будет неправильно определено, что приведет к снижению производительности модели.

Многие ранние энтузиасты машинного обучения считают, что эти NaN можно легко найти и заменить на «0» или какую-либо другую величину, которая не имеет «очевидного» значения. Это ошибка — вставка 0 вместо NaN для нашего SMA (‘1h’, window=30) приведет к смещению модели, чтобы связать одно значение выброса, 0, с ценовым действием. Другие студенты, изучающие науку о данных, могут подумать об этом более критически и решить заменить NaN статистической величиной столбца, такой как среднее значение или медиана. Это лучший подход, но эти студенты, изучающие науку о данных, должны учитывать, что существуют другие функции, связанные с теми же точками данных, и комбинация медианы из функции A с реальным значением в функции B является искусственной комбинацией, которая никогда не происходила в реальности. Если мы вводим в модель нереалистичные данные, как мы можем ожидать, что она будет делать реалистичные прогнозы?

Единственный статистически согласованный и реалистичный способ обработки NaN — удалить всю точку данных (всю строку, включая другие существующие данные объектов).

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

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

Масштабирование компонентов

После очистки набора данных каждый столбец объектов должен быть нормализован, чтобы иметь соответствующие амплитуды. Процесс нормализации типичен для машинного обучения по целому ряду причин. Основная мотивация нормализации исходит из процесса оптимизации, который использует каждый из популярных алгоритмов машинного обучения. Кратко перейдем к [2]: Более эффективно выполнять оптимизацию для набора функций, которые масштабируются до одного и того же интервала.

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

Функция FreqAI: FreqAI автоматически масштабирует функции обучения до интервала [-1, 1]. Информация о масштабировании из набора данных поезда затем используется для преобразования данных тестирования и прогнозирования, чтобы предотвратить утечку данных.

Масштабирование функций важно не только для оптимизации обучения модели. Многие методы манипулирования данными зависят от того, что функции находятся в одном масштабе. Одним из таких примеров являются методы уменьшения размерности, такие как анализ главных компонент (PCA), которые не дадут правильных преобразований, если входные данные не будут масштабированы. Преобразование главных компонентов полезно, когда у нас есть очень большой набор функций, обучение которого занимает много времени. Преобразование создает новый набор объектов, каждый из которых содержит компоненты исходных объектов. Новые функции ПК упорядочены с точки зрения того, насколько они отличаются от исходных функций. Сохраняя только те, которые представляют наибольшую дисперсию, мы можем уменьшить размер нашего набора функций, сохраняя при этом наибольший объем информации.

Функция FreqAI: FreqAI позволяет пользователям уменьшать размерность своего набора функций, просто устанавливая «principal_component_analysis»: true» в своем файле конфигурации.

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

Обнаружение выбросов

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

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

Рисунок 6: Пример обнаружения выбросов с использованием индекса несходства в FreqAI.

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

Функция FreqAI: FreqAI реализует три различных метода обнаружения выбросов и новизны: пространственная кластеризация приложений с шумом на основе плотности (DBSCAN), машина опорных векторов (SVM) и пользовательская метрика — индекс несходства (DI).

Создание целевых объектов модели

Создание целей («меток») не менее важно для создания объектов. Целевые объекты требуют многих из тех же методов обработки данных, таких как удаление NaN и нормализация. Но решение о том, на что ориентироваться, является одним из самых креативных элементов дизайна модели.

Для моделирования финансового рынка цели могут быть такими же простыми, как ожидание X свечей при изменении цены. Но есть как преимущества, так и недостатки использования такого наивного подхода. Например, вам все еще нужно принять решение о том, какой порог изменения цены вы готовы принять, прежде чем входить в сделку. Любой трейдер знает, что ожидаемое изменение цены будет колебаться, по определению, в зависимости от волатильности рынка. Таким образом, лучшая цель — это та, которая адаптируется к рынку. Одним из примеров, используемых в FreqAI, является обнаружение локальных минимумов/максимумов по цене закрытия, например, в движущемся окне на 200 свечей.

Рисунок 7: Точки экстремумов (максимумов и минимумов) можно определить с помощью скользящего окна.

Определив длину движущегося окна, нам нужно сделать шаг назад и пересмотреть наше скульптурное пространство параметров. Объясняет ли наше пространство параметров окно в 200 свечей на 5-минутном таймфрейме? Установить правило для этих вещей может быть сложно, поэтому более показательно рассмотреть периодичность в нашем пространстве параметров. Есть ли у нас колебания во многих 200-свечных окнах на 5-минутном таймфрейме? Это означало бы, что у нас есть периодическое описание этой временной шкалы. Примером предельного случая может быть использование 1-недельной цели свечи в модели, которая обучается на 1 неделе 5-метровых и 15-метровых свечей — недостаточно недельного паттерна, описанного в пространстве параметров, чтобы правильно информировать модель о том, как описать цель.

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

Необходимость адаптивного обучения

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

Существует множество подходов к машинному обучению, предназначенных для адаптации к изменяющимся средам. Общие подходы включают в себя тонкую настройку моделей на лету, методы LSTM, авторегрессионное развертывание и методы обучения с подкреплением. В то время как их вариации уже доступны в FreqAI, архитектура FreqAI вводит базовую линию для адаптивного моделирования, которая заключается в простом переобучении модели на скользящем окне по мере поступления новых данных в систему (рис. 8). Гипотеза состоит в том, что хаотичные изменения в пространстве параметров настолько сильны, что запуск с нуля может быть более адаптивным, чем тонкая настройка на лету (однако все методы доступны для экспериментов в FreqAI).

Рисунок 8: Адаптивное моделирование системы, которая изменяется с течением времени, требует обновления модели при появлении новых данных.

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

Заключение

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

Если вы хотите начать смотреть, учиться и торговать на рынке криптовалют, все, что вам нужно сделать для запуска программного обеспечения FreqAI, — это установить Freqtrade и выполнить следующую команду:freqtrade trade —config config_examples/config_freqai.example.json —strategy FreqaiExampleStrategy —freqaimodel LightGBMRegressor —strategy-path freqtrade/templates

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

Ссылки

  1. FreqAI: обобщающее адаптивное моделирование для хаотичных прогнозов рынка временных рядов. Роберт А. Колк, Элин Торнквист, Маттиас Фоппихлер и другие. Журнал программного обеспечения с открытым исходным кодом (2022), doi:10.21105/joss.04864
  2. Изучение эффектов масштабирования признаков в машинном обученииХанан Альшахер. Докторская диссертация, Государственный сельскохозяйственный и технический университет Северной Каролины (2021).

ОТКАЗ FreqAI не связан с какими-либо предложениями криптовалюты. FreqAI является и всегда будет некоммерческим проектом с открытым исходным кодом. У FreqAI нет крипто-токена, FreqAI не продает сигналы, а у FreqAI нет домена, кроме https://www.freqtrade.io/en/latest/freqai/ документации Freqtrade. 

Источник