基于LSTM进行股票趋势预测(tushare)

注:
本文章仅用于算法&工具学习与使用,不具有任何投资建议。

前言:
笔者最近在研究时序趋势预测,而股票天然具有时序性,故使用某一股票数据进行学习。下面将使用代码预测一只股票的每日最高价,当然也可以用于每日开盘价、最低价、收盘价等价格。


1、准备:

1.1 数据源:tushare

我们做股票数据分析的时候,经常遇到没有数据源。但是通过tushare很方便,只需要简单的注册,然后就可以调用tushare pro的接口。
注册地址:https://tushare.pro/register?reg=491338

具体使用方式可以参考下文链接:
https://tushare.pro/document/1?doc_id=37

1.2 算法知识:lstm

https://www.jianshu.com/p/9dc9f41f0b29
https://colah.github.io/posts/2015-08-Understanding-LSTMs/

下面展示通过历史数据,预测下一日股票最高值。
直接上代码,只需要把代码中的token替换为你自己账号的token即可:

2、代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : lstm_trend.py
import datetimeimport tushare as ts
import numpy as np
import torch
from torch import nnimport matplotlib.pyplot as pltdef run_train_lstm():inp_dim = 4out_dim = 1mid_dim = 8mid_layers = 1batch_size = 12 * 12mod_dir = '.''''load data'''data, mean, std = load_data()sink_mean_std('mean_std.txt', [mean, std])data_x = data[:-1, :]data_y = data[+1:, -1]assert data_x.shape[1] == inp_dimtrain_size = int(len(data_x) * 0.75)train_x = data_x[:train_size]train_y = data_y[:train_size]train_x = train_x.reshape((train_size, inp_dim))train_y = train_y.reshape((train_size, out_dim))'''build model'''device = torch.device("cuda" if torch.cuda.is_available() else "cpu")net = RegLSTM(inp_dim, out_dim, mid_dim, mid_layers).to(device)criterion = nn.MSELoss()optimizer = torch.optim.Adam(net.parameters(), lr=0.6e-2)'''train'''var_x = torch.tensor(train_x, dtype=torch.float32, device=device)var_y = torch.tensor(train_y, dtype=torch.float32, device=device)batch_var_x = list()batch_var_y = list()for i in range(batch_size):j = train_size - ibatch_var_x.append(var_x[j:])batch_var_y.append(var_y[j:])from torch.nn.utils.rnn import pad_sequencebatch_var_x = pad_sequence(batch_var_x)batch_var_y = pad_sequence(batch_var_y)with torch.no_grad():weights = np.tanh(np.arange(len(train_y)) * (np.e / len(train_y)))weights = torch.tensor(weights, dtype=torch.float32, device=device)print("Training Start")for e in range(384):# for e in range(480):out = net(batch_var_x)# loss = criterion(out, batch_var_y)loss = (out - batch_var_y) ** 2 * weightsloss = loss.mean()optimizer.zero_grad()loss.backward()optimizer.step()if e % 60 == 0:print('Epoch: {:4}, Loss: {:.5f}'.format(e, loss.item()))torch.save(net.state_dict(), '{}/net.pth'.format(mod_dir))print("Save in:", '{}/net.pth'.format(mod_dir))'''eval'''net.load_state_dict(torch.load('{}/net.pth'.format(mod_dir), map_location=lambda storage, loc: storage))net = net.eval()test_x = data_x.copy()test_x[train_size:, 0] = 0test_x = test_x[:, np.newaxis, :]test_x = torch.tensor(test_x, dtype=torch.float32, device=device)'''simple way but no elegant'''# for i in range(train_size, len(data) - 2):#     test_y = net(test_x[:i])#     test_x[i, 0, 0] = test_y[-1]'''elegant way but slightly complicated'''eval_size = 1zero_ten = torch.zeros((mid_layers, eval_size, mid_dim), dtype=torch.float32, device=device)test_y, hc = net.output_y_hc(test_x[:train_size], (zero_ten, zero_ten))test_x[train_size + 1, 0, 0] = test_y[-1]for i in range(train_size + 1, len(data) - 2):test_y, hc = net.output_y_hc(test_x[i:i + 1], hc)test_x[i + 1, 0, 0] = test_y[-1]pred_y = test_x[1:, 0, 0]pred_y = pred_y.cpu().data.numpy()diff_y = pred_y[train_size:] - data_y[train_size:-1]l1_loss = np.mean(np.abs(diff_y))l2_loss = np.mean(diff_y ** 2)print("L1: {:.3f}    L2: {:.3f}".format(l1_loss, l2_loss))plt.plot(pred_y, 'r', label='pred')plt.plot(data_y, 'b', label='real', alpha=0.3)plt.plot([train_size, train_size], [-1, 2], color='k', label='train | pred')plt.legend(loc='best')tc = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d')plt.savefig(f'pics/lstm_reg_{tc}.png')plt.pause(4)class RegLSTM(nn.Module):def __init__(self, inp_dim, out_dim, mid_dim, mid_layers):super(RegLSTM, self).__init__()self.rnn = nn.LSTM(inp_dim, mid_dim, mid_layers)  # rnnself.reg = nn.Sequential(nn.Linear(mid_dim, mid_dim),nn.Tanh(),nn.Linear(mid_dim, out_dim),)  # regressiondef forward(self, x):y = self.rnn(x)[0]  # y, (h, c) = self.rnn(x)seq_len, batch_size, hid_dim = y.shapey = y.view(-1, hid_dim)y = self.reg(y)y = y.view(seq_len, batch_size, -1)return ydef output_y_hc(self, x, hc):y, hc = self.rnn(x, hc)  # y, (h, c) = self.rnn(x)seq_len, batch_size, hid_dim = y.size()y = y.view(-1, hid_dim)y = self.reg(y)y = y.view(seq_len, batch_size, -1)return y, hcclass RegGRU(nn.Module):def __init__(self, inp_dim, out_dim, mod_dim, mid_layers):super(RegGRU, self).__init__()self.rnn = nn.GRU(inp_dim, mod_dim, mid_layers)self.reg = nn.Linear(mod_dim, out_dim)def forward(self, x):x, h = self.rnn(x)  # (seq, batch, hidden)seq_len, batch_size, hid_dim = x.shapex = x.view(-1, hid_dim)x = self.reg(x)x = x.view(seq_len, batch_size, -1)return xdef output_y_h(self, x, h):y, h = self.rnn(x, h)seq_len, batch_size, hid_dim = y.size()y = y.view(-1, hid_dim)y = self.reg(y)y = y.view(seq_len, batch_size, -1)return y, hdef sink_mean_std(file, mean_std):with open(file, 'w') as af:for stock in mean_std:af.write(str(stock) + '\n')def load_data():ts.set_token('xxxxx')  # set your token heresq = ts.pro_bar(ts_code='600519.SH', start_date='20210101', end_date='20220211')[['open', 'close', 'low', 'high']]np_sq = sq.values[::-1]# normalizationseq = (np_sq - np_sq.mean(axis=0)) / np_sq.std(axis=0)return seq, np_sq.mean(axis=0), np_sq.std(axis=0)if __name__ == '__main__':run_train_lstm()

