Как обучить нейросеть торговать на бирже. Обучение с подкреплением

Код ниже определяет пользовательскую среду Gym под названием CryptoTrader, которая имитирует торгового бота криптовалютами.

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

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

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

import numpy as np import pandas as pd import random import gym from gym import spaces from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense class CryptoTrader(gym.Env): def __init__(self, data, capital): self.data = data self.capital = capital self.reward_range = (-np.inf, np.inf) self.action_space = spaces.Box(low=-1, high=1, shape=(1,)) self.observation_space = spaces.Box(low=0, high=1, shape=(len(data.columns),)) def reset(self): self.current_step = 0 self.balance = self.capital self.stocks = 0 self.net_worth = self.balance + (self.stocks * self.data.iloc[self.current_step]['Close']) self.profit = 0 return self.data.iloc[self.current_step] def step(self, action): current_price = self.data.iloc[self.current_step]['Close'] done = False if action > 0: # покупка affordable_stocks = int(self.balance / current_price) stocks_bought = int(affordable_stocks * action) cost = stocks_bought * current_price self.balance -= cost self.stocks += stocks_bought elif action < 0: # продажа stocks_sold = int(self.stocks * abs(action)) profit = stocks_sold * current_price self.balance += profit self.stocks -= stocks_sold self.profit += profit self.net_worth = self.balance + (self.stocks * current_price) self.current_step += 1 if self.current_step >= len(self.data.index)-1: done = True obs = self.data.iloc[self.current_step] reward = self.net_worth - self.capital return obs, reward, done, {} def build_model(input_shape): model = Sequential() model.add(Dense(32, activation='relu', input_shape=input_shape)) model.add(Dense(16, activation='relu')) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse') return model def train_model(env, episodes, steps): input_shape = env.observation_space.shape model = build_model(input_shape) for episode in range(episodes): state = env.reset() state = np.reshape(state, [1, input_shape[0]]) for step in range(steps): action = model.predict(state) next_state, reward, done, _ = env.step(action) next_state = np.reshape(next_state, [1, input_shape[0]]) target = reward if not done: target = (reward + 0.95 * np.amax(model.predict(next_state)[0])) target_f = model.predict(state) target_f[0] = target model.fit(state, target_f, epochs=1, verbose=0) state = next_state if done: break print("Episode ", episode + 1, " total net worth: ", env.net_worth) return model if __name__ == '__main__': data = pd.read_csv('data.csv') capital = 1000 env = CryptoTrader(data, capital) model = train_model(env, episodes=100, steps=200)

Выражение 0.95 * np.amax(model.predict(next_state)[0]) представляет собой целевое значение (целевую функцию), которое необходимо достичь при обновлении весов нейронной сети.

Здесь 0,95 обозначает коэффициент дисконтирования, который отражает то, что будущие награды менее важны, чем текущие награды.

np.amax(model.predict(next_state)[0]) представляет собой наибольшее ожидаемое значение награды для следующего состояния, которое оценивается с помощью текущей нейронной сети.

Это лишь пример, как работает обучение с подкреплением.

Системы с искусственным интеллектом можно применять в любой отрасли и в любом бизнесе.
Напишите мне в вацап, и я расскажу как можно усилить с помощью ИИ именно ваш бизнес

66
5 комментариев

По историческим данным построить предсказательный алгоритм торговли на бирже невозможно.

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

Какие бы индикаторы вы не выбрали, всегда найдутся примеры, как цена пошла в разную сторону при одинаковой предыдущей истории.

Ответить

Какие бы индикаторы вы не выбрали, всегда найдутся примеры, как цена пошла в разную сторону при одинаковой предыдущей истории.

вопрос вероятностей (частоты) таких событий наверно тоже имеет смысл.

а странно кстати что график цены актива — выглядет не глазок не совсем как белый шум.. 🤔🤔

наверно потому что до ранка допустили торговаль — людей! (а если бы торговали бы только скрипты (обученные по истории) — видимо точно график превратился бы в белый шум :))

1
Ответить

Вот пример нелинейной архитектуры нейросети на 1,5 млн параметров. Эти системы работают не по индикаторам. Там все гораздо интереснее и сложнее.

В одной из следующих статей напишу про генетический подбор архитектуры.

1
Ответить

Уже сейчас объем алгоритмической торговли составляет на рынке $15 млрд. Прогноз на увеличение до $23 млрд к 2028 году.

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

Ответить