LTSM плохо предсказывает колонку закрытия акций Apple.

Вопрос или проблема

Я использую LSTM (долгая краткосрочная память) для прогнозирования цен закрытия акций Apple, используя данные о трех предыдущих днях. Моя проблема заключается в том, что модель недооценивает цены закрытия. Фотография конечного результата представлена в конце этого текста.

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

вставьте описание изображения здесь

rec_obj <- recipe(Close ~ .,aapl) %>%
    step_sqrt(Close) %>%
    step_center(Close) %>%
    step_scale(Close) %>%
    prep()

aapl_normalized <- bake(rec_obj, aapl) #10372 наблюдений. 

# сохраняем центры для денормализации позже
center_history <- rec_obj$steps[[2]]$means["Close"]
center_history
scale_history  <- rec_obj$steps[[3]]$sds["Close"]
scale_history
c("center" = center_history, "scale" = scale_history)

Обучающие, валидационные и тестовые наборы данных



aapl_trn <- aapl_normalized[1:8500,] 
aapl_val <- aapl_normalized[8501:9401,] #900
aapl_test <- aapl_normalized[9402:10372 ,] #970

Изменение формы данных

n_inputs <- 3 #число входов в RNN, например, 1-е использование первых 10 дней для прогнозирования 11-го
n_predictions <- 1
batch_size <- 10 #число батчей, которые вы передаете. чем больше, тем быстрее модель -- параметр

Функции

build_windowed_matrix <- function(data, timesteps) { #преобразует данные в окна 4+1) если у вас 14K строк, это создаст матрицу 14K x 5
  t(sapply(1:(length(data) - timesteps + 1), function(x) 
    data[x:(x + timesteps - 1)]))
}

reshape_3D <- function(df){ #для получения размера 14kx5x1, так как это требуется keras. Если бы это было многомерное (n), это должно быть 14kx5xn!!!
  dim(df) <- c(dim(df)[1], dim(df)[2], 1)
  df
}

get_x <- function(mtx, n_inputs, batch_size){#для каждой строки получает x (всего 4) 
  mtx <- mtx[, 1:n_inputs]
  mtx <- mtx[1:(nrow(mtx) %/% batch_size * batch_size), ]
  reshape_3D(mtx)
}

get_y <- function(mtx, n_inputs, n_predictions, batch_size) {#для каждой строки получает y (5-й элемент) + помещает их в 3D
  mtx <- mtx[, (n_inputs+1):(n_inputs+n_predictions), drop=FALSE]
  mtx <- mtx[1:(nrow(mtx) %/% batch_size * batch_size), , drop=FALSE]
  if(n_predictions==1){
    dim(mtx) <- c(length(mtx)[1], 1)
  }
  reshape_3D(mtx)
}

Извлечение значений ‘Close’

Извлекаем значения закрытия и игнорируем даты

trn <- aapl_trn %>% select(Close) %>% pull() #в векторе
val <- aapl_val %>% select(Close) %>% pull()
test <- aapl_test %>% select(Close) %>% pull()

Создание матриц

на самом деле, используя функции, которые я определил выше

trn_mtx <- build_windowed_matrix(trn, n_inputs + n_predictions)
val_mtx <- build_windowed_matrix(val, n_inputs + n_predictions)
test_mtx <- build_windowed_matrix(test, n_inputs + n_predictions)

X_train <- get_x(trn_mtx, n_inputs, batch_size) #X_train_close
Y_train <- get_y(trn_mtx, n_inputs, n_predictions, batch_size)
X_val <- get_x(val_mtx, n_inputs, batch_size)
Y_val <- get_y(val_mtx, n_inputs, n_predictions, batch_size)
X_test <- get_x(test_mtx, n_inputs, batch_size)
Y_test <- get_y(test_mtx, n_inputs, n_predictions, batch_size) #Y_test это фактическое значение закрытия в тестовом наборе. 
head(X_test)
head(Y_test) 

Я использую модель LSTM ниже:

1.) Постройте первую модель (используйте только закрытие)

model <- keras_model_sequential()

model %>%
  layer_lstm(  #lstm с 32 единицами в каждой ячейке
    units = 32,
    batch_input_shape = c(batch_size, n_inputs, 1) #включена 1 признака
  )

 layer_lstm(  #lstm с 32 единицами в каждой ячейке
    units = 16,
    batch_input_shape = c(batch_size, n_inputs, 1)
  )

model %>% 
  layer_dense(units = 1)

