前言
本文使用pytorch实现,根据历史股票的open,low,close,high数据预测未来股票的变化趋势。
数据样式

模型
模型部分实验了几种不同的attention对整体效果的影响:
- CNN + LSTM
- CNN + LSTM + ECA
- CNN + LSTM + SE(channal维度的attention)
- CNN + LSTM + HW(长宽维度的Attention,不知道叫啥就叫这个吧)
- CNN + LSTM + CBAM(长宽以及channal维度同时attention)
Base模型代码
代码比较简单,模型就几行,主要网上都是tf的,我是真不喜欢用tf就用pytorch改写了一份…
class CNNLSTMModel(nn.Module):
def __init__(self, window=5, dim=4, lstm_units=16, num_layers=2):
super(CNNLSTMModel, self).__init__()
self.conv1d = nn.Conv1d(dim, lstm_units, 1)
self.act1 = nn.Sigmoid()
self.maxPool = nn.MaxPool1d(kernel_size=window)
self.drop = nn.Dropout(p=0.01)
self.lstm = nn.LSTM(lstm_units, lstm_units, batch_first=True, num_layers=1, bidirectional=True)
self.act2 = nn.Tanh()
self.cls = nn.Linear(lstm_units * 2, 1)
self.act4 = nn.Tanh()
def forward(self, x):
x = x.transpose(-1, -2)
x = self.conv1d(x)
x = self.act1(x)
x = self.maxPool(x)
x = self.drop(x)
x = x.transpose(-1, -2)
x, (_, _) = self.lstm(x)
x = self.act2(x)
x = x.squeeze(dim=1)
x = self.cls(x)
x = self.act4(x)
return x
实验结果
模型 | MSE |
---|
CNN + LSTM | 0.00011371035229372369 | CNN + LSTM + ECA | 0.0001245921911587092 | CNN + LSTM + SE | 0.00009550479312152179 | CNN + LSTM + HW | 0.00041322291971565306 | CNN + LSTM + CBAM | 0.0003162174993617968 |
拟合结果
    
总结
实验结果就加SE的attention是正向的,然后其实还是有很多可以优化的地方,可以明显看到数据的尖刺比较多,因为这种回归的任务容易过拟合样本多的区间,就比如一百个样本99个分数是85,一个分数是20,那么模型几乎不会有输出20的分数的能力,这就是回归经常碰到的问题,所以有一些突变也可以理解。其实加一些滑动平均就可以把这些毛刺过滤了。
后续优化
- 加transformer来处理序列特征,transformer已经被证明在处理序列信息的能力远超过LSTM了。
- 加滑动平均过滤噪声
心情好再写写玩玩吧,想学学量化相关的知识了,互联网…哎一言难尽啊
|