首页 > 其他分享 >学习记录--利用LSTM实现预测时间序列(股票预测)

学习记录--利用LSTM实现预测时间序列(股票预测)

时间:2023-01-01 17:44:20浏览次数:39  
标签:预测 -- torch dataset train close LSTM data size

  • nn.Linear的理解
    nn.Linear是pytorch中线性变换的一个库
    在实际应用中,nn.Linear往往用来初始化矩阵,供神经网络使用。
    image

  • view()方法
    我们经常会用到x.view()方法来进行数据维度的变化
    传入数字-1,自动对维度进行变换
    我们使用-1数字自动计算出了其余的一个维度

  • nn.MSELoss()
    MSE: Mean Squared Error(均方误差)
    image

  • torch.optim.Adam()
    torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用,未来更多精炼的优化算法也将整合进来
    为了使用torch.optim,需先构造一个优化器对象Optimizer,用来保存当前的状态,并能够根据计算得到的梯度来更新参数。

  • model.eval()
    作用等同于 self.train(False)
    简而言之,就是评估模式。而非训练模式。
    在评估模式下,batchNorm层,dropout层等用于优化训练而添加的网络层会被关闭,从而使得评估时不会发生偏移。

点击查看代码
import matplotlib.pyplot as plt
import numpy as np
import tushare as ts
import torch
from torch import nn
import datetime
import time

DAYS_FOR_TRAIN = 10

class LSTM_Regression(nn.Module):
    """
        使用LSTM进行回归

        参数:
        - input_size: feature size
        - hidden_size: number of hidden units
        - output_size: number of output
        - num_layers: layers of LSTM to stack
    """

    def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):
        super().__init__()
#nn.Linear定义一个神经网络的线性层
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, _x):
        x, _ = self.lstm(_x)  # _x is input, size (seq_len, batch, input_size)
        s, b, h = x.shape  # x is output, size (seq_len, batch, hidden_size)
        x = x.view(s * b, h)
        x = self.fc(x)
        x = x.view(s, b, -1)  # 把形状改回来
        return x


def create_dataset(data, days_for_train=5) -> (np.array, np.array):
    """
        根据给定的序列data,生成数据集

        数据集分为输入和输出,每一个输入的长度为days_for_train,每一个输出的长度为1。
        也就是说用days_for_train天的数据,对应下一天的数据。

        若给定序列的长度为d,将输出长度为(d-days_for_train+1)个输入/输出对
    """
    dataset_x, dataset_y = [], []
    for i in range(len(data) - days_for_train):
        _x = data[i:(i + days_for_train)]
        dataset_x.append(_x)
        dataset_y.append(data[i + days_for_train])
    return (np.array(dataset_x), np.array(dataset_y))


