Pytorch实现LSTM对股票进行多步预测

数据

600519.xlsx
输入特征可以根据实际情况进行选择,这里选择的输入为[“收盘价”,“最高价”,“最低价”],对未来的收盘价进行预测。

数据处理


def preprocess_data(data, time_len, rate, seq_len, pre_len):
    train_size = int(time_len * rate)
    train_data = data[0:train_size]
    test_data = data[int(time_len*(rate)):time_len]

    trainX, trainY, valX,valY,testX, testY = [], [], [], [],[],[]
    for i in range(len(train_data) - seq_len - pre_len+1):
        a = train_data[i: i + seq_len + pre_len]
        trainX.append(a[0: seq_len])
        trainY.append(a[seq_len: seq_len + pre_len])

    for i in range(len(test_data) - seq_len - pre_len+1):
        b = test_data[i: i + seq_len + pre_len]
        testX.append(b[0: seq_len])
        testY.append(b[seq_len: seq_len + pre_len])

    trainX1 = np.array(trainX)
    trainY1 = np.array(trainY)
    testX1 = np.array(testX)
    testY1 = np.array(testY)
    return trainX1, trainY1,testX1, testY1

评价指标函数

def metric(pred, label):
    with np.errstate(divide = 'ignore', invalid = 'ignore'):
        mask = np.not_equal(label, 0)
        mask = mask.astype(np.float32)
        mask /= np.mean(mask)
        mae = np.abs(np.subtract(pred, label)).astype(np.float32)
        rmse = np.square(mae)
        mape = np.divide(mae, label)
        mae = np.nan_to_num(mae * mask)
        wape = np.divide(np.sum(mae), np.sum(label))
        mae = np.mean(mae)
        rmse = np.nan_to_num(rmse * mask)
        rmse = np.sqrt(np.mean(rmse))
        mape = np.nan_to_num(mape * mask)
        mape = np.mean(mape)
    return mae, rmse, mape

模型定义

class LSTM(nn.Module):
    def __init__(self,feature):
        super(LSTM, self).__init__()
        self.lstm = nn.LSTM(input_size=feature,hidden_size=8,batch_first=True)
        self.out = nn.Linear(8,1)

    def forward(self,x):

        x,_ = self.lstm(x)
        x = self.out(x[:,-1,:])
        return x

训练

for epoch in range(100):
    loss_all = 0
    for x,y in train_dataloader:
        pre = model(x)
        loss = criterion(pre*std+mean,y)
        loss_all +=loss.item()
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

测试

for x,y in test_dataloader:

    pre = model(x)*std+mean
    pre_list.append(pre.item())
    real_list.append(y.item())

mae, rmse, mape = metric(np.array(pre_list),np.array(real_list))

结果可视化

plt.figure(figsize=(20,8))
plt.plot(range(len(pre_list)),pre_list,color ="red",label ="pre")
plt.plot(range(len(real_list)),real_list,color ="blue",label ="real")
plt.legend()
plt.savefig("res.png")
plt.show()

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度学习的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值