Как в обучении с подкреплением использовать саму модель в получении награды?

У меня есть данные в 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))

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


Ответы (0 шт):