Я реализую в PyTorch модель LSTM, чтобы предсказать, вырастет или упадет цена акции на момент закрытия в следующие 5 и 10 минут.
В частности, я использую 5-минутные данные за 24 года с 19 функции, разделенные на части по одной неделе на прогноз (с использованием 7 разных акций).
Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря ни на что, модель LSTM, похоже, предсказывает значения вокруг одного конкретного значения. чтобы всегда минимизировать потери, которые не сильно уменьшаются.
Я предварительно готовлю входные данные и цели в torch.tensors с помощью [batch_size, последовательности_len, функций] (которые в моем случай [32, 2016, 19]), нормализуйте их между 0 и 1 и передайте в мою модель LSTM, которая структурирована следующим образом:
class MultiInputOutputLSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size, dropout, lr, batch_size):
super(MultiInputOutputLSTM, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.dropout = dropout
self.batch_size = batch_size
self.loss_list = []
self.accuracy = 0
self.predictions_list = [0]
self.lstm = nn.LSTM(input_size = self.input_size, hidden_size = self.hidden_size, num_layers = self.num_layers, dropout = self.dropout, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size, bias=True)
self.sigmoid = nn.Sigmoid()
self.criterion = nn.BCEWithLogitsLoss()
self.optimizer = torch.optim.RMSprop(self.parameters(), lr = lr, alpha=0.9, weight_decay=1e-4, momentum=0.5)
self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(self.optimizer, 'min')
def forward(self, x):
h0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
c0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
lstm_out, _ = self.lstm(x, (h0, c0))
output = self.fc(lstm_out[:, -1, :])
return output
def train_step(self ,x, y):
self.train()
predictions_1 = torch.round(self.forward(x))
predictions = self.forward(x)
if (predictions_1.detach().cpu().numpy()[0] == y.detach().cpu().numpy()[0]).all():
self.accuracy += 1
self.predictions_list.append(predictions.detach().cpu().numpy()[0][0])
penalty = torch.mean((predictions-0.5)**2)
loss = self.criterion(predictions, y) + penalty
self.scheduler.step(loss)
self.optimizer.zero_grad()
self.loss_list.append(loss.item())
mean_loss = sum(self.loss_list)/len(self.loss_list)
loss.backward()
torch.nn.utils.clip_grad_norm_(self.parameters(), max_norm=6)
self.optimizer.step()
return loss.item(), mean_loss, self.accuracy, predictions.detach().cpu().numpy()[0], y.detach().cpu().numpy()[0]
def test_step(self, inputs, targets):
self.eval()
with torch.no_grad():
outputs = torch.round(self.forward(inputs))
outputs = outputs.detach().cpu().numpy()[0]
targets = targets.detach().cpu().numpy()[0]
if (outputs == targets).all():
accuracy = 1
else:
accuracy = 0
return accuracy, outputs, targets
Целями являются 1, если цена растет, и 0 в противном случае.
Гиперпараметры:
input_size = 19
hidden_size = 3
num_layers = 5
output_size = 2
lr = 0.001
num_epochs = 5
batch_size = 32
dropout = 0.3
Модель создает прогнозы в начале, а затем они будут меняться +- 1e-3, 1e-4, то есть в основном то же самое во время обучения.
Разделение поезд-тест составляет 85-15%.
Вот список того, что я пробовал:
снижение или увеличение скорости обучения (с 0,00001 до 0,1), размер вывода (с большим и меньшим количеством прогнозы), Batch_size (от 1 до 256), num_layers (1-5), input_size (с 1, 2, 3... 19 функциями), dropout (от 0 до 0,5) и num_epochs (от 1 до 100).Я попробовал оптимизатор Adam, затем SDG, затем оптимизатор RMSProp, меняя альфа, импульс и вес_распада.
Также попробовал BCELoss (со слоем активации сигмовидной кишки в self.forward()), L1Loss, MSELoss, CrossEntropyLoss, прежде чем остановиться на потере, которая наказывает значения, слишком близкие к 0,5 (это не очень помогает, но при этом Я попробую что угодно.
Средняя потеря снижается с 0,924 до 0,889.
Точность как вы понимаете, очень низка (от 5,56% до 11,67%): единственная причина, по которой она не равна нулю, это чистая удача.
Я также пытаюсь спрогнозировать разница между последним элементом закрывающего столбца фрейма данных и будущими двумя следующими значениями, но... с теми же проблемами.
Ticker - Df - Loss - Mean Loss - Predictions - Targets - Epoch
AAPL 1/120 0.808 0.808 [0.5642182 0.11684255] [1. 1.] 1/50
AAPL 2/120 0.828 0.818 [0.5629723 0.12899561] [1. 1.] 1/50
AAPL 3/120 0.834 0.823 [0.5472506 0.13749745] [1. 1.] 1/50
AAPL 4/120 0.839 0.827 [0.52973044 0.13656825] [0. 0.] 1/50
AAPL 5/120 0.821 0.826 [0.52082217 0.13681749] [0. 0.] 1/50
AAPL 6/120 0.804 0.822 [0.5117941 0.14727135] [1. 1.] 1/50
AAPL 7/120 0.779 0.816 [0.49826628 0.1547919 ] [0. 0.] 1/50
AAPL 8/120 0.845 0.820 [0.49666688 0.1573844 ] [0. 0.] 1/50
…
AAPL 1/120 0.762 0.751 [0.4200741 0.24348469] [1. 1.] 50/50
AAPL 2/120 0.787 0.751 [0.43581426 0.23458275] [1. 1.] 50/50
AAPL 3/120 0.797 0.751 [0.43012726 0.23912352] [1. 1.] 50/50
AAPL 4/120 0.805 0.751 [0.43174705 0.23598525] [0. 0.] 50/50
AAPL 5/120 0.794 0.751 [0.41290796 0.24462458] [0. 0.] 50/50
AAPL 6/120 0.777 0.751 [0.42214283 0.2398287 ] [1. 1.] 50/50
AAPL 7/120 0.747 0.751 [0.42418063 0.24077193] [0. 0.] 50/50
AAPL 8/120 0.822 0.751 [0.44875318 0.23495609] [0. 0.] 50/50
...
Подробнее здесь: https://stackoverflow.com/questions/793 ... ent-inputs
Прогноз модели LSTM не меняется при изменении входных данных. ⇐ Python
Программы на Python
-
Anonymous
1735894226
Anonymous
Я реализую в PyTorch модель LSTM, чтобы предсказать, вырастет или упадет цена акции на момент закрытия в следующие 5 и 10 минут.
В частности, я использую 5-минутные данные за 24 года с 19 функции, разделенные на части по одной неделе на прогноз (с использованием 7 разных акций).
Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря ни на что, модель LSTM, похоже, предсказывает значения вокруг одного конкретного значения. чтобы всегда минимизировать потери, которые не сильно уменьшаются.
Я предварительно готовлю входные данные и цели в torch.tensors с помощью [batch_size, последовательности_len, функций] (которые в моем случай [32, 2016, 19]), нормализуйте их между 0 и 1 и передайте в мою модель LSTM, которая структурирована следующим образом:
class MultiInputOutputLSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size, dropout, lr, batch_size):
super(MultiInputOutputLSTM, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.dropout = dropout
self.batch_size = batch_size
self.loss_list = []
self.accuracy = 0
self.predictions_list = [0]
self.lstm = nn.LSTM(input_size = self.input_size, hidden_size = self.hidden_size, num_layers = self.num_layers, dropout = self.dropout, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size, bias=True)
self.sigmoid = nn.Sigmoid()
self.criterion = nn.BCEWithLogitsLoss()
self.optimizer = torch.optim.RMSprop(self.parameters(), lr = lr, alpha=0.9, weight_decay=1e-4, momentum=0.5)
self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(self.optimizer, 'min')
def forward(self, x):
h0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
c0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
lstm_out, _ = self.lstm(x, (h0, c0))
output = self.fc(lstm_out[:, -1, :])
return output
def train_step(self ,x, y):
self.train()
predictions_1 = torch.round(self.forward(x))
predictions = self.forward(x)
if (predictions_1.detach().cpu().numpy()[0] == y.detach().cpu().numpy()[0]).all():
self.accuracy += 1
self.predictions_list.append(predictions.detach().cpu().numpy()[0][0])
penalty = torch.mean((predictions-0.5)**2)
loss = self.criterion(predictions, y) + penalty
self.scheduler.step(loss)
self.optimizer.zero_grad()
self.loss_list.append(loss.item())
mean_loss = sum(self.loss_list)/len(self.loss_list)
loss.backward()
torch.nn.utils.clip_grad_norm_(self.parameters(), max_norm=6)
self.optimizer.step()
return loss.item(), mean_loss, self.accuracy, predictions.detach().cpu().numpy()[0], y.detach().cpu().numpy()[0]
def test_step(self, inputs, targets):
self.eval()
with torch.no_grad():
outputs = torch.round(self.forward(inputs))
outputs = outputs.detach().cpu().numpy()[0]
targets = targets.detach().cpu().numpy()[0]
if (outputs == targets).all():
accuracy = 1
else:
accuracy = 0
return accuracy, outputs, targets
Целями являются 1, если цена растет, и 0 в противном случае.
Гиперпараметры:
input_size = 19
hidden_size = 3
num_layers = 5
output_size = 2
lr = 0.001
num_epochs = 5
batch_size = 32
dropout = 0.3
Модель создает прогнозы в начале, а затем они будут меняться +- 1e-3, 1e-4, то есть в основном то же самое во время обучения.
Разделение поезд-тест составляет 85-15%.
Вот список того, что я пробовал:
снижение или увеличение скорости обучения (с 0,00001 до 0,1), размер вывода (с большим и меньшим количеством прогнозы), Batch_size (от 1 до 256), num_layers (1-5), input_size (с 1, 2, 3... 19 функциями), dropout (от 0 до 0,5) и num_epochs (от 1 до 100).Я попробовал оптимизатор Adam, затем SDG, затем оптимизатор RMSProp, меняя альфа, импульс и вес_распада.
Также попробовал BCELoss (со слоем активации сигмовидной кишки в self.forward()), L1Loss, MSELoss, CrossEntropyLoss, прежде чем остановиться на потере, которая наказывает значения, слишком близкие к 0,5 (это не очень помогает, но при этом Я попробую что угодно.
Средняя потеря снижается с 0,924 до 0,889.
Точность как вы понимаете, очень низка (от 5,56% до 11,67%): единственная причина, по которой она не равна нулю, это чистая удача.
Я также пытаюсь спрогнозировать разница между последним элементом закрывающего столбца фрейма данных и будущими двумя следующими значениями, но... с теми же проблемами.
Ticker - Df - Loss - Mean Loss - Predictions - Targets - Epoch
AAPL 1/120 0.808 0.808 [0.5642182 0.11684255] [1. 1.] 1/50
AAPL 2/120 0.828 0.818 [0.5629723 0.12899561] [1. 1.] 1/50
AAPL 3/120 0.834 0.823 [0.5472506 0.13749745] [1. 1.] 1/50
AAPL 4/120 0.839 0.827 [0.52973044 0.13656825] [0. 0.] 1/50
AAPL 5/120 0.821 0.826 [0.52082217 0.13681749] [0. 0.] 1/50
AAPL 6/120 0.804 0.822 [0.5117941 0.14727135] [1. 1.] 1/50
AAPL 7/120 0.779 0.816 [0.49826628 0.1547919 ] [0. 0.] 1/50
AAPL 8/120 0.845 0.820 [0.49666688 0.1573844 ] [0. 0.] 1/50
…
AAPL 1/120 0.762 0.751 [0.4200741 0.24348469] [1. 1.] 50/50
AAPL 2/120 0.787 0.751 [0.43581426 0.23458275] [1. 1.] 50/50
AAPL 3/120 0.797 0.751 [0.43012726 0.23912352] [1. 1.] 50/50
AAPL 4/120 0.805 0.751 [0.43174705 0.23598525] [0. 0.] 50/50
AAPL 5/120 0.794 0.751 [0.41290796 0.24462458] [0. 0.] 50/50
AAPL 6/120 0.777 0.751 [0.42214283 0.2398287 ] [1. 1.] 50/50
AAPL 7/120 0.747 0.751 [0.42418063 0.24077193] [0. 0.] 50/50
AAPL 8/120 0.822 0.751 [0.44875318 0.23495609] [0. 0.] 50/50
...
Подробнее здесь: [url]https://stackoverflow.com/questions/79323808/lstm-model-prediction-does-not-change-with-different-inputs[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия