基于深度学习的股票预测(完整版,有代码)_基于深度学习的股票操纵识别研究python代码-程序员宅基地

技术标签: python  lstm  机器学习  深度学习  csv  


在这里插入图片描述

数据获取

采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , 助力智能投资与创新型投资。)
python可以直接使用pip安装tushare

!pip install tushare

Collecting tushare
  Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e748c8e552a92e8f4bdc9f3e0e42c65699efcfee032b/tushare-1.2.62-py3-none-any.whl (214kB)
     |████████████████████████████████| 215kB 6.5MB/s 
Collecting simplejson>=3.16.0
  Downloading https://files.pythonhosted.org/packages/a8/04/377418ac1e530ce2a196b54c6552c018fdf1fe776718053efb1f216bffcd/simplejson-3.17.2-cp37-cp37m-manylinux2010_x86_64.whl (128kB)
     |████████████████████████████████| 133kB 30.0MB/s 
Collecting websocket-client>=0.57.0
  Downloading https://files.pythonhosted.org/packages/85/ee/7aa724dc2dbed9b028f463eada5482770c13b7381a0c79457d12b3b62de2/websocket_client-1.0.1-py2.py3-none-any.whl (68kB)
     |████████████████████████████████| 71kB 9.0MB/s 
Requirement already satisfied: requests>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from tushare) (2.23.0)
Requirement already satisfied: lxml>=3.8.0 in /usr/local/lib/python3.7/dist-packages (from tushare) (4.2.6)
Requirement already satisfied: bs4>=0.0.1 in /usr/local/lib/python3.7/dist-packages (from tushare) (0.0.1)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (2020.12.5)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (2.10)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.0.0->tushare) (1.24.3)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.7/dist-packages (from bs4>=0.0.1->tushare) (4.6.3)
Installing collected packages: simplejson, websocket-client, tushare
Successfully installed simplejson-3.17.2 tushare-1.2.62 websocket-client-1.0.1

在tushare平台进行账号注册,获取自己的接口token码

import tushare as ts
import pandas as pd
import os
import time
import glob

pro = ts.pro_api('your token')
# ----------------------下载某只股票数据------------------- #
# code:股票编码 日期格式:2019-05-21 filename:写到要存放数据的根目录即可如D:\data\
# length是筛选股票长度,默认值为False,既不做筛选,可人为指定长度,如200,既少于200天的股票不保存
def get_stock_data(code, date1, date2, filename, length=-1):
    df = pro.daily(ts_code=code, start_date=date1, end_date=date2)
    df1 = pd.DataFrame(df)
    df1 = df1[['trade_date','open', 'high', 'close', 'low', 'vol', 'pct_chg']]
    df1 = df1.sort_values(by='trade_date')
    print('共有%s天数据' % len(df1))
    if(len(df1)<length):
        path = code+ '.csv'
        df1.to_csv(os.path.join(filename, path))
# ------------------------更新股票数据------------------------ #
# 将股票数据从本地文件的最后日期更新至当日
# filename:具体到文件名如d:\data\000001.csv
def update_stock_data(filename):
    (filepath, tempfilename) = os.path.split(filename)
    (stock_code, extension) = os.path.splitext(tempfilename)
    f = open(filename, 'r')
    df = pd.read_csv(f)
    print('股票{}文件中的最新日期为:{}'.format(stock_code, df.iloc[-1, 1]))
    data_now = time.strftime('%Y%m%d', time.localtime(time.time()))
    print('更新日期至:%s' % data_now)
    nf = pro.daily(ts_code=stock_code, start_date=str(df.iloc[-1, 1]), end_date=data_now)
    nf = nf.sort_values(by='trade_date')
    nf = nf.iloc[1:]
    print('共有%s天数据' % len(nf))
    nf = pd.DataFrame(nf)
    nf = nf[['trade_date','open', 'high', 'close', 'low', 'vol', 'pct_chg']]
    nf.to_csv(filename, mode='a', header=False)
    f.close()
# ------------------------获取股票长度----------------------- #
# 辅助函数
def get_data_len(file_path):
	with open(file_path) as f:
		df = pd.read_csv(f)
		return len(df)
# --------------------------文件合并------------------------- #
# 将多个文件合并为一个文件,在文件末尾添加
# filename是需要合并的文件夹,tfile是存放合并后文件的文件夹
def merge_stock_data(filename, tfile):
	csv_list = glob.glob(filename + '*.csv')
	print(u'共发现%s个CSV文件' % len(csv_list))
	f = open(csv_list[0])
	df = pd.read_csv(f)
	for i in range(1, len(csv_list)):
		f1 = open(csv_list[i], 'rb')
		df1 = pd.read_csv(f1)
		df = pd.concat([df, df1])
	df.to_csv(tfile+'train_mix.csv', index=None)

