Прогноз акций: модель GRU прогнозирует те же заданные значения вместо будущей цены акций - PullRequest
0 голосов
/ 12 октября 2018

я только что тестировал эту модель из kaggle post , эта модель предполагает прогнозирование на 1 день вперед из заданного набора последних акций .После нескольких настроек я получил удивительно хороший результат, как видите.enter image description here среднеквадратическая ошибка была 5,193. Так что в целом все выглядит хорошо при прогнозировании будущих запасов, верно?ну, это оказалось ужасно, когда я внимательно посмотрю на результаты.

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

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

# 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.

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

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

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

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

0 голосов
/ 12 октября 2018

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

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

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

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

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

Веселитесь.

...