прогноз акций: модель ГРУ, предсказывающая те же заданные значения вместо будущей цены акций

я только что тестировал эту модель из сообщения kaggle. > эта модель предполагает прогноз на 1 день вперед на основе заданного набора последних акций. Как видите, после настройки нескольких параметров я получил на удивление хороший результат. введите описание изображения здесь среднеквадратичная ошибка составила 5,193. Так что в целом это выглядит хорошо для прогнозирования будущих запасов, верно? Что ж, это оказалось ужасно, когда я внимательно посмотрел на результаты.

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

Это мои тренировочные данные

# So for each element of training set, we have 30 previous training set elements 
X_train = []
y_train = []

previous = 30

for i in range(previous,len(training_set_scaled)):
    X_train.append(training_set_scaled[i-previous:i,0])
    y_train.append(training_set_scaled[i,0])
X_train, y_train = np.array(X_train), np.array(y_train)


print(X_train[-1],y_train[-1])

Это моя модель

# The GRU architecture
regressorGRU = Sequential()
# First GRU layer with Dropout regularisation
regressorGRU.add(GRU(units=50, return_sequences=True, input_shape=(X_train.shape[1],1)))
regressorGRU.add(Dropout(0.2))
# Second GRU layer
regressorGRU.add(GRU(units=50, return_sequences=True))
regressorGRU.add(Dropout(0.2))
# Third GRU layer
regressorGRU.add(GRU(units=50, return_sequences=True))
regressorGRU.add(Dropout(0.2))
# Fourth GRU layer
regressorGRU.add(GRU(units=50))
regressorGRU.add(Dropout(0.2))
# The output layer
regressorGRU.add(Dense(units=1))

# Compiling the RNN
regressorGRU.compile(optimizer='adam',loss='mean_squared_error')
# Fitting to the training set
regressorGRU.fit(X_train,y_train,epochs=50,batch_size=32)

И здесь мой полный код, вы также можете запустить это код в google colab.

Итак, мой вопрос в том, в чем причина этого? что я делаю не так какие-либо предложения?


person Kartik Garasia    schedule 12.10.2018    source источник
comment
Как вы справились с проблемой?   -  person Sreeram TP    schedule 02.11.2018
comment
я все еще пытаюсь найти ответ, но из этого сообщения вы можете увидеть некоторые обновления в части создания последовательности, но я еще не пробовал.   -  person Kartik Garasia    schedule 07.11.2018


Ответы (2)


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

1) Никогда не задавайте необработанное значение закрытия, которое вы хотите, чтобы ваша модель предсказывала, особенно в задачах регрессии временных рядов. В более общем плане, никогда не давайте признака, который дает регрессору некоторую прямую числовую интуицию относительно того, что это за ярлык.

2) Если вы не уверены, что модель просто воспроизводится, как ваш случай, обязательно нанесите на график исходный набор тестов и свой прогноз, чтобы визуально проанализировать ситуацию. Более того, если вы можете, сделайте симуляцию вашей модели на данных в реальном времени, чтобы убедиться, что ваша модель предсказывает с той же производительностью.

3) Я бы рекомендовал вам применять двоичную классификацию, а не регрессию.

Я интенсивно работал над прогнозированием финансовых сигналов почти год, не стесняйтесь спрашивать больше.

Повеселись.

person Ugur MULUK    schedule 12.10.2018
comment
привет, спасибо за этот подробный повтор, теперь, согласно вашему ответу, я использую двоичную классификацию. посмотрим, как это работает. Изменить: я также думаю о прогнозировании нескольких последовательностей, это хорошая идея? - person Kartik Garasia; 13.10.2018
comment
Вы должны предоставить не только последнюю выборку, но и окно временного ряда, в котором последние n выборок являются одним входом. Например; если вы хотите спрогнозировать колебания вверх / вниз в момент времени t + 1, предоставьте характеристики t, t-1, t-2, ...., t-29 в качестве единой выборки для модели для каждой точки для большей шаблон. Если вы это имеете в виду, дерзайте. Но если вы имеете в виду, что хотите предсказать не только t + 1, но и t + 2 и так далее, это опасно; вы должны прийти с чем-то умным с этим. - person Ugur MULUK; 13.10.2018
comment
@UgurMULUK, я тоже сталкиваюсь с аналогичной проблемой, можете ли вы посмотреть здесь stackoverflow.com/questions/52252442/ - person Sreeram TP; 02.11.2018

На мой взгляд, это происходит из-за того, что ваша функция потерь представляет собой среднеквадратичную ошибку. Лучший способ минимизировать эту ошибку - использовать предыдущее значение в качестве оценки для текущего шага (особенно, если шаги находятся рядом).

Вы начнете ясно видеть ограничения своей модели, если попытаетесь предсказать дельту между выборками.

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

person Mathew Paul    schedule 22.02.2019