通过循环的方式获取沪深股票编码从000001SZ-000999SZ的每日线行情
分别存入对应的csv文件中

for i in range(1,1000):
    name='{:0>6d}'.format(i)+'.SZ'
    get_stock_data(name, '20150101', '20210529', '/content/gdrive/MyDrive/代码/股票/data/原始数据//',200)

数据转换

# The data path is at:
name='000995.SZ'
PATH = '/content/gdrive/MyDrive/代码/股票/data/原始数据/'+name+'.csv'
STEP = 60

from torch.utils.data import Dataset, DataLoader

class StockData (Dataset):
    def __init__ (self, path:str, step:int = 30):
        self.path = path
        self.step = step

        data = pd.read_csv(path).values[1:,2:]
        print(len(data))

        self.len = len(data)

        self.y_max = data[:,3].max()
        self.y_min = data[:,3].min()

        # visualise the data
        data = self.normalise(data)+1e-5

        #print(data[:-1,:])
        self.X = torch.tensor(data[:-1,:].astype(np.float32))
        self.y = torch.tensor(data[1:,3].astype(np.float32))

        plt.plot(self.y)
        plt.show()


    def __getitem__ (self, index):
        return self.X[index:index+self.step], self.y[index+self.step]

    def __len__ (self):
        return self.len-1-self.step

    def normalise (self, data):
        data = data.T
        for i in range(len(data)):
            data_min = data[i].min()
            data_max = data[i].max()
            data[i] = (data[i] - data_min) / (data_max - data_min)
        return data.T


stock_data = StockData(path = PATH, step = STEP)
data = DataLoader(dataset = stock_data, batch_size = 5, shuffle = False)
print(len(data))

在这里插入图片描述

LSTM模型搭建

# now let us write a LSTM model
import torch.nn as nn
import torch.nn.functional as F

class Net (nn.Module):
	
	def __init__ (self, input_size = 6, hidden_size = 20, output_size = 1, layers = 3):
		super().__init__()
		self.lstm = nn.LSTM(input_size, hidden_size, layers, batch_first = True, bidirectional = True)
		self.linear = nn.Linear(hidden_size*2, output_size)
		self.function = torch.sigmoid

	def forward(self, X):
		X, hidden = self.lstm(X, None)
		X = X[:,-1,:]
		X = self.linear(X)
		X = self.function(X)
		return X

net = Net()

训练模型

取数据的前80%进行训练

# now Train the model
import torch.optim as op

# LR = 0.01
criteria = nn.MSELoss()
optimiser = op.Adam(net.parameters())
EPCHO = 10


for epcho in range(EPCHO):
	for i, Xy in enumerate (data):

		if i == len(data)*0.8: break

		X = Xy[0]
		y = Xy[1]

		predict = net(X)
		optimiser.zero_grad()
		loss = criteria(predict,y)
		loss.backward()
		optimiser.step()

	print('Epcho: {}.......... loss is {}'.format(epcho,loss))

torch.save(net, '/content/gdrive/MyDrive/代码/股票/model/stock_predict'+name+'.pkl')

预测结果

net = torch.load('/content/gdrive/MyDrive/代码/股票/model/stock_predict'+name+'.pkl')
predict = np.array([])
actual = np.array([])

torch.no_grad() 


for X,y in data:
	predict = np.append(predict, net(X).data[0,0])
	actual = np.append(actual, y.data[0])


plt.plot(predict, label = 'prediction')
plt.plot(actual, label = 'actual')
plt.vlines(len(data)*0.8,0,1,color="red")#竖线
plt.title('stock_predict step = '+ str(STEP))
save_name='/content/gdrive/MyDrive/代码/股票/picture/'+name+'_prediction.png'
plt.legend()
plt.savefig(save_name,dpi = 600)
plt.rcParams['figure.figsize'] = 20, 10
plt.show()

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44368660/article/details/117559640

智能推荐

MFC3 基本对话框的使用(三) 滑块与进度条_setticfreq-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏16次。要求:将滑块与编辑框、进度条相连接。调整滑块位置同时显示滑块当前对应数值,达到设定要求时改变进度条的进度。一、界面设计滑块是slider control,进度条是progress control对于三个滑块,修改属性:对于三个示例编辑框,修改属性:二、添加变量三、初始化滑块和进度条在Dlg.cpp中找到初始化函数BOOL COOPEx3Dlg::OnI..._setticfreq

240320俄罗斯方块java,JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_2-程序员宅基地

文章浏览阅读202次。packagecode;//importjava.awt.*;//importjava.awt.Canvas;//importjava.awt.event.*;//importjavax.swing.*;importjava.util.Random;importjavax.microedition.lcdui.*;//写界面所需要的包/***//***俄罗斯方块*高雷*2007年1..._240×320java游戏

