4

我只是从 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.

所以我的问题是它背后的原因是什么?我在做什么错任何建议?

4

2 回答 2

6

实际上,这是一个众所周知的回归问题。由于回归器的任务是最小化错误,它通过从您输入到回归器的特征中选择最接近的值来保护它的任务。在时间序列问题中尤其如此。

1)永远不要给出您希望模型预测的未处理收盘价,尤其是在时间序列回归问题中。更一般地说,永远不要给回归者提供一些关于标签可能是什么的直接数字直觉的特征。

2)如果您不确定模型是否像您的案例一样复制,请务必将原始测试集和您的预测一起绘制,以直观地分析情况。此外,如果可以,请在实时数据上对您的模型进行模拟,以观察您的模型预测是否具有相同的性能。

3)我建议您应用二进制分类而不是回归。

近一年来,我一直在紧张地研究财务信号预测,请不要犹豫,询问更多。

玩得开心。

于 2018-10-12T20:11:43.850 回答
0

在我看来,这是因为您的损失函数是均方误差。最小化此误差的最佳方法是使用先前的值作为当前步骤的估计值(特别是如果步骤就在附近)。

如果您尝试预测样本之间的增量,您将开始清楚地看到模型的局限性。

我目前正在尝试使用时间序列进行预测时遇到类似的问题。我还没有找到解决方案,但正如其他人指出的那样,我正在努力提取特征。

于 2019-02-22T22:26:24.473 回答