Как в обучении с подкреплением использовать саму модель в получении награды?
У меня есть данные в pandas dataframe, пусть это будут биржевые цены (схожая задача). Есть 3 варианта действий - купить/продать/ничего не делать. Я хочу, чтобы при каждой итерации модель использовала свое текущее состояние для того, чтобы на исторических данных (backtesting) решать, что делать на каждом баре. При этом награда - winrate полученной стратегии.
Я использую:
def run_backtest(data):
class SimpleStrategy(bt.Strategy):
# Я хочу передать сюда модель, которая на будет решать, купить/продать
return winrate
# Гиперпараметры
model = create_model(input_shape, num_actions)
optimizer = tf.keras.optimizers.Adam(learning_rate)
huber_loss = tf.keras.losses.Huber()
model.compile(optimizer=optimizer, loss=huber_loss)
# Обучение модели с использованием обучения с подкреплением
num_episodes = 100
for episode in range(num_episodes):
state = fake_data.values
state = np.reshape(state, [1, state.shape[0], state.shape[1]])
with tf.GradientTape() as tape:
action_prob = model(state)
action = np.random.choice(num_actions, p=np.squeeze(action_prob))
# Запуск backtest и получение награды
reward = run_backtest(fake_data) #вот здесь надо вызвать модель
# Вычисление потерь и обновление модели
y = np.zeros((1, num_actions))
y[0][action] = 1
advantage = reward - np.mean(action_prob) # для примера
loss = -tf.math.log(action_prob[0][action]) * advantage
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
Я прочитал довольно много статей и примеров, в частности очень много вариаций змейки и прочих игр, но там награда при рандомном выборе считается сразу, на следующем шаге, мне же необходимо просчитать всю систему исторических данных, для получения вознаграждения. Подскажите, в какую сторону копать?