在线电影院售票平台(源码+开题报告)-程序员宅基地

文章浏览阅读779次,点赞14次,收藏19次。然后,实现系统的数据管理和服务功能,包括用户的注册与登录、电影的分类与展示、电影信息的查询与推荐、座位的选择与预订、在线支付与电子票生成等。此外,随着在线视频平台的兴起,越来越多的人选择在线观看电影,这对传统电影院产生了巨大的冲击。研究意义: 开发在线电影院售票平台对于提升用户的观影体验、优化电影院的运营效率、促进电影产业的发展具有重要的意义。该系统旨在通过技术手段解决传统电影院售票中的问题,提供一个集成化的电影信息展示、座位选择、在线支付和用户评价平台,同时也为电影院和电影制作方提供有效的工具。

程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统!_基于c++的即时聊天系统设计-程序员宅基地

文章浏览阅读509次。保护我们剩下的人的通话信息安全,使用TOX可以让你在和家人,朋友,爱人交流时保护你的隐私不受政府无孔不入的的偷窥.关于TOX:其他牛逼的软件因为一些细化服务问你要钱的时候, TOX分文不取 . 你用了TOX, 想干嘛就干嘛.网友评论:项目源码展示:源码测试效果:最后,如果你学C/C++编程有什么不懂的,可以来问问我哦,或许我能够..._基于c++的即时聊天系统设计

linux Java服务swap分区被占用内存泄露问题故障及解决方法_linux swap占用很高-程序员宅基地

文章浏览阅读584次。鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)当Java服务在Linux系统中运行时,可能会出现swap分区被占用的内存泄露问题,导致系统性能下降或者崩溃。下面是该问题的故障及解决方法、底层结构、架构图、工作原理、使用场景详解和实际应用方式、原理详细描述、相关命令使用示例以及文献材料链接。_linux swap占用很高

word中利用宏替换标点标点全角与半角-程序员宅基地

文章浏览阅读662次。Alt+F11,然后插入-模块:复制下面代码到编辑窗口:Sub 半角标点符号转换为全角标点符号()'中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange..._替换半角宏

随便推点

公司个人年终工作总结【10篇】_csdn 公司 年终终结-程序员宅基地

文章浏览阅读1.2k次。公司个人年终工作总结1 20__年即将过去,在公司领导的悉心关怀下和同事们的帮助指导下,结合我自身的努力,在工作、学习等各方面都取得了长足的进步,尤其是在保险理赔专业知识和技能培养方面的成熟,使我成为一名合格的车险查勘定损员。随着工作岗位的调整,我已经成长为为一名能够独立工作、业务熟练的前台工作人员。现将一年来的工作情况向公司领导总结汇报如下: 一、加强理论学习,注重个人素质提高 加强自身业务学习,争做理赔标兵。在日常的工作学习中,我坚持学习更多的保险知识和业务技能,在老同志的“传帮带”下,不断加强个_csdn 公司 年终终结

bitcoin 调试环境搭建-程序员宅基地

文章浏览阅读1.6k次。_bitcoin 调试环境搭建

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)-程序员宅基地

文章浏览阅读4.3k次,点赞93次,收藏94次。为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。本文介绍B样条曲线的基本概念:节点向量、支撑性、次数阶数、加权性质、节点生成算法等,为后续曲线计算打下基础。_样条曲线生成

CDH安装宝典之ClouderaManager_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line -程序员宅基地

文章浏览阅读902次。配置本地repo库下载我的阿里云盘文件文件放置#创建目录mkdir -p /opt/cloudera/parcel-repo/mkdir -p /opt/cloudera/cm/yum install createrepoCDH 6.2.0 的三个文件放到/opt/cloudera/parcel-repo/中,并且注意把sha256后缀的文件名修改为sha#执行createrepo命令生成rpm元数据 最终/opt/cloudera/parcel-repo/会多一个repodata目录_/opt/cloudera/cm-agent/service/mgmt/mgmt.sh: line 76: /usr/java/jdk1.8.0_181

uni.canvasToTempFilePath在app正常,微信小程序报错: fail canvas is empty-程序员宅基地

文章浏览阅读943次,点赞2次,收藏2次。uni.canvasToTempFilePath_uni.canvastotempfilepath

SDRAM笔记_sdram 干扰-程序员宅基地

文章浏览阅读3.1k次。SRAM :静态RAM,不用刷新,速度可以非常快,像CPU内部的cache,都是静态RAM,缺点是一个内存单元需要的晶体管数量多,因而价格昂贵,容量不大。DRAM:动态RAM,需要刷新,容量大。SDRAM:同步动态RAM,需要刷新,速度较快,容量大。DDR SDRAM:双通道同步动态RAM,需要刷新,速度快,容量大。........................_sdram 干扰

推荐文章

热门文章

相关标签