Основные принципы обучения с подкреплением на финансовых рынках

Первые шаги перед применением обучения с подкреплением в торговле

Можете ли вы торговать косинусоидальной волной до реальных рынков?

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

Существует множество замечательных продвинутых руководств, в которых рассказывается о современных алгоритмах обучения (A3C, TRPO, PPO, TD3 и другие пугающие сокращения) и архитектурах глубокого обучения от CNN и RNN до крутых трансформеров. Однако наука о финансовых данных и машинное обучение сильно отличаются от классических упражнений ИИ в области компьютерного зрения, понимания языка или рекомендательных систем.

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

Эта статья проиллюстрирована кодом, опубликованным на моем Github - не забудьте проверить его и попробовать примеры самостоятельно! Кроме того, через пару недель я проведу расширенный доклад на эту тему на конференции ODSC Europe на семинаре Практическое руководство в финансах: игра в Atari против игровых рынков. Можете рассматривать эту статью и как подготовку к семинару;)

Упрощенное торговое упражнение

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

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

Краткое введение в обучение с подкреплением

Но подождите ... а что вообще за агент? Как вы, возможно, уже знаете, основными двумя частями системы обучения с подкреплением являются:

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

Графически это можно представить на следующей схеме:

Эта структура известна годами, и существует несколько стратегий, как научить агента действовать максимально прибыльно в любой момент. Интуитивно, если мы можем суммировать все возможные состояния (или типы рыночных ситуаций в нашем случае), мы могли бы назначать разные вознаграждения за различные действия, выполняемые в этом состоянии. Например, на бычьем рынке бездействие даст нам вознаграждение 0, открывая длинную позицию +100. и продажа такого рынка может дать нам отрицательное вознаграждение в размере -100. Таблица с таким соответствием окружения и соответствующего вознаграждения за определенные действия исторически называется Q-функцией.

Если состояния сложны и их трудно представить в виде таблиц, их можно аппроксимировать с помощью нейронной сети (это то, что мы будем делать). Имея такую ​​таблицу или функцию, мы можем выбрать наиболее прибыльное действие в каждом состоянии (в соответствии с нашей функцией Q) и наслаждаться прибылью! Но как построить такую ​​Q-функцию? Здесь нам будет полезен алгоритм Q-обучения, в котором ядром будет знаменитое уравнение Беллмана:

Как мы видим, мы будем итеративно, на каждом шаге t обновлять значение, соответствующее состоянию S и данному действию A, с двумя взвешенными частями:

  • текущее значение функции Q для этого состояния и действия.
  • Награда за такое решение + долгосрочное вознаграждение от будущих шагов

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

Также я рекомендую проверить Jupyter Notebook в репозитории Github - он содержит классы для простой среды и агента, которые помогут лучше понять механику. Для более глубокого погружения в теорию обучения с подкреплением и математику есть много замечательных ресурсов, особенно мне нравится Введение в обучение с подкреплением Ричарда Саттона.

Примечания по реализации

Реализация классов Environment и Agent относительно проста, но здесь я хотел бы еще раз обрисовать цикл обучения:

  • Итерировать по N эпохам, где каждая эпоха - это итерация общей среды
  • Для каждого образца в среде:
  1. Получить текущее состояние в момент времени t
  2. Получить функцию значения для всех действий в этом состоянии (наша нейронная сеть выдаст нам 3 значения)
  3. Выполните действие в этом состоянии (или argmax выходов, или случайным образом действуйте для исследования)
  4. Получите награду за это действие от окружения (см. Класс)
  5. Получите следующее состояние после текущего (для будущих долгосрочных вознаграждений)
  6. Сохранить кортеж текущего состояния, следующего состояния, функции значения и вознаграждения за воспроизведение опыта.
  7. Выполните воспроизведение опыта - сопоставьте нашу нейронную сеть Q с некоторыми образцами из буфера воспроизведения опыта, чтобы сделать функцию Q более адекватной в отношении того, какие награды мы получим за какие действия на этом этапе.

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

Проверка нашей торговой стратегии

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

  • Обучение будет проводиться за 5 эпох
  • Эпсилон = 0,95, Гамма = 0,9, Альфа = 0,9
  • длина среды составляет 250 точек, каждая длина состояния - 5 точек.
  • Каждое состояние нормализовано с помощью различения временных рядов.
  • вознаграждение обновляется каждые 1 балл (т. Е. следующее наблюдение в t + 1).
  • У нас есть три действия (длинное, короткое, фиксированное) с вознаграждением в виде «рыночной доходности», умноженной на +100, 0 и -100 соответственно.
  • Для воспроизведения опыта мы будем использовать 16 образцов из нашего буфера.

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

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

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

Если вы хотите опробовать эти эксперименты самостоятельно - пожалуйста, ознакомьтесь с кодом в моем Github!

Почему он ближе к Atari, чем к реальному рынку?

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

  • Переменные, влияющие на вознаграждение, имеют очень низкое отношение сигнал / шум и фактически могут меняться со временем (в видеоиграх убийство врага всегда хорошо).
  • Переобучение - гораздо более серьезная проблема: поскольку будущие рынки могут полностью отличаться от прошлых, как мы можем оценить наши риски потери денег в будущем, когда данные о них недоступны?
  • Бэктестинг также представляет собой реальную проблему - мы не можем просто играть в видеоигру и снова и снова, потому что прошлые рыночные ситуации довольно ограничены, а будущее неизвестно и не может быть смоделировано из-за неопределенности факторов, которые повлияет на это
  • Интерпретация изученной политики. Что мы на самом деле открыли? Как мы объясним мотивацию политики агента? Можно ли это объяснить известными экономическими теориями? Это действительно что-то новое или просто ложная корреляция?

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

Что нам делать дальше?

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

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

Частично я обсуждал эти вопросы в своих предыдущих сообщениях в блоге [один, два, три], но ни один из них не был связан именно с обучением с подкреплением. Я расскажу об этом на конференции ODSC Europe через пару недель на семинаре Практическое руководство в финансах: игра в Atari vs Playing Markets. Я рассмотрю вышеупомянутые части расширенной структуры, и мы увидим, как RL на самом деле может быть применен к торговле на финансовых рынках. Буду рад встретиться с вами там и обсудить это!

P.S.
Если вы нашли этот контент полезным и перспективным, вы можете поддержать меня на Bitclout. Я открыт для обсуждений и сотрудничества в области технологий, вы можете связаться со мной в Facebook или LinkedIn, где я регулярно публикую статьи, связанные с ИИ, или новостные обзоры, слишком короткие для Medium.