结果如下:
在这里插入图片描述
因为股票的涨幅本身就有±10%的限制,所以看起来好像预测的挺准的,然后实际股价的变化并不能根据历史数据简单推算,仅用作简单学习使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8629.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python预测股票走势

最新代码:股票预测配套代码(jupyter版)-机器学习文档类资源-CSDN下载 视频:基于python进行股票趋势预测_哔哩哔哩_bilibili Python的功能可谓相当强大,在很多行业具有相当的优势,这种优势很大程度上来源于各种第三方库。本文介绍…

使用python对股票数据分析预测

安装quandl 安装Pandas_Datareader 1、获取数据 import Pandas_Datareader.data as web import datetime startdatetime.datetime(2018,1,1) enddatetime.datetime.now() SZ000001web.DataReader(000001.SZ,yahoo,start,end) 可以获取最高价,最低价&#xf…

使用新闻预测股票走势-----Kaggle经典ph.D操作分析

General information Two Sigma金融新闻竞赛是一项独特的竞赛:不仅仅是内核竞争,而且我们不应该下载数据,在第二阶段,我们的解决方案将用于预测未来的真实数据。 我将尝试为本次比赛进行广泛的EDA,并尝试找到一些有关…

tushare单个股票过去五年的数据整理与预测

文章目录 前言:1. 导入相关包2. 数据预处理3. 构建模型3. 模型训练4. 检查数据6. 工作中其他常用包记录 前言: %md 在量化投资中,计算收益率是更常见的做法,而不是仅计算股价。计算收益率可以更好地反映投资的回报情况&#xff0c…

使用chatSonic代替chatGPT实现代码智能编写与应答

