Основные принципы обучения с подкреплением на финансовых рынках
Первые шаги перед применением обучения с подкреплением в торговле
Можете ли вы торговать косинусоидальной волной до реальных рынков?
В алгоритмической торговле существует множество методологий - от автоматического входа в сделку и точек закрытия на основе технических и фундаментальных индикаторов до интеллектуальных прогнозов и принятия решений с использованием сложной математики и, конечно же, искусственного интеллекта. Обучение с подкреплением здесь выделяется как Святой Грааль - нет необходимости делать промежуточные прогнозы или создавать правила - вам просто нужно определить цель, и алгоритм сам выучит точные правила!
Существует множество замечательных продвинутых руководств, в которых рассказывается о современных алгоритмах обучения (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 эпохам, где каждая эпоха - это итерация общей среды
- Для каждого образца в среде:
- Получить текущее состояние в момент времени t
- Получить функцию значения для всех действий в этом состоянии (наша нейронная сеть выдаст нам 3 значения)
- Выполните действие в этом состоянии (или argmax выходов, или случайным образом действуйте для исследования)
- Получите награду за это действие от окружения (см. Класс)
- Получите следующее состояние после текущего (для будущих долгосрочных вознаграждений)
- Сохранить кортеж текущего состояния, следующего состояния, функции значения и вознаграждения за воспроизведение опыта.
- Выполните воспроизведение опыта - сопоставьте нашу нейронную сеть 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.