基于LSTM的股票涨跌分析-pytorch

通过输入是个指标对每天的涨跌进行相关预测,实现的准确率达到93%,加入交叉熵进行相关损失函数,尽量减小过拟合现象,但是在参数的最有参数选择的时候,并没有加入最优适应,需要后期进行相关的模型优化,代码如下

import numpy as np<br></br>import pandas as pd<br></br>import matplotlib.pyplot as plt<br></br>import torch<br></br>from torch import nn<br></br>from torch.autograd import Variable<br></br><br></br>data_csv = pd.read_csv('D:/Python/gs/data.csv')<br></br>data_csv = data_csv.dropna(axis=0, how='any')<br></br>data_csv = data_csv.values<br></br><br></br>data_x = data_csv[:, :10].astype('float32')<br></br>data_y = data_csv[:, 10].astype('int32')<br></br>data_x_normed = (data_x - np.min(data_x, axis=0)) / (np.max(data_x, axis=0)-np.min(data_x, axis=0))<br></br>#data_x_normed=(data_x-np.mean(data_x,axis=0))/np.std(data_x,axis=0)<br></br>data_x = np.array(data_x_normed)<br></br>data_y = np.array(data_y)<br></br><br></br>train_size = int(len(data_x) * 0.9)<br></br>test_size = len(data_x) - train_size<br></br><br></br>train_x = data_x[:train_size]<br></br>train_y = data_y[:train_size]<br></br><br></br>test_x = data_x[train_size:]<br></br>test_y = data_y[train_size:]<br></br><br></br>train_x = train_x.reshape(-1, 1, 10)<br></br><br></br>#train_y = train_y.reshape(-1, 1, 1)<br></br>train_x = torch.from_numpy(train_x)<br></br>train_y = torch.from_numpy(train_y)<br></br><br></br><br></br><br></br>class NET(nn.Module):<br></br>    def __init__(self,input_size=10,hidden_size=40,output_size=2,num_layer=2):<br></br>        super(NET,self).__init__()<br></br>        self.rnn=nn.LSTM(input_size,hidden_size,num_layer)<br></br>        self.out=nn.Linear(hidden_size,output_size)<br></br>    def forward(self,x):<br></br>        out,_=self.rnn(x)<br></br>        out=self.out(out[:,-1,:])<br></br>        return out<br></br><br></br><br></br>net = NET()<br></br>optimizer = torch.optim.Adam(net.parameters(), lr=0.08, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)<br></br>loss_func = torch.nn.CrossEntropyLoss()<br></br><br></br>for epoch in range(1000):<br></br>    var_x=Variable(train_x).type(torch.FloatTensor)<br></br>    var_y=Variable(train_y).type(torch.LongTensor)<br></br>    out = net(var_x)<br></br>    loss = loss_func(out, var_y)<br></br>    optimizer.zero_grad()<br></br>    loss.backward()<br></br>    optimizer.step()<br></br>    if (epoch + 1) % 100 == 0:<br></br>        print('Epoch: {}, Loss: {:.5f}'.format(epoch + 1, loss.data.numpy()))<br></br><br></br><br></br><br></br>test_x = test_x.reshape(-1, 1, 10)<br></br>test_x = torch.from_numpy(test_x)<br></br>var_data = Variable(test_x)<br></br>pred_test = net(var_data)<br></br>#pred_test = pred_test.view(-1).data.numpy()<br></br>pred_test=torch.max(pred_test,1)[1].data.numpy().squeeze()<br></br><br></br>plt.plot(pred_test, 'r', label='prediction')<br></br>plt.plot(test_y, 'b', label='real')<br></br>plt.legend(loc='best')<br></br>plt.show()<br></br>print(pred_test,'prediction number')<br></br>print(test_y,'real number')<br></br>j=0<br></br>for i in range(test_size):<br></br>    if(pred_test[i] == test_y[i]):<br></br>        j=j+1;<br></br>j=j/test_size<br></br>print('Identification:',j)<br></br><br></br><br></br><br></br><br></br><br></br><br></br><br></br>

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。