← Вернуться к списку

Почему моя реализация алгоритма REINFORCE для оптимизации портфеля не сходится?

Краткое содержание

Я пытаюсь реализовать алгоритм Reinforce (монтажный градиент политики) для оптимизации портфеля из 94 акций ежедневно (у меня есть подходящие исторические данные для этого). Идея заключается в следующем: каждый день вход в нейронную сеть состоит из следующего: ежедневные возвраты (ежедневные моменты) за предыдущие 20 дней для каждой из 94 акций текущий вектор весов портфеля (94 веса)Состояния представляются векторами размерности 1974. Нейронная сеть должна возвращать 94-мерный вектор действия, который снова является вектором (идеальных) весов портфеля для инвестирования. Разрешены отрицательные веса (короткие позиции), и сумма весов портфеля должна быть равна единице. Поскольку пространство действий непрерывно, я пытаюсь решить эту задачу с помощью алгоритма Reinforce. Награды выдаются на основе ежедневных возвратов портфеля за вычетом торговых издержек. Вот фрагмент кода: класс Policy(nn.Module): def __init__(self, s_size=1974, h_size=400, a_size=94): super().__in

Полный текст

Почему моя реализация алгоритма REINFORCE для оптимизации портфеля не сходится? Задайте вопрос

Задано 6 лет, 3 месяца назад Изменено сегодня Просмотрено 289 раз

Задано 6 лет, 3 месяца назад

4 $\begingroup$ Я пытаюсь реализовать алгоритм Reinforce (политический градиент Монте-Карло) для оптимизации портфеля из 94 акций ежедневно (у меня есть подходящие исторические данные для этого). Идея заключается в следующем: каждый день вход для нейронной сети состоит из следующих данных: ежедневные возвраты (ежедневные моменты) для предыдущих 20 дней для каждой из 94 акций текущий вектор весов портфеля (94 веса) Следовательно, состояния представляются векторами размерности 1974. Нейронная сеть должна возвращать 94-мерный вектор действия, который снова является вектором (идеальных) весов портфеля для инвестирования. Разрешены отрицательные веса (короткие позиции), и веса портфеля должны суммироваться до единицы. Поскольку пространство действий непрерывно, я пытаюсь решить эту задачу с помощью алгоритма Reinforce. Награды выдаются на основе ежедневных возвратов портфеля за вычетом торговых комиссий. Вот фрагмент кода: class Policy(nn.Module): def __init__(self, s_size=1974, h_size=400, a_size=94): super().__init__() self.fc1 = nn.Linear(s_size, h_size) self.fc2 = nn.Linear(h_size, a_size) self.state_size = 1974 self.action_size = 94 def forward(self, x): x = F.relu(self.fc1(x)) x = self.fc2(x) return x def act(self, state): state = torch.from_numpy(state).float().unsqueeze(0).to(device) means = self.forward(state).cpu() m = MultivariateNormal(means,torch.diag(torch.Tensor(np.repeat(1e-8,94)))) action = m.sample() action[0] = action[0]/sum(action[0]) return action[0], m.log_prob(action) Обратите внимание, что чтобы обеспечить суммирование весов портфеля (элементов тензора действия) до 1, мы делим на их сумму. Также обратите внимание, что мы отбираем выборку из многомерного нормального распределения с чрезвычайно малыми диагональными членами, поскольку мы хотим, чтобы сеть вела себя максимально детерминированно (Я, вероятно, должен использовать нечто подобное DDPG, но я хотел попробовать более простые решения для начала). Обучающая часть выглядит следующим образом: optimizer = optim.Adam(policy.parameters(), lr=1e-3) def reinforce(n_episodes=10000, max_t=10000, gamma=1.0, print_every=1): scores_deque = deque(maxlen=100) scores = [] for i_episode in range(1, n_episodes+1): saved_log_probs = [] rewards = [] state = env.reset() for t in range(max_t): action, log_prob = policy.act(state) saved_log_probs.append(log_prob) state, reward, done, _ = env.step(action.detach().flatten().numpy()) rewards.append(reward) if done: break scores_deque.append(sum(rewards)) scores.append(sum(rewards)) discounts = [gamma**i for i in range(len(rewards)+1)] R = sum([a*b for a,b in zip(discounts, rewards)]) policy_loss = [] for log_prob in saved_log_probs: policy_loss.append(-log_prob * R) policy_loss = torch.cat(policy_loss).sum() optimizer.zero_grad() policy_loss.backward() optimizer.step() if i_episode % print_every == 10: print('Episode {}\tAverage Score: {:.2f}'.format(i_episode, np.mean(scores_deque))) print(scores[-1]) return scores, scores_deque scores, scores_deque = reinforce() К сожалению, во время обучения не происходит сходимости даже после того, как я подбирал скорость обучения, поэтому мой вопрос следующий: есть ли что-то очевидно неправильное в моем подходе здесь и если да, то как мне это решить? обучение методом усиления сходимость оптимизация портфеля Share Improve this question Follow edited May 30, 2022 at 9:00 nbro 43.3k 14 14 gold badges 121 121 silver badges 222 222 bronze badges asked Oct 22, 2019 at 12:24 BGa 239 1 1 silver badge 6 6 bronze badges