股票预测:GRU模型预测给定值而非未来股价

4
我只是在测试这个来自Kaggle的模型post这个模型应该能够预测从给定的最后一批股票开始往后一天的情况。经过调整几个参数后,我得到了出乎意料的好结果,正如你所看到的。 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上运行此代码。

所以我的问题是什么原因呢?我做错了什么,有什么建议吗?


你是如何处理这个问题的? - Sreeram TP
我仍在努力寻找答案,但从这个帖子中可以看到序列生成部分的一些更新,但我还没有尝试过。 - Kartik Garasia
2个回答

6
这是回归模型的一个众所周知的问题。由于回归器的任务是最小化误差,因此它通过选择最接近你输入的特征值来完成此任务。在时间序列问题中尤其如此。
1) 在时间序列回归问题中,永远不要给出未经处理的收盘价,这是您希望模型预测的。更一般地说,不要提供任何直接给回归器提供关于标签可能是什么的数字直觉的特征。
2) 如果您不确定模型是否只是复制了您的情况,请确保将原始测试集和您的预测全部绘制在一起,以便进行视觉分析。此外,如果可以,请在实时数据上对模型进行模拟,以观察模型是否具有相同的表现。
3) 我建议您使用二元分类而不是回归。
我已经热衷于金融信号预测工作将近一年了,如有需要请随时问我。
玩得开心!

嘿,感谢您提供的详细回复。根据您的答案,我将采用二元分类。让我们看看它的表现如何。编辑:我还在考虑进行多序列预测,这是一个好主意吗? - Kartik Garasia
你应该提供不仅是最后一个样本,而是一个时间序列窗口,将最后n个样本作为一个输入。例如;如果你想预测t+1时刻的上升/下降波动,对于更大的模式,为每个点向模型提供t、t-1、t-2、...、t-29的特征作为单个样本。如果这就是你的意思,那就去做吧。但是,如果你的意思不仅是预测t+1,而是t+2等等,那就很危险了;你应该想出一些聪明的方法来解决这个问题。 - Ugur MULUK
@UgurMULUK,我也遇到了类似的问题,你能看一下这里吗?https://dev59.com/qFQK5IYBdhLWcg3wNtTA - Sreeram TP

0
在我看来,这是因为您的损失函数使用的是均方误差。最好的方法是将上一个值作为当前步骤的估计值(特别是如果步骤相邻)来最小化此误差。
如果您尝试预测样本之间的增量,您将清楚地看到模型的局限性。
我目前正在尝试使用时间序列进行预测,遇到了类似的问题。我还没有找到解决方案,但正在像其他人指出的那样提取特征。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接