model %>%
  compile(
    loss="mean_squared_error",
    optimizer="sgd",
    metrics = list("mean_squared_error")
  ) '''

```{r}
callbacks <- list(#критерий остановки зависит от того, учится ли сеть больше...остановить модель от обучения после 5 эпох, если нет обучения
  callback_early_stopping(patience = 5)
)
history <- model %>% fit(
  x = X_train,
  y = Y_train,
  validation_data = list(X_val, Y_val),
  batch_size = batch_size,
  epochs = 100,
  callbacks = callbacks
)

Прогнозы, используя одну характеристику

pred_test <- model %>%
  predict(X_test, batch_size = batch_size) 

# денормализация до оригинального масштаба
pred_test <- (pred_test * scale_history + center_history) ^2 #денормализация
mse_test <- (pred_test - Y_test[,,1]) ^2  #Y_test это фактическое значение закрытия в тестовом наборе. 

График прогнозов против фактических данных


ggplot(aapl[(9402 + n_inputs):(9401 + n_inputs + dim(pred_test)[1]),], aes(x = Date, y = Close, group = 1)) + geom_line() +
  scale_x_discrete(breaks = levels(aapl$Date)[floor(seq(1, nlevels(aapl$Date),length.out = 5))]) +
  geom_line(aes(y = pred_test), color = "blue") +
  labs(x = "Дата", y = "Закрытое значение", title = "Акции Apple")

вставьте описание изображения здесь

Как вы видите из графика, моя модель, кажется, действительно недооценивает значения. Как я могу это исправить? Я пробовал настройку гиперпараметров, но это не сработало. Это потому что мои данные были очень сильно левосторонне смещенными? Как мне подойти к этому?

С наилучшими пожеланиями

Я бы предложил сначала сгладить данные с помощью скользящей средней или какой-то другой техники. Кроме того, у вас есть 16 скрытых узлов в слое. Я бы предложил увеличить оба слоя до 64, при этом последний слой по желанию в конструкции модели.

У меня есть несколько вопросов и несколько предложений.

Сначала вопросы :

  • Вы установили нелинейный слой между слоями?
  • Каковы ваши параметры обучения? такие как функция потерь

Предложение:

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

Если вы ответите на мои вопросы, я смогу получить лучшее руководство.

Ответ или решение

Почему модель LSTM не предсказывает цены закрытия акций Apple

Использование модели LSTM (Long Short-Term Memory) для предсказания цен закрытия акций Apple может столкнуться с различными проблемами, особенно если данные имеют определенные особенности, такие как левая асимметрия. В вашем случае наблюдается недооценка предсказанных цен закрытия. Давайте разберем основные аспекты вашей проблемы и предложим возможные пути улучшения модели.

1. Сложности с предсказанием из-за левой асимметрии данных

Ваши данные о ценах закрытия акций Apple имеют сильно левую асимметрию. Это может привести к тому, что модель будет недооценивать высокие цены, что объясняет наблюдаемую вами недооценку. Варианты решения проблемы включают:

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

  • Масштабирование: Убедитесь, что вы правильно масштабируете ваши данные. Процесс нормализации должен включать не только среднее значение и стандартное отклонение, но и учитывать минимум и максимум, чтобы обеспечить более равномерное распределение данных.

2. Архитектура модели

Ваши текущие настройки LSTM могут быть недостаточно эффективными. Вот некоторые рекомендации:

  • Увеличение числа единиц в слоях LSTM: Вместо 32 и 16 единиц в слоях, попробуйте увеличить их до 64 или даже 128. Это может помочь модели лучше выявлять закономерности в ваших данных.

  • Добавление нелинейных слоев: Убедитесь, что между всеми слоями присутствуют нелинейные функции активации, такие как ReLU или tanh. Это поможет модели лучше обработать сложные зависимости в данных.

  • Регуляризация: Используйте регуляризацию (например, Dropout), чтобы уменьшить переобучение, если оно имеет место.

3. Параметры обучения и гиперпараметрическая оптимизация

Параметры обучения имеют важное значение для производительности модели:

  • Оптимизатор: Рассмотрите использование адаптивного оптимизатора, такого как Adam, вместо SGD, который может быть менее эффективным при работе с LSTM.

  • Функция потерь: Убедитесь, что функция потерь (например, MSE) корректно подходит для вашей задачи. Возможно, стоит рассмотреть использование комбинаций функций потерь или метрик, чтобы лучше оценивать результаты.

4. Обработка данных и функции

Ваши функции для подготовки данных выглядят хорошо, но:

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

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

Заключение

Существуют различные подходы к улучшению предсказательной способности модели LSTM для цен закрытия акций Apple. Оценивайте свою модель на каждом этапе, корректируя архитектуру, параметры обучения и методы обработки данных. Улучшение производительности модели потребует времени и экспериментирования, но с правильным подходом вы сможете снизить недооценку и повысить точность предсказаний.

Если у вас остались вопросы или требуется дополнительная помощь по конкретным аспектам реализации, не стесняйтесь задавать их. Успехов в вашей работе!

Оцените материал
Добавить комментарий

Капча загружается...