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

Прежде всего проверьте другие мои статьи, пожалуйста:

  1. Простое прогнозирование временных рядов (и сделанные ошибки)
  2. Корректное прогнозирование одномерных временных рядов + бэктестинг
  3. Многомерное прогнозирование временных рядов
  4. Прогнозирование волатильности и нестандартные убытки
  5. Многозадачное и мультимодальное обучение
  6. Оптимизация гиперпараметров
  7. Улучшение классических стратегий с помощью нейронных сетей
  8. Вероятностное программирование и пиропрогнозы
  9. Тестирование на истории с пандами

быть, вероятно, впечатлены возможностями ... и приготовиться разочароваться :)

Текущая структура

Как видите, весь мой блог сосредоточен на решении следующей проблемы машинного обучения: наличие окна прошлых N наблюдений предсказывает N + t один, где N может быть 30-дневными барами (или другими переменными в качестве заголовков новостей), а t - горизонт прогнозирования (может варьироваться в зависимости от вашей стратегии). Что мы здесь сделали правильно?

  1. Подготовка функций и нормализация
    Действительно, мы правильно подготовили наши окна: без предвзятости, нормализация выполняется для каждого окна отдельно (чтобы не смешивать разные режимы и т. д.)
  2. Разный выбор задач
    Мы также поиграли с разными целями прогнозирования: на высоком уровне это были как классификация (бинарное движение «вверх» или «вниз»), так и регрессия - прогнозирование доходности, прогнозирование волатильности. и т.п.
  3. Тестирование на исторических данных
    Обучение нейронных сетей - это круто, но это еще не конец процесса. Мы провели простое, но информативное тестирование на исторических данных, чтобы показать, что если мы будем использовать эти прогнозы для длинных / коротких активов, мы можем получить некоторую прибыль (что важно, лучше, чем какой-либо эталонный тест).
  4. Как избежать классического переобучения
    Основная проблема «обычного» машинного обучения - обобщить нашу модель, чтобы она хорошо работала с невидимыми данными. Для этого мы используем разбиение наших исходных данных на обучение / разработку / набор тестов и выполняем некоторую перекрестную проверку, чтобы оценить, как модель ведет себя при изменении распределения данных. Мы показали, что нейронные сети могут хорошо работать на данных вне выборки (но ждите сложных деталей). На изображении ниже показано то, что я называю «классическим» переобучением для финансовых временных рядов, которое выглядит как идеальный прогноз, но в основном это просто последнее наблюдение :)

Чего не хватает?

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



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



Данные баров == слабые данные

Большинство людей используют хорошо известные цены HOLC (high, open, low, close) за определенный период времени и объем торгов. Эта информация отражает недостаточно информации о рынке и о том, что делают его участники. Нам действительно нужны заявки и заявки из книги заказов, чтобы торговать хорошо - это даст нам «сырую» информацию и позволит создавать более совершенные функции, такие как объем в долларах, спред между ценой покупки и продажи и другие.

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

Концентрация на одном активе

Это действительно серьезная ошибка. Большинство моих статей сосредоточено на том, чтобы взять какой-то отдельный актив, научиться прогнозировать его на определенный фиксированный горизонт и протестировать на истории длинно-короткую стратегию капитала. Может быть, некоторые индивидуальные трейдеры с 10 тысячами долларов в кармане действительно делают это - они строят какую-то стратегию на основе индикаторов для какой-то валютной пары и торгуют ею. Но если мы немного задумаемся, это будет похоже на переоснащение для этого конкретного актива! Какой смысл иметь стратегию, которая чрезмерно приспособлена для одного временного ряда (и мы даже не уверены, что она принесет такую ​​же пользу в прошлом). Хедж-фонды никогда этого не делают. Они действительно торгуют так называемой совокупностью активов (возможно, с той же стратегией). Портфель сбалансирован для коротких или длинных позиций по этим активам, или, если для торговли ими используется какая-то стратегия, ожидается, что они будут иметь хорошие результаты по всем из них.
Более того, когда вы сравниваете эффективность своей стратегии с некоторым эталонным тестом (например, в случае криптовалютной торговли этот эталонный тест может быть стратегией HODL), вас интересует расчет альфа (превосходство эталонного теста) и бета (подверженность риску стратегии. ).

Прогнозирование горизонта фиксированного размера

Когда я готовил набор данных для обучения модели, каждая пара {x_i, y_i} представляла собой окно N прошедших дней и изменение цены (или направление движения цены) через некоторое время после последней даты в историческом окне. Давай еще раз подумаем. Некоторое время спустя. Фиксированное время. Что ж, слово фиксированный в финансовом мире просто смешно. Мы даже не можем быть уверены, что через какое-то время появятся заявки или заявки на совершение сделки! Это очень серьезная проблема, которая фактически разрушает всю нашу систему прогнозирования. Честно говоря, я не нашел легкого решения этой проблемы, всего две, но они решительные. Первое решение - прекратить прогнозирование и начать совершать сделки, что немедленно приводит нас к теории управления и обучению с подкреплением. Это поможет нам справиться с любым фиксированным временным горизонтом (по крайней мере, до некоторой степени), но пока это немного не по теме. Второй вариант я нашел в книжке, и он довольно интересный.

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

