淘金网站建设推广,展示型网站与营销型网站,为什么要注册中文域名,临沂网站制作版权声明#xff1a;本文为博主原创文章#xff0c;如需转载请贴上原博文链接#xff1a;使用LSTM神经网络对股票日线行情进行回归训练#xff08;Pytorch版#xff09;-CSDN博客 前言#xff1a;近期在尝试使用lstm对股票日线数据进行拟合#xff0c;初见成型但是效果不…版权声明本文为博主原创文章如需转载请贴上原博文链接使用LSTM神经网络对股票日线行情进行回归训练Pytorch版-CSDN博客 前言近期在尝试使用lstm对股票日线数据进行拟合初见成型但是效果不甚理想过拟合/欠拟合原因可能有如下几点①前传网络的架构不够完善②网络参数组合不合理③使用CPU而非GPU进行的训练性能低导致效果不佳④Epoch数过少。暂且先记录验证结果以便后续做出相对应的调整完整代码见文末。 目录
〇、各依赖包版本
一、Pytorch中LSTM网络参数说明
二、网络结构构建及参数组合选择
2.1 网络结构构建
2.2 参数组合选择
三、验证结果展示
3.1 优化器ADAMSGD的验证效果情况
3.2 Batch_Size64320的验证效果情况
3.3 num_layers1、2和dropout0、0.2、0.4的验证效果情况
参考文献 〇、各依赖包版本 mplfinance0.12.9b7 pandas1.1.5 SQLAlchemy1.4.41 SQLAlchemy_Utils0.41.2 tushare1.2.85 backtrader1.9.78.123 akshare1.10.42 torch1.13.1 numpy1.21.6 matplotlib3.5.3 一、Pytorch中LSTM网络参数说明 图1.1 lstm参数 具体参照LSTM其中bias和proj_size使用默认值其余参数可在代码中自行修改。
二、网络结构构建及参数组合选择
import torch# 选择在cpu或gpu上跑训练
device torch.device(cuda if torch.cuda.is_available() else cpu)
# device torch.device(cuda:0) # 如果知道gpu有多少核可以直接指定# 如果只有cpu则以下代码可不执行
# 加载模型到device上
model SimpleLSTM()
model.to(device)# 加载数据到device上
X, y X.to(device), y.to(device)
2.1 网络结构构建 LSTM网络核心的便是网络结构的构建参考网络上有关lstm网络的文章多数都是构建最普遍的网络结构如下
import torch.nn as nnclass SimpleLSTM(nn.Module):def __init__(self, INPUT_SIZE, HIDDEN_SIZE, OUTPUR_SIZE, NUM_LAYERS):super(SimpleLSTM, self).__init__()self.lstm nn.LSTM(INPUT_SIZE, HIDDEN_SIZE, NUM_LAYERS, batch_firstTrue)self.fc nn.Linear(HIDDEN_SIZE, OUTPUR_SIZE)self.sigmoid nn.Sigmoid()def forward(self, X):X, hidden self.lstm(X, None)X self.fc(X[:, -1, :])X self.sigmoid(X)return Xmodel SimpleLSTM(INPUT_SIZE, HIDDEN_SIZE, OUTPUR_SIZE, NUM_LAYERS) 通常这样的结构完全够用了但是为了方便后续能够对网络进行灵活的调整还是将隐藏状态h_0、h_n及单元状态c_0、c_n开放出来构建更加完整的网络结构同时对输入数据进行批标准化处理取消了对输出数据的非线性激活待后续研究后再考虑是否增加该层后续训练及验证都使用以下网络结构
import torch
import torch.nn as nnclass SimpleLSTM(nn.Module):def __init__(self, INPUT_SIZE, HIDDEN_SIZE, OUTPUT_SIZE, NUM_LAYERS):super(SimpleLSTM, self).__init__()self.D 1if BIDIRECT:self.D 2self.h_0 torch.randn(self.D * NUM_LAYERS, BATCH_SIZE, HIDDEN_SIZE)self.c_0 torch.randn(self.D * NUM_LAYERS, BATCH_SIZE, HIDDEN_SIZE)self.h_n torch.zeros(self.D * NUM_LAYERS, BATCH_SIZE, HIDDEN_SIZE)self.c_n torch.zeros(self.D * NUM_LAYERS, BATCH_SIZE, HIDDEN_SIZE)self.lstm nn.LSTM(INPUT_SIZE, HIDDEN_SIZE, NUM_LAYERS, batch_firstBATCH1ST, dropoutDROPOUT, bidirectionalBIDIRECT)self.fc nn.Linear(HIDDEN_SIZE * self.D, OUTPUT_SIZE)self.bn nn.BatchNorm1d(num_featuresWINDOW_SIZE)def forward(self, input_, h_0, c_0):input_ self.bn(input_)x, (h_n, c_n) self.lstm(input_, (h_0, c_0))x self.fc(x)return x, (h_n, c_n)model SimpleLSTM(INPUT_SIZE, HIDDEN_SIZE, OUTPUT_SIZE, NUM_LAYERS)
2.2 参数组合选择
# 定义固定超参其中SHUFFLE、BIDIRECT可不开放出来直接使用默认参数
STOCK_TSCODE 000001.SZ # 平安YH# DATA parameters
TRAIN_SCALE 0.8 # 训练集和测试/验证集比例8:2
WINDOW_SIZE 1000 # DATALOADER parameters
SHUFFLE False # 对于有序的数据每个Epoch不需要打乱
DROP_LAST True # 对于含有初始隐藏状态h_0及初始单元状态c_0的网络将多于的数据舍弃以便能完成训练对于数据形式不规整的数据集可以构建不含有h_0和c_0的网络结构或者修改TRAIN_SCALE比例亦或将测试/验证集的数据量固定使得全部数据得以测试、验证# train patameters
EPOCHS 1 # 只训练一个Epoch
LEARNING_RATE 1e-2
MOMENTUM 0.9# lstm parameters
INPUT_SIZE 1
HIDDEN_SIZE 128
OUTPUT_SIZE 1BATCH1ST True # 将batch_size参数置于首位
BIDIRECT False # 不使用双向网络
# 定义可变超参 LSTM parameters可以通过修改以下参数来调整网络的训练效果注释中提供2~3中参数可供选择
OPTIM_NAME # ADAM、SGD
BATCH_SIZE 64 # 64、320
NUM_LAYERS 2 # 1、2
DROPOUT 0.2 # 0、0.2、0.4
*当SHUFFLETrue时会将时序的数据打乱起到反作用
*当BIDIRECTTrue时会消耗大量内存用cpu跑训练不建议设置为True且对于某些类型的网络并不需要使用双向网络模型故虽然开放该参数但仅给一个拟合结果以作对比见图2.1其余需自行训练 图2.1 BIDIRECTTrue的训练模型拟合验证效果 根据上述可变超参对于同一种网络结构一共可以组成4种属性共24种不同的组合如下表2-1所示
表2-1 参数组合
lstm modelnum_layersbatch_sizedropoutoptim_namelstm(input, (h_0, c_0))1、264、3200、0.2、0.4Adam、SGD 后续所有验证结果图片名称都是以各参数名称及数值来命名的范例如下 lstm_model_BS64_EP1_NL1_DO0_OPADAM_DLTrue_BDFalse | | | | | | | | Epoch | dropout | | bidirectional batch_size | optimizer | num_layers drop_last 三、验证结果展示 下表3-1给出24种参数组合的验证结果这24种验证结果使用的是都只经过一次训练的模型即这些模型只经过一个Epoch的训练不排除经过多次训练后的模型得出的验证效果会和下表呈现出不同的情况
表3-1 24种参数组合验证效果
num_layersbatch_sizedropoutoptim_name拟合效果1640ADAM√1640.2ADAM√1640.4ADAM√13200ADAM×13200.2ADAM×13200.4ADAM×2640ADAM√2640.2ADAM√2640.4ADAM√23200ADAM×23200.2ADAM×23200.4ADAM×1640SGD×1640.2SGD×1640.4SGD×13200SGD×13200.2SGD×13200.4SGD×2640SGD×2640.2SGD×2640.4SGD×23200SGD×23200.2SGD×23200.4SGD×
3.1 优化器ADAMSGD的验证效果情况 从上表可见ADAM比SGD的效果更好这也很符合优化器进化的顺序。在12种优化器是SGD的验证结果中选出效果最好的一种如图3.1所示蓝色点是收盘价橙色线是预测值相差很远这样的结果也很难运用在后面的策略中。但即便这样也不能完全说SGD不好因为只跑了一个回合跑多一些回合效果可能会变好甚至特定时候会超过多回合的ADAM这得需要各位自己试验了。至此后续仅针对ADAM优化器进行讨论。 图3.1 优化器为SGD的训练模型的验证效果 3.2 Batch_Size64320的验证效果情况 从表3-1可见即便优化器是ADAMbatch_size320的效果也没有batch_size64的效果好如图3.2所示欠拟合的情况很明显当然batch_size的选择还要根据机器的性能来设置或许batch_size32的效果比64更好。 图3.2 batch_size为320的训练模型的验证效果 3.3 num_layers1、2和dropout0、0.2、0.4的验证效果情况 剩下的参数组合见图3.3共三行两列6张图左列num_layers1右列2自上而下dropout0、0.2、0.4当lstm只有一层左列波动很大DO0预测值和实际值贴合很近过拟合DO0.2欠拟合情况较为明显而当lstm有两层的时候预测的较大值和较小值均在实际值范围内算是预测较准确的但是局部依旧存在过拟合的情况还达不到制定策略的要求。 图3.3 多种参数组合验证效果对比 至此lstm网络的训练基本完成但过拟合的问题尚未解决且并不能通过控制DROPOUT系数来完全避免后续可以尝试构建更深层的网络结构或尝试使用GRU来看是否有所改善。 相关代码见demo_lstm_model.py同目录下的data文件夹保存了全部24种参数组合的训练模型一个Epochlstm(input, (h_0, c_0))文件夹下保存了“ADAM”和“SGD”共24张验证结果图片。
参考文献
1.基于深度学习的股票预测完整版有代码
2.【python量化】基于backtrader的深度学习模型量化回测框架
3.AI金融利用LSTM预测股票每日最高价