PyTorch LSTM日股票收益预测:训练与测试损失异常咨询
损失异常的根因定位
切分逻辑错误,并非完全无数据重叠
你构建滑动时序样本后,错误使用原始收益率序列的总长度作为切分分母,而非滑动样本集的实际长度:
- 原始序列长度记为
len(data),设置滑动窗口T=10后,最终生成的特征样本总长度为len(data) - T - 你计算切分边界时,调用
len(historical_returns)获取的是原始序列长度,而非实际特征集长度,最终导致训练集与验证集的索引边界重叠
举个直观的数值例子:假设原始序列共1000个交易日,T=10,滑动生成的特征集实际长度为990个样本: - 按你的代码逻辑,训练集取前
3*1000//5=600个样本,对应索引范围0-599 - 验证集按切片规则取
[-400:-200],对应索引范围590-789 - 两个集合的重叠区间为索引590-599,共10个样本——这就是你以为没有泄漏,实际训练集已经接触过部分验证集样本的原因
初始训练损失高于验证损失的原因
你使用MSE作为损失函数,损失值和样本本身的波动方差直接正相关:
- 标准化器仅拟合了训练集时间区间的均值、方差,后续验证、测试集的缩放值完全基于训练集的统计量计算
- 股票收益率存在典型的波动聚集效应,如果你选取的验证集刚好落在低波动时间区间,该区间内样本的整体方差会显著低于训练集的平均水平
- 模型随机初始化阶段,预测值与真实值的偏差天然和样本方差正相关,因此随机模型在低波动验证集上计算的损失,天然低于高波动训练集上的损失——这并非模型训练带来的差异,是两个区间本身的方差不可比导致的
训练后损失走势异常的原因
- 上述切分重叠带来的隐性数据泄漏,会直接拉高训练集拟合效果
- 日度股票收益率本身信噪比极低,模型在全量批量梯度下降的流程下,没有任何正则约束,会快速记住训练集内的噪声规律,自然会出现训练损失随训练持续下降、验证损失始终高于训练集的情况
修复方案
- 修正切分逻辑,先获取滑动特征集的实际总长度,再按6:2:2比例计算切分点:
N = len(X_historical) train_end = int(N * 0.6) val_end = int(N * 0.8) x_train1 = X_historical[:train_end] y_train1 = Y_historical[:train_end] x_val1 = X_historical[train_end:val_end] y_val1 = Y_historical[train_end:val_end] x_test1 = X_historical[val_end:] y_test1 = Y_historical[val_end:] - 切分完成后逐一检查三个集合的索引范围,确认无重叠、时间顺序连贯
- 计算三个集合的真实值方差,排除因区间本身波动差异导致的损失绝对值不可比的问题
内容的提问来源于stack exchange,提问作者InvestingScientist
相关产品推荐
相关产品推荐

