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

Как агенты обучения с подкреплением учатся так торговать? | Иллюстрация автора

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

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

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

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

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

Иллюстрация упрощенного «рынка» с его взлетами и падениями | Иллюстрация автора

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

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

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

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

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

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

Иллюстрация из https://www.kdnuggets.com/2018/03/5-things-reinforcement-learning.html

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

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

Формула из https://towardsdatascience.com/deep-q-learning-tutorial-mindqn-2a4c855abffc

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

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

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

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

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

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

- Итерировать по N эпохам, где каждая эпоха - это итерация всей среды
- Для каждого образца в среде:

1. Получите текущее состояние в момент времени t

2. Получите функцию значения для всех действий в этом состоянии (наша нейронная сеть выдаст нам 3 значения).

3. Выполните действие в этом состоянии (или увеличьте максимальное значение для выходных данных, или действуйте случайным образом, чтобы исследовать).

4. Получите награду за это действие от окружения (см. Класс).

5. Получите следующее состояние после текущего (для будущих долгосрочных вознаграждений).

6. Сохраните кортеж текущего состояния, следующего состояния, функции значения и вознаграждения за воспроизведение опыта.

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

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

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

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

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

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

Визуализация производительности RL по функции косинуса | Иллюстрация автора

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

Визуализация производительности RL по «зашумленной» косинусной функции | Иллюстрация автора

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

Визуализация производительности RL по комбинации функций косинуса | Иллюстрация автора

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

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

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

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

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

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

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

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

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

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

Об авторе / спикере ODSC Europe 2021 по обучению с подкреплением:

Алекс Гончар - технический предприниматель и педагог. В настоящее время он является соучредителем и директором машинного обучения в Neurons Lab - консалтинговой фирме, специализирующейся в области здравоохранения, финансов и Интернета вещей. Кроме того, он ведет популярный блог на Medium о приложениях для машинного обучения и лидерстве. Ранее он работал независимым консультантом для малых и средних предприятий и стартапов по вопросам быстрого вывода на рынок решений машинного обучения, а также преподавал курсы машинного обучения в Университете Вероны и Украинском католическом университете.