WriteSonic地址 WriteSonic—其中,提供chatSonic功能app. 注册 使用google账户登录即可. 界面 登录后的界面](https://img-blog.csdnimg.cn/bff0283f8b5f43dd8483caef62784b37.png) 使用 点击上图中的chatSonic链接. 问答窗口 测试智能编码 在文本框中输入…

有了ChatGPT 微软对元宇宙不香了?

押注ChatGPT是微软最近的主要发力点,另一边,它开始向元宇宙业务挥出裁员“大刀”。海外消息称,微软解散了成立仅四个月的工业元宇宙团队,约100名员工被全被解雇。 这只是微软放缓元宇宙战略的长尾动作,此前&#xff0…

ChatGPT 之父推出加密货币钱包;Intel 被曝预算砍掉 10%、裁员 20%;Firefox 113 发布|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

阿里版ChatGPT突然上线邀测!大模型热战正剧开始,这是第一手体验实录

阿里正式加入ChatGPT战局! 就在刚刚,阿里版类ChatGPT突然官宣正式对外开放企业邀测。 它叫通义千问,由达摩院开发。 嗯,是大模型版十万个为什么那个味儿了。 事实上,早在这个月初,就传出过不少阿里要推出…

python 调试大法

说在前面 我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说 一、抛出异常 可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except 语句 raise…

获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)

知乎原文获得北大新材料学院夏令营offer的艰难历程(附面试答辩PPT) - 知乎 视频版 05:27 获得北大新材料学院夏令营offer的艰险历程 科大云炬 的视频 698 播放 文字版 相继6月15日以来北大、清华、浙大、西交、复旦、大连理工等10几个夏令营被拒后,我被打击得渐…

概率图模型 - 学习笔记

文章目录 教材与公开课视频概率图模型例子如何理解BP算法?概率图模型相比有监督学习的优势 教材与公开课视频 国外经典教材 英文版:Probabilistic Graphical Models: Principles and Techniques中文版:《概率图模型:原理与技术》…

从文本创建艺术,AI图像生成器的数据集是如何构建的

AIGC系列分享是整数智能推出的一个全新分享系列,在这个系列中,我们将介绍与AIGC概念相关的有趣内容。AIGC系列主要分为以下几篇文章: 被称为下一代风口的AIGC到底是什么? AIGC的数据集构建方案分享系列 从文本创建艺术&#xff0c…

【軟體架構師如何煉成?硬功夫軟技能點滿技能樹】

軟體架構師如何煉成?硬功夫軟技能點滿技能樹 協助企業資訊系統轉型,架構師擔任關鍵角色如何成為軟體架構師技術領域硬技能職場領域軟技能結語 協助企業資訊系統轉型,架構師擔任關鍵角色 「人無遠慮,必有近憂」,套用到…

巧用提示语,说说话就能做个聊天机器人

你好,我是徐文浩。 这一讲,我们来看看Open AI提供的Completion这个API接口。相信已经有不少人试过和ChatGPT聊天了,也有过非常惊艳的体验,特别是让ChatGPT帮我们写各种材料。那么,我们不妨也从这样一个需求开始吧。 …

量化选股——基于动量因子的行业风格轮动策略(第1部分—因子测算)

文章目录 动量因子与行业轮动概述动量因子的理解投资视角下的行业轮动现象投资者视角与奈特不确定性 动量因子在行业风格上的效果测算动量因子效果测算流程概述1. 行业选择:申万一级行业2. 动量因子选择:阿隆指标(Aroon)3. 测算方…

苹果微软等科技巨头紧急叫停,chatgpt翻车了?(文末附联名信)

一、千名大佬集体叫停GPT研发 3月29日,一封联名信刷爆了各大媒体热榜,上面有一千多位大佬签名,其中包括埃隆马斯克、约书亚本吉奥(Yoshua Bengio,2018年图灵奖获得者)和史蒂夫沃兹尼亚克(Steve…

免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心

新智元报道 编辑:Aeneas 【新智元导读】一位网友花费一周,用从ChatGPT生成的prompt,在Midjourney中生成了一千多张精彩的作品。 Midjourney虽然功能神奇,但在prompt能力平平的人手里,它并不能绽放自己的魔力。 国外的…

ChatGPT专业应用:生成各类通知

正文共 821 字,阅读大约需要 3 分钟 游戏/用户运营等必备技巧,您将在3分钟后获得以下超能力: 生成各类通知 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | nanako 编辑者 | Linda ●…

ChatGPT Plus停售 留出防治AI风险空窗期

能体验GPT-4模型的ChatGPT,因需求量太大而暂停了升级为Plus的功能,算力似乎爆表了。 这下,有钱都没地儿充会员了,用户们暂时需要回到“GPT-3.5时代”。这或许留给人类一个空窗期,可以好好思考一下前段时间上千名科技精…

【重制版】10分钟学会WINDOWS、MAC、LINUX如何安装GPT桌面版

文章目录 1 前言2 Windows版下载安装2.1 安装包2.2 winget下载 (注意看,不是wget!) 3 Mac版下载安装3.1 安装包3.2 homebrew安装 4 Linux版下载安装4.1 安装包4.2 终端下载 5 特点5.1 软件特点5.2 菜单功能(个人喜好特…