I.I.D.

Если вы уже читали некоторую статистику или тексты по теории машинного обучения, вы могли видеть эти три буквы i.i.d., что означает независимый и идентично распределенный и используется для описания некоторых случайных величин. Это верно в случае большинства приложений машинного обучения в CV, NLP, рекомендательных системах, даже в некотором анализе временных рядов и обработке сигналов ... Но не в случае финансовых временных рядов! Посмотрите, как мы готовим данные:

for i in range(N):
    x_i = features[i:i+WINDOW]
    y_i = (close[i+WINDOW] - open[i+WINDOW]) / open[i+WINDOW]

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

Полезность набора для проверки

Когда мы говорим об обучении нейронных сетей, скажем, с помощью Keras, мы обычно передавали функции fit () такие образцы данных, как X_train, Y_train, X_test, Y_test, X_val, Y_val. Визуально это может выглядеть следующим образом (синяя часть временного ряда - это поезд, оранжевый - проверка, а зеленый - тест):

Эти разделения представляют собой случай, когда мы переобучаем сеть каждые N дней (например, N = 21), проверяем производительность в следующие 3–7 дней, а затем, если это удовлетворительно, запускаем ее вне периода выборки. Выглядите разумно ... в случае, если поезд, проверка и набор тестов похожи :) например, на первом рисунке выше есть тот же тренд и более или менее одинаковая волатильность, поэтому нейронная сеть обучалась на восходящем тренде, проверялась на том же тренде и тестировалась на та же тенденция покажет хорошие результаты. Но что может случиться еще через месяц? Ситуация может кардинально измениться, поведение рынка может быть совершенно другим, и наши предположения будут совершенно неверными! Какие могут быть решения? Прежде всего - анализ переменных и отбор тех, которые не меняются так со временем. Одним из примеров таких функций могут быть фундаментальные данные или несколько паттернов баров. Во-вторых, используйте перекрестную проверку, форвард-тестирование и ансамблирование моделей, что позволит сделать обобщения.

Переоснащение при тестировании

Бэктестирование стратегии должно дать вам интуитивное представление о том, как она будет работать в будущем. Я имею в виду, что вы полагаете, что если стратегия показала хорошие результаты на прошлых данных (с учетом того, что не было предубеждений в прогнозировании или других проблем, связанных с обработкой данных / машинным обучением), она будет более или менее прибыльной в будущем. Это просто неправда. Ниже вы можете найти некоторые кривые эквити из чрезвычайно простых бэктестов стратегии:

  1. QDA на основе 5-минутных столбцов OHLCV и нескольких очень простых функций предсказывает изменение на следующей минуте (бинарная классификация)
  2. Train и val тесты составляют 21/30 дней и 7/14 дней соответственно (оптимизируется)
  3. Бэктест оценивается в течение следующих 7 дней с использованием простой стратегии длинных и коротких позиций.

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

Хорошие прогнозы! = Хорошая торговля

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

На графиках выше показаны три кривые эквити и соответствующие результаты F1. Прежде всего, мы видим, что на графиках, где тест превосходит нашу стратегию, оценка F1 составляет 0,68 и 0,62, а в противоположной ситуации оценка F1 немного ниже 55%. Если вы позже заглянете в Jupyter Notebook, то увидите, что лучшие у нас акции с оценкой F1 около 55%, не больше. Если быть более точным, коэффициент корреляции между улучшением коэффициента Шарпа (разница между коэффициентом Шарпа нашей стратегии и эталона) и оценкой F1 составляет -0,425. Удивительно, правда? Это отрицательно! Что мы можем сделать вывод? Если эксперимент был поставлен неправильно и данные были действительно случайными и не подготовленными, то все остальное также является случайным. Мусор на входе - мусор вне.

Хороший, но плохой пример стратегии



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

Заключение

Финансовое машинное обучение другое и сложное. Я уверен, что мне еще многого не хватает, и ресурсы, которые я использовал, не покрывают всех проблем, но мы видим, что просто поиграть с нейронными сетями Keras явно недостаточно. Это может быть хорошим упражнением, чтобы избежать переобучения, или хорошим доказательством того, что ваши данные, ваши функции и ваш алгоритм имеют некоторую общую прогностическую ценность, но это не принесет вам денег. Я уверен на 99,99%. Оставшиеся 0,01% оставляю на фактор удачи, но ... не думаю, что менеджеры хедж-фондов будут вкладываться в эту альфу :)

Наконец, есть список рекомендуемых чтений:





Https://www.amazon.com/Machine-Trading-Deploying-Computer-Algorithms/dp/1119219604

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

P.S.
Следите за мной также в Facebook, чтобы увидеть статьи AI, которые слишком короткие для Medium, Instagram для личных вещей и Linkedin!