if __name__ == '__main__':
    t0 = time.time()
    data_close = ts.get_k_data('000001', start='2019-01-01', index=True)[
        'close'].values  # 取上证指数的收盘价的np.ndarray 而不是pd.Series
    data_close = data_close.astype('float32')  # 转换数据类型
    plt.plot(data_close)
    plt.savefig('data.png', format='png', dpi=200)
    plt.close()

    # 将价格标准化到0~1
    max_value = np.max(data_close)
    min_value = np.min(data_close)
    data_close = (data_close - min_value) / (max_value - min_value)

    dataset_x, dataset_y = create_dataset(data_close, DAYS_FOR_TRAIN)

    # 划分训练集和测试集,70%作为训练集
    train_size = int(len(dataset_x) * 0.7)

    train_x = dataset_x[:train_size]
    train_y = dataset_y[:train_size]

    # 将数据改变形状,RNN 读入的数据维度是 (seq_size, batch_size, feature_size)
    train_x = train_x.reshape(-1, 1, DAYS_FOR_TRAIN)
    train_y = train_y.reshape(-1, 1, 1)

    # 转为pytorch的tensor对象
    train_x = torch.from_numpy(train_x)
    train_y = torch.from_numpy(train_y)

    model = LSTM_Regression(DAYS_FOR_TRAIN, 8, output_size=1, num_layers=2)

    loss_function = nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)

    for i in range(1000):
        out = model(train_x)
        loss = loss_function(out, train_y)

        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
        with open('log.txt', 'a+') as f:
            f.write('{} - {}\n'.format(i + 1, loss.item()))
        if (i + 1) % 1 == 0:
            print('Epoch: {}, Loss:{:.5f}'.format(i + 1, loss.item()))

    model = model.eval() # 转换成测试模式
    # model.load_state_dict(torch.load('model_params.pkl'))  # 读取参数

    # 注意这里用的是全集 模型的输出长度会比原数据少DAYS_FOR_TRAIN 填充使长度相等再作图
    dataset_x = dataset_x.reshape(-1, 1, DAYS_FOR_TRAIN)  # (seq_size, batch_size, feature_size)
    dataset_x = torch.from_numpy(dataset_x)

    pred_test = model(dataset_x) # 全量训练集的模型输出 (seq_size, batch_size, output_size)
    pred_test = pred_test.view(-1).data.numpy()
    pred_test = np.concatenate((np.zeros(DAYS_FOR_TRAIN), pred_test))  # 填充0 使长度相同
    assert len(pred_test) == len(data_close)

    plt.plot(pred_test, 'r', label='prediction')
    plt.plot(data_close, 'b', label='real')
    plt.plot((train_size, train_size), (0, 1), 'g--')  # 分割线 左边是训练数据 右边是测试数据的输出
    plt.legend(loc='best')
    plt.savefig('result.png', format='png', dpi=200)
    plt.close()


标签:预测,--,torch,dataset,train,close,LSTM,data,size
From: https://www.cnblogs.com/xinxuann/p/17018345.html

相关文章

  • centos7磁盘挂载
    一、新磁盘挂载1、查看磁盘#查看磁盘目录情况df-h2、查看挂载磁盘情况fdisk-l#查看设备挂载情况lsblk#默认是树形方式显示3、磁盘分区#分区命令fdisk/dev......
  • 准备知识
    域名什么是域名?网页的地址域名层级划分域名的层级划分是相对于顶级域名有几个“.”而言的顶级域名,如.com//.net//.edu//.gov都属于通用顶级域名二级域名,最靠近顶级域......
  • 48个音标对应的字母
    原文网址:https://zhuanlan.zhihu.com/p/541971023康之源海参1元音:[i:]字母组合eeeaeie[i]发音字母iye[æ]发音字母a[e]字母组合eaea[ə:]字......
  • 程序:运用函数交换两个数据
    注意:是传送地址,才能改变原数据!!!#include<stdio.h>voidswap(int*pa,int*pb){intz=0;z=*pa;*pa=*pb;*pb=z;return0;}intmain(){inta=210;int......
  • Boosting之Adaboost原理
    Boosting之Adaboost原理1Boosting框架  Boosting可以看成多个不同的基分类器的线性加权和的形式,那么自然需要知道每个基分类器及其对应的权重,具体的算法逻辑见下图。 ......
  • 方法
    方法packagefunction;publicclassDemo1{publicstaticvoidmain(String[]args){inta=add(1,2);System.out.println(a);S......
  • linux 中特殊字符 M-BM-的处理
     001、[root@PC1test]#lstest.txt[root@PC1test]#cattest.txt##测试数据AbpinkJnzoarBizxar Abcd[root@PC1test]#cat-Atest.tx......
  • 机器学习技法---(Week2)Dual Support Vector Machine
      上节课把原始的优化问题改写成二次规划的形式,通过软件包来求解参数。这节课通过研究原问题的对偶问题,在一定条件下,对偶问题的最优解和解参数和原问题一致,继而得到原问题......
  • mongodb的aggregate聚合操作详解
    ################################### 在工作中会经常遇到一些mongodb的聚合操作,特此总结下。mongo存储的可以是复杂类型,比如数组、对象等mysql不善于处理的文档型结构,并且......
  • DDL的数据库操作和表操作
    SQL分类分类全称说明DDLdatadefinitionlanguage数据定义语言,用来定义数据库对象(数据库,表,字段)DMLdatamanipulationlanguage数据操作语言,用来对数据库的数......