利用Mindspore 深度学习框架和LSTM实现股票预测模型
本文记录了笔者利用和学习mindspore深度学习框架的实践项目。根据给出的股票时序信息,分别搭建了MLP模型和LSTM模型实现股票预测,在最后的结果产出上,可以明显看出LSTM捕捉前后文时序信息的优势所在。
在本次实践中,代码运行环境为python3.7.10,数据集为几支股票在2017.4.03-2017.9.01期间的价格变化,至于相关的函数库如numpy不一一赘述。
读入数据后,名为SP500的股票图像如下:
接下来,做一些简单的数据集划分工作和格式转换,比如我们需要把numpy的数组数据转换为mindspore中的Tensor格式。
# train : test = 0.8 : 0.2
data.drop('DATE', axis=1, inplace=True)
data_train = data.iloc[:int(data.shape[0] * 0.8), :]
data_test = data.iloc[int(data.shape[0] * 0.8):, :]
print('training data shape:', data_train.shape)
print('test data shape', data_test.shape)
# scale data into the range for -1 to 1
import mindspore.nn as nn
from mindspore import Tensor, Parameter,ParameterTuple
from mindspore.common.initializer import TruncatedNormal
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler.fit(data_train)
data_train = scaler.transform(data_train)
data_test = scaler.transform(data_test)
x_train = data_train[:, 1:]
y_train = data_train[:, 0]
x_test = data_test[:, 1:]
y_test = data_test[:, 0]
x_train = Tensor(x_train.astype(np.float32))
y_train = Tensor(y_train.astype(np.float32))
x_test = Tensor(x_test.astype(np.float32))
y_test = Tensor(y_test.astype(np.float32))
这样子后,就可以正式加载模型了!
首先用五层全连接网络看一下预测效果,激活函数为relu,网络代码如下所示,此处的nn调用的mindspore.nn,可以看出来mindspore与pytorch还是比较相似的。
class MLP(nn.Cell):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Dense(500,1024)
self.act = nn.ReLU()
self.fc2 = nn.Dense(1024,512)
self.fc3 = nn.Dense(512,256)
self.fc4 = nn.Dense(256,128)
self.fc5 = nn.Dense(128,1)
self.weight = Parameter(Tensor(np.random.randn(1, 1).astype(np.float32)), name="weight")
self.bias = Parameter(Tensor(np.random.randn(1).astype(np.float32)), name="bias")
def forward(self, x):
out = self.fc1(x)
out = self.act(out)
out = self.fc2(out)
out = self.act(out)
out = self.fc3(out)
out = self.act(out)
out = self.fc4(out)
out = self.act(out)
out = self.fc5(out)
return out
import mindspore.nn as nn
import mindspore.ops.operations as P
from mindspore import Model, context, Tensor
from mindspore.nn.loss import MSELoss
# Define the optimizer and loss function
optimizer = nn.Adam(params=model.trainable_params(), learning_rate=0.001)
loss_fn = MSELoss()
# Create a Model object
model = Model(model, loss_fn=loss_fn, optimizer=optimizer)
训练过程中,损失函数使用MSEloss,损失函数和adam优化器等也已经在mindspore框架中打包好了,经过10个epoch的训练,效果大致如下:
这里大体趋势是一致的,但是离我们希望的股票预测还是有较大差距()
接下来上我们的LSTM,可以看到很经典的一张RNN与LSTM对比图
RNN和LSTM都可以将前面时间步的信息储存下来影响后面的时间步,但RNN会将以前所有时间步的信息一视同仁地对待,同时存在梯度爆炸现象,在长时间序列信息表现不好,而LSTM引入了遗忘门和隐传递状态,概括的说,隐传递状态相较RNN中也有的显式传播状态改变得更慢,从而使得它可以捕捉长时间序列信息;而遗忘门则决定“记住”哪些信息,它会根据训练结果学习上一时间步状态哪些信息应该保留,哪些信息可以舍弃,从而在训练过程中动态地调整自己想要关注的时序信息。
从上文大家也可以读出来了,LSTM非常适用于股票预测这种长时间序列任务。以下是基于minspore框架的LSTM代码及超参:
import mindspore as ms
import mindspore.nn as nn
from mindspore.common.initializer import Normal
seq_len = 5
hidden_size = 128
output_dim = 1
batch_size = 256
learning_rate = 0.0001
class LSTM(nn.Cell):
def __init__(self):
super(LSTM, self).__init__()
self.lstm = nn.LSTM(input_size=501, hidden_size=hidden_size, has_bias=True, bidirectional=False)
self.fc = nn.Dense(hidden_size, output_dim, weight_init=Normal(0.02))
self.relu = nn.ReLU()
def construct(self, x):
x, _ = self.lstm(x)
x = x[:, -1, :]
x = self.fc(x)
return x
class Loss(nn.Cell):
def __init__(self):
super(Loss, self).__init__()
self.loss = nn.loss.MSELoss()
def construct(self, pred, label):
return self.loss(pred, label)
myloss = Loss()
lstm_model = LSTM()
lstm_opt = nn.optim.Adam(lstm_model.trainable_params(), learning_rate=learning_rate)
lstm_model = Model(lstm_model, loss_fn=myloss, optimizer=lstm_opt)
经过20个epoch的训练,我们得到了以下结果:
虽然和实际值还是有一些差异,但从效果来看比简单的MLP确实好上不少了。
本次实践项目可以作为参考,来大致了解和学习Mindspore深度学习框架,Mindspore框架便捷易上手,相关的功能库也打包的很齐全,是值得深入学习和运用的深度学习框架。项目中代码仅仅实现了非常基础和简单的功能,如今用到LSTM的任务中基本上都会用到双向LSTM以捕捉上下文信息,同时也有更多的新模型,如利用注意力机制的grid-LSTM。当然,随机过程告诉我们股票交易是一个鞅过程(😀),所以实现真正意义的股票预测是多么强大的LSTM也无法真正实现的,不过股票交易的历史数据确实为我们提供了丰富的大数据和机器学习素材。这篇博客到这里也该结束了,期待着下次再会!
- 点赞
- 收藏
- 关注作者
评论(0)