Биткойн-торговый бот, часть 1: пошаговое руководство по созданию среды для торговли биткойнами.

Самые продвинутые планы развития науки о данных, которые вы когда-либо видели! Поставляется с тысячами бесплатных учебных ресурсов и интеграцией ChatGPT! https://aigents.co/learn/roadmaps/intro

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

В моих предыдущих руководствах LunarLander-v2 и BipedalWalker-v3 я накопил опыт в написании алгоритмов оптимизации проксимальной политики, чтобы получить некоторый опыт для начала разработки моей собственной среды RL. . Упомянутые учебные пособия были написаны для пакета OpenAI gym, который позволяет нам экспериментировать с нашими алгоритмами обучения с подкреплением в множестве доступных сред для экспериментов.

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

Введение в окружающую среду

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

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

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

Наконец, метод render может периодически вызываться для печати представления среды. Это может быть как просто оператор печати, так и сложный рендеринг 3D-среды с использованием OpenGL, что угодно. В этом примере мы начнем с оператора печати, но позже я планирую сделать все в Maplotlib.

Торговая среда биткойнов

Чтобы продемонстрировать, как все это работает, я собираюсь создать среду для торговли криптовалютой. Затем я обучу нашего агента обыграть рынок и стать прибыльным трейдером в окружающей среде. Это не должен быть биткойн; мы сможем выбрать любой рынок, который мы хотим. Итак, приступим! Я выбрал биткойн просто в качестве примера.

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

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

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

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

Но этого недостаточно, чтобы каждый раз знать, какую сумму биткойнов покупать или продавать. Поэтому нам нужно будет создать пространство действий с дискретным количеством типов действий (купить, продать и удержать) и непрерывным спектром сумм для покупки/продажи (0–100% баланса счета/размера позиции соответственно). В этом и следующих нескольких уроках я не буду рассматривать количество по соображениям простоты. Но после того, как мы получим рабочую среду с обученным агентом, я попытаюсь интегрировать риск нашего агента, учитывая сумму.

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

Выполнение

Теперь, когда мы рассмотрели и определили размер нашего состояния, пространство для действий и вознаграждения, пришло время реализовать нашу среду. Во-первых, нам нужно определить action_space и state_size в конструкторе среды. Среда ожидает, что будет передан фрейм данных pandas, содержащий рыночные данные, из которых нужно извлечь информацию. В дополнение к этому мы должны знать длину нашего набора данных, начальный торговый баланс и сколько шагов рыночной памяти мы хотим, чтобы наш агент увидел. Все эти параметры мы определяем в нашей части __init__. Я описываю их как список ожиданий; это означает, что наш список имеет ограниченный размер в 50 шагов. Когда мы добавляем новый элемент в список, последний удаляется. Не волнуйся; Я буду загружать данные истории рынка на свою страницу GitHub вместе с этим обучающим кодом. Но на случай, если вы захотите загрузить свои данные, я скачал необработанные рыночные данные со страницы https://bitcoincharts.com/.

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

Далее, наша среда должна быть в состоянии сделать шаг. Наш агент выберет и выполнит действие «купить», «продать» или «удержать», рассчитает вознаграждение и на каждом этапе будет возвращать следующее наблюдение. В реальной ситуации, как правило, наша цена колеблется в течение 1 часа (в этом уроке я выбрал 1 час) вверх и вниз, пока не закроется. В исторических данных мы не можем увидеть эти движения, поэтому нам нужно их создать. Я делаю это, беря случайную цену между ценами открытия и закрытия. Поскольку я использую свой общий баланс, я могу легко рассчитать, сколько биткойнов я куплю/продам, и представить это в параметрах баланса, crypto_bought, crypto_held, crypto_sold и net_worth (я добавляю их в свою историю заказов, поэтому я отправлю эти значения моему агенту). Кроме того, я могу рассчитать вознаграждение, вычитая чистую стоимость из предыдущего шага и текущего шага. И, наконец, мы должны выбрать новое состояние, вызвав _next_observation().

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

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

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

Мы можем создать экземпляр среды CustomEnv с фреймом данных и протестировать его с помощью нашего агента Random_games. Я установил lookback_window_size=50, и это будут шаги истории, хранящиеся в состоянии. Затем я разделяю фреймы данных для обучения и тестирования фреймов данных, которые будут использоваться для обучения нашего агента RL. Кроме того, нам потребуются отдельные среды тестирования и обучения для оценки, поэтому сейчас я создам их просто для удовольствия. И, наконец, давайте запустим нашу функцию Random_games в одной из наших встроенных сред:

После десяти эпизодов случайных игр мы должны увидеть аналогичные результаты, как показано ниже. В десяти эпизодах мой средний собственный капитал составлял около 981 доллара, что означает, что наш случайный агент потерял в среднем 19 долларов за 10 эпизодов. Каждый раз, когда мы запускаем этот случайный агент, мы будем получать разные результаты; это также может быть положительным.

Заключение:

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

Спасибо за прочтение! Как всегда, весь код, приведенный в этом руководстве, можно найти на моей странице GitHub, и его можно использовать бесплатно! Увидимся в следующей части, где мы сделаем несколько красивых ценовых графиков.

Первоначально опубликовано на https://pylessons.com/RL-BTC-BOT-backbone

Больше контента на plainenglish.io