LSTM预测代码中testPredict[-1]是否为未来值预测结果?
回答
核心结论
直接回应你的两个疑问:
testPredict = model.predict(Xtest)返回的不是序列的最后一个值,是测试集全部时序样本的预测结果数组,长度和你构造的测试集样本数一致。- 逆缩放后得到的
last_value = testPredict[-1]不是未来预测结果,只是测试集范围内最后一个历史时间点的Close价格拟合值,属于对已知数据的回测输出,不涉及未来时间的外推。
代码逻辑拆解
你的数据集构造用的是典型的单步滑动窗口逻辑:
- 设定窗口大小
n=24,即每一条样本的输入是连续24小时的Close、log_returns两个特征,预测目标是这24小时窗口结束后紧邻的下一小时的Close价格。 - 你构造
Xtest时,所有输入窗口全都是从已下载的BTC历史数据的测试集切片里截取的,所有样本对应的预测目标点全都是已经存在的历史时间点,没有超出你拉取的20周60分钟数据的时间范围。 testPredict的返回结果和Xtest的样本按时间顺序一一对应,最后一个元素testPredict[-1]对应的输入是测试集最后24个历史点的特征,输出的是测试集最后一个已知时间点的Close预测值,本质是模型对历史数据的拟合值,不是未来值。
单步未来预测的正确实现
如果要得到下一个未知小时的Close价格预测,需要按如下步骤构造输入:
- 取整个预处理后数据集的最后24条
[Close, log_returns]特征 - 将特征reshape成模型要求的输入形状
(1, 24, 2) - 调用
model.predict()得到缩放后的预测值 - 按照你现有逻辑给预测值补零凑成和scaler匹配的特征维度,调用
scaler.inverse_transform()还原,得到的才是未来第一个时间点的Close预测值。
额外代码问题提醒
你代码里计算训练、测试RMSE的逻辑存在错误:
当前代码取[x[0][0] for x in Xtrain]作为真实值,这个值是每个输入窗口第一个时间点的Close价格,和模型预测的“窗口后第一个时间点的Close价格”完全不对应,计算出的RMSE没有参考意义,正确的真实值应该是做对应逆变换后的ytrain、ytest数组。
内容的提问来源于stack exchange,提问作者PetersServer1
相关产品推荐
相关产品推荐

