毕设项目分享 基于大数据分析的股票预测系统

文章目录

  • 0 前言
  • 1 课题意义
    • 1.1 股票预测主流方法
  • 2 什么是LSTM
    • 2.1 循环神经网络
    • 2.1 LSTM诞生
  • 2 如何用LSTM做股票预测
    • 2.1 算法构建流程
    • 2.2 部分代码
  • 3 实现效果
    • 3.1 数据
    • 3.2 预测结果
        • 项目运行展示
        • 开发环境
        • 数据获取

0 前言

今天学向大家介绍一个基于深度学习的毕业设计项目,LSTM股票预测,这是个非常不错的毕设课题。

毕设帮助,开题指导,资料分享,疑问解答(见文末)

🧿选题指导, 项目分享:见文末


1 课题意义

利用神经网络模型如果能够提高对股票价格的预测精度,更好地掌握股票价格发展趋势,这对于投资者来说可以及时制定相应的发展策略,更好地应对未来发生的不确定性事件,对于个人来说可以降低投资风险,减少财产损失,实现高效投资,具有一定的实践价值。

1.1 股票预测主流方法

股票市场复杂、非线性的特点使我们难以捉摸其变化规律,目前有很多预测股票走势的论文和算法。

定量分析从精确的数据资料中获得股票发展的价值规律,通过建立模型利用数学语言对股市的发展情况做出解释与预测。

目前常用的定量分析方法有:

  • 传统时间序列预测模型
  • 马尔可夫链预测
  • 灰色系统理论预测
  • 遗传算法
  • 机器学习预测等方法

2 什么是LSTM

LSTM是长短期记忆网络(LSTM,Long Short-Term Memory),想要理解什么是LSTM,首先要了解什么是循环神经网络。

2.1 循环神经网络

对于传统的BP神经网络如深度前馈网络、卷积神经网络来说,同层及跨层之间的神经元是独立的,但实际应用中对于一些有上下联系的序列来说,如果能够学习到它们之间的相互关系,使网络能够对不同时刻的输入序列产生一定的联系,像生物的大脑一样有“记忆功能”,这样的话我们的模型也就会有更低的训练出错频率及更好的泛化能力。

JordanMI提出序列理论,描述了一种体现“并行分布式处理”的网络动态系统,适用于语音生成中的协同发音问题,并进行了相关仿真实验,ElmanJL认为连接主义模型中对时间如何表示是至关重要的,1990年他提出使用循环连接为网络提供动态内存,从相对简单的异或问题到探寻单词的语义特征,网络均学习到了有趣的内部表示,网络还将任务需求和内存需求结合在一起,由此形成了简单循环网络的基础框架。

循环神经网络(RNN)之间的神经元是相互连接的,不仅在层与层之间的神经元建立连接,而且每一层之间的神经元也建立了连接,隐藏层神经元的输入由当前输入和上一时刻隐藏层神经元的输出共同决定,每一时刻的隐藏层神经元记住了上一时刻隐藏层神经元的输出,相当于对网络增添了“记忆”功能。我们都知道在输入序列中不可避免会出现重复或相似的某些序列信息,我们希望RNN能够保留这些记忆信息便于再次调用,且RNN结构中不同时刻参数是共享的,这一优点便于网络在不同位置依旧能将该重复信息识别出来,这样一来模型的泛化能力自然有所上升。

RNN结构如下:

2.1 LSTM诞生

RNN在解决长序列问题时未能有良好的建模效果,存在长期依赖的弊端,对此HochreiterS等人对神经单元做出了改进,引入自循环使梯度信息得以长时间持续流动,即模型可以拥有长期记忆信息,且自循环权重可以根据前后信息进行调整并不是固定的。作为RNN的一种特殊结构,它可以根据前后输入情况决定历史信息的去留,增进的门控机制可以动态改变累积的时间尺度进而控制神经单元的信息流,这样神经网络便能够自己根据情况决定清除或保留旧的信息,不至于状态信息过长造成网络崩溃,这便是长短期记忆(LSTM)网络。随着信息不断流入,该模型每个神经元内部的遗忘门、输入门、输出门三个门控机制会对每一时刻的信息做出判断并及时进行调整更新,LSTM模型现已广泛应用于无约束手写识别、语音识别、机器翻译等领域。

2 如何用LSTM做股票预测

2.1 算法构建流程

2.2 部分代码

importnumpyasnpimportmatplotlib.pyplotaspltimporttensorflowastfimportpandasaspdimportmathdefLSTMtest(data):n1=len(data[0])-1#因为最后一位为labeln2=len(data)print(n1,n2)# 设置常量input_size=n1# 输入神经元个数rnn_unit=10# LSTM单元(一层神经网络)中的中神经元的个数lstm_layers=7# LSTM单元个数output_size=1# 输出神经元个数(预测值)lr=0.0006# 学习率train_end_index=math.floor(n2*0.9)# 向下取整print('train_end_index',train_end_index)# 前90%数据作为训练集,后10%作为测试集# 获取训练集# time_step 时间步,batch_size 每一批次训练多少个样例defget_train_data(batch_size=60,time_step=20,train_begin=0,train_end=train_end_index):batch_index=[]data_train=data[train_begin:train_end]normalized_train_data=(data_train-np.mean(data_train,axis=0))/np.std(data_train,axis=0)# 标准化train_x,train_y=[],[]# 训练集foriinrange(len(normalized_train_data)-time_step):ifi%batch_size==0:# 开始位置batch_index.append(i)# 一次取time_step行数据# x存储输入维度(不包括label) :X(最后一个不取)# 标准化(归一化)x=normalized_train_data[i:i+time_step,:n1]# y存储labely=normalized_train_data[i:i+time_step,n1,np.newaxis]# np.newaxis分别是在行或列上增加维度train_x.append(x.tolist())train_y.append(y.tolist())# 结束位置batch_index.append((len(normalized_train_data)-time_step))print('batch_index',batch_index)# print('train_x', train_x)# print('train_y', train_y)returnbatch_index,train_x,train_y# 获取测试集defget_test_data(time_step=20,test_begin=train_end_index+1):data_test=data[test_begin:]mean=np.mean(data_test,axis=0)std=np.std(data_test,axis=0)# 矩阵标准差# 标准化(归一化)normalized_test_data=(data_test-np.mean(data_test,axis=0))/np.std(data_test,axis=0)# " // "表示整数除法。有size个sampletest_size=(len(normalized_test_data)+time_step-1)//time_stepprint('test_size$$$$$$$$$$$$$$',test_size)test_x,test_y=[],[]foriinrange(test_size-1):x=normalized_test_data[i*time_step:(i+1)*time_step,:n1]y=normalized_test_data[i*time_step:(i+1)*time_step,n1]test_x.append(x.tolist())test_y.extend(y)test_x.append((normalized_test_data[(i+1)*time_step:,:n1]).tolist())test_y.extend((normalized_test_data[(i+1)*time_step:,n1]).tolist())returnmean,std,test_x,test_y# ——————————————————定义神经网络变量——————————————————# 输入层、输出层权重、偏置、dropout参数# 随机产生 w,bweights={'in':tf.Variable(tf.random_normal([input_size,rnn_unit])),'out':tf.Variable(tf.random_normal([rnn_unit,1]))}biases={'in':tf.Variable(tf.constant(0.1,shape=[rnn_unit,])),'out':tf.Variable(tf.constant(0.1,shape=[1,]))}keep_prob=tf.placeholder(tf.float32,name='keep_prob')# dropout 防止过拟合# ——————————————————定义神经网络——————————————————deflstmCell():# basicLstm单元# tf.nn.rnn_cell.BasicLSTMCell(self, num_units, forget_bias=1.0,# tate_is_tuple=True, activation=None, reuse=None, name=None)# num_units:int类型,LSTM单元(一层神经网络)中的中神经元的个数,和前馈神经网络中隐含层神经元个数意思相同# forget_bias:float类型,偏置增加了忘记门。从CudnnLSTM训练的检查点(checkpoin)恢复时,必须手动设置为0.0。# state_is_tuple:如果为True,则接受和返回的状态是c_state和m_state的2-tuple;如果为False,则他们沿着列轴连接。后一种即将被弃用。# (LSTM会保留两个state,也就是主线的state(c_state),和分线的state(m_state),会包含在元组(tuple)里边# state_is_tuple=True就是判定生成的是否为一个元组)# 初始化的 c 和 a 都是zero_state 也就是都为list[]的zero,这是参数state_is_tuple的情况下# 初始state,全部为0,慢慢的累加记忆# activation:内部状态的激活函数。默认为tanh# reuse:布尔类型,描述是否在现有范围中重用变量。如果不为True,并且现有范围已经具有给定变量,则会引发错误。# name:String类型,层的名称。具有相同名称的层将共享权重,但为了避免错误,在这种情况下需要reuse=True.#basicLstm=tf.nn.rnn_cell.BasicLSTMCell(rnn_unit,forget_bias=1.0,state_is_tuple=True)# dropout 未使用drop=tf.nn.rnn_cell.DropoutWrapper(basicLstm,output_keep_prob=keep_prob)returnbasicLstmdeflstm(X):# 参数:输入网络批次数目batch_size=tf.shape(X)[0]time_step=tf.shape(X)[1]w_in=weights['in']b_in=biases['in']# 忘记门(输入门)# 因为要进行矩阵乘法,所以reshape# 需要将tensor转成2维进行计算input=tf.reshape(X,[-1,input_size])input_rnn=tf.matmul(input,w_in)+b_in# 将tensor转成3维,计算后的结果作为忘记门的输入input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit])print('input_rnn',input_rnn)# 更新门# 构建多层的lstmcell=tf.nn.rnn_cell.MultiRNNCell([lstmCell()foriinrange(lstm_layers)])init_state=cell.zero_state(batch_size,dtype=tf.float32)# 输出门w_out=weights['out']b_out=biases['out']# output_rnn是最后一层每个step的输出,final_states是每一层的最后那个step的输出output_rnn,final_states=tf.nn.dynamic_rnn(cell,input_rnn,initial_state=init_state,dtype=tf.float32)output=tf.reshape(output_rnn,[-1,rnn_unit])# 输出值,同时作为下一层输入门的输入pred=tf.matmul(output,w_out)+b_outreturnpred,final_states# ————————————————训练模型————————————————————deftrain_lstm(batch_size=60,time_step=20,train_begin=0,train_end=train_end_index):# 于是就有了tf.placeholder,# 我们每次可以将 一个minibatch传入到x = tf.placeholder(tf.float32,[None,32])上,# 下一次传入的x都替换掉上一次传入的x,# 这样就对于所有传入的minibatch x就只会产生一个op,# 不会产生其他多余的op,进而减少了graph的开销。X=tf.placeholder(tf.float32,shape=[None,time_step,input_size])Y=tf.placeholder(tf.float32,shape=[None,time_step,output_size])batch_index,train_x,train_y=get_train_data(batch_size,time_step,train_begin,train_end)# 用tf.variable_scope来定义重复利用,LSTM会经常用到withtf.variable_scope("sec_lstm"):pred,state_=lstm(X)# pred输出值,state_是每一层的最后那个step的输出print('pred,state_',pred,state_)# 损失函数# [-1]——列表从后往前数第一列,即pred为预测值,Y为真实值(Label)#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值loss=tf.reduce_mean(tf.square(tf.reshape(pred,[-1])-tf.reshape(Y,[-1])))# 误差loss反向传播——均方误差损失# 本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。# Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳.train_op=tf.train.AdamOptimizer(lr).minimize(loss)saver=tf.train.Saver(tf.global_variables(),max_to_keep=15)withtf.Session()assess:# 初始化sess.run(tf.global_variables_initializer())theloss=[]# 迭代次数foriinrange(200):forstepinrange(len(batch_index)-1):# sess.run(b, feed_dict = replace_dict)state_,loss_=sess.run([train_op,loss],feed_dict={X:train_x[batch_index[step]:batch_index[step+1]],Y:train_y[batch_index[step]:batch_index[step+1]],keep_prob:0.5})# 使用feed_dict完成矩阵乘法 处理多输入# feed_dict的作用是给使用placeholder创建出来的tensor赋值# [batch_index[step]: batch_index[step + 1]]这个区间的X与Y# keep_prob的意思是:留下的神经元的概率,如果keep_prob为0的话, 就是让所有的神经元都失活。print("Number of iterations:",i," loss:",loss_)theloss.append(loss_)print("model_save: ",saver.save(sess,'model_save2\\modle.ckpt'))print("The train has finished")returntheloss theloss=train_lstm()# 相对误差=(测量值-计算值)/计算值×100%test_y=np.array(test_y)*std[n1]+mean[n1]test_predict=np.array(test_predict)*std[n1]+mean[n1]acc=np.average(np.abs(test_predict-test_y[:len(test_predict)])/test_y[:len(test_predict)])print("预测的相对误差:",acc)print(theloss)plt.figure()plt.plot(list(range(len(theloss))),theloss,color='b',)plt.xlabel('times',fontsize=14)plt.ylabel('loss valuet',fontsize=14)plt.title('loss-----blue',fontsize=10)plt.show()# 以折线图表示预测结果plt.figure()plt.plot(list(range(len(test_predict))),test_predict,color='b',)plt.plot(list(range(len(test_y))),test_y,color='r')plt.xlabel('time value/day',fontsize=14)plt.ylabel('close value/point',fontsize=14)plt.title('predict-----blue,real-----red',fontsize=10)plt.show()prediction()

需要完整代码工程的同学,请联系学长获取

3 实现效果

3.1 数据

采集股票数据

任选几支股票作为研究对象。

3.2 预测结果



项目运行展示

废话不多说, 先展示项目运行结果, 后面才进行技术讲解

对某公司的股票进行分析和预测 :

开发环境

如果只运行web项目,则只需安装如下包:

  • python 3.6.x

  • django >= 2.1.4 (或者使用conda安装最新版)

  • pandas >= 0.23.4 (或者使用conda安装最新版)

  • numpy >= 1.15.2 (或者使用conda安装最新版)
    *apscheduler = 2.1.2 (请用pip install apscheduler==2.1.2 安装,conda装的版本不兼容)
    如果需要训练模型或者使用模型来预测(注:需要保证本机拥有 NVIDIA GPU以及显卡驱动),则还需要安装:

  • tensorflow-gpu >= 1.10.0 (可以使用conda安装最新版。如用conda安装,cudatoolkit和cudnn会被自动安装)

  • cudatoolkit >= 9.0 (根据自己本机的显卡型号决定,请去NVIDIA官网查看)

  • cudnn >= 7.1.4 (版本与cudatoolkit9.0对应的,其他版本请去NVIDIA官网查看对应的cudatoolkit版本)

  • keras >= 2.2.2 (可以使用conda安装最新版)

  • matplotlib >= 2.2.2 (可以使用conda安装最新版)

数据获取

训练模型的数据,即10个公司的历史股票数据。获取国内上市公司历史股票数据, 并以csv格式保存下来。csv格式方便用pandas读取,输入到LSTM神经网络模型, 用于训练模型以及预测股票数据。

🧿 项目分享:大家可自取用于参考学习,获取方式见文末!

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

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

相关文章

Anthropic:始于安全,成于企业——一场关于人工智能未来的深度范式竞争

Anthropic:始于安全,成于企业——一场关于人工智能未来的深度范式竞争 1. 概览:在巨头阴影下崛起的AI安全灯塔 在生成式人工智能(GenAI)狂飙突进的浪潮中,当大部分目光聚焦于OpenAI与ChatGPT时&#xff0…

Anthropic公司深度研究报告:AI安全引领者的崛起与商业化突围

Anthropic公司深度研究报告:AI安全引领者的崛起与商业化突围报告摘要:Anthropic作为生成式AI领域的核心玩家,自2021年由前OpenAI核心团队创立以来,始终以“构建可靠、可解释、可操纵的AI系统”为使命,凭借独特的Consti…

工程建筑网页应用中,如何实现文件上传下载的三种方案?

2023年XX月XX日 🌟 | 一个菜鸟程序员的“秃头”日记 💻 今日份的崩溃与突破 早上8点:对着镜子默念三遍——“我能搞定10G文件上传!”(然后发现IE8连console.log都报错…) 上午10点:试图用WebU…

【实战案例】基于YOLOv26的标准化考试答题卡答案区域检测_1

1. 基于YOLOv26的标准化考试答题卡答案区域检测 1.1. 答题卡检测概述 标准化考试答题卡自动阅卷系统是现代教育评估的重要组成部分。传统的答题卡识别过程通常包括图像预处理、答题卡定位、答案区域检测以及答案识别等步骤。其中,答题卡答案区域的精准检测直接影响…

金融保险网页中,如何选择文件上传下载的实用方案?

政府项目大文件传输系统开发纪实 项目背景与核心诉求 作为山东某软件公司技术负责人,近期承接省级政府招投标平台升级项目,面临以下技术挑战: 超大文件支持:需稳定传输20G级招标文件(含图纸、视频等)文件…

WindowsActionDialog.exe文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

小程序加密痛点破局:CE固定动态密钥+全流程自动化加解密实战指南

在小程序生态高速发展的当下,数据传输与本地存储的加密防护已成为开发者的必备工作,而动态密钥加解密作为小程序主流的安全方案,虽大幅提升了加密安全性,却也带来了开发调试繁琐、前后端联调效率低、加解密代码耦合业务、异常排查…

深度分析《可能影响未成年人身心健康的网络信息分类办法》:开启未成年人网络保护精细化治理新时代

2026年1月23日,国家网信办联合教育部、公安部等八部门正式发布《可能影响未成年人身心健康的网络信息分类办法》(以下简称《办法》),并将于3月1日起施行。这一政策是《未成年人网络保护条例》落地实施后的关键细化举措&#xff0c…

泄密者的致命疏忽!打印机监控存档数据泄露应受到重视

在企业网络安全防护体系中,多数企业将重心放在终端电脑、服务器、网络边界等核心节点,却极易忽视打印机、复印机这类办公外设的安全风险。不少泄密者抱着“截图打印后删除电子档,便无迹可寻”的侥幸心理,将涉密截图通过公司打印机…

AI重构网络犯罪底层逻辑:从团伙作战到单兵全能,一人产业链的现实与未来

2026年初被Check Point Research曝光的VoidLink恶意软件框架,成为首个有完整开发痕迹可追溯的AI生成高级恶意软件,标志着网络犯罪一人产业链从理论构想彻底走向现实。一名开发者借助国产AI IDE工具,仅用一周就完成了传统需多团队协作16-30周的…

紧急预警!SmarterMail认证绕过漏洞在野肆虐 全球超3.9万资产面临服务器接管风险

一、漏洞概述 发布时间:2026年1月25日 漏洞级别:严重(CVSS:3.1 9.8/10.0) 漏洞类型:身份认证绕过 → 远程代码执行 在野利用状态:高度活跃(2026年1月20日起全球批量利用) 官方修复状态:已修复&a…

实时录音+精准识别,科哥镜像实现即时语音转文字

实时录音精准识别,科哥镜像实现即时语音转文字 1. 为什么你需要一个“能听懂中文”的语音识别工具? 你有没有过这样的经历: 开完一场两小时的会议,回过头来要花一整个下午整理录音?在嘈杂的办公室里对着手机语音输入…

CSS vh 响应式设计实战案例解析

以下是对您提供的博文内容进行 深度润色与工程化重构后的版本 。我以一位资深前端架构师 + 技术博主的身份,彻底摒弃模板化表达、AI腔调和教科书式结构,转而采用 真实项目中的思考节奏、踩坑复盘口吻与可落地的代码哲学 来重写全文。语言更凝练、逻辑更自然、技术细节更具…

利刃藏于调度:XXL-JOB越权漏洞全维度解析与前瞻性防御

XXL-JOB作为国内开源分布式任务调度领域的标杆性产品,凭借轻量易部署、高可用、功能适配性强等特性,已深度渗透金融、电商、物流、政务、互联网等核心行业,据开源生态统计,其在国内中小微企业及中大型企业的分布式任务调度场景中市…

从Host头突破到服务器提权:SSRF+任意文件写入组合漏洞的全链路实战解析

在Web渗透测试与网络安全攻防对抗中,单一漏洞的利用价值正被逐步压缩,而由基础请求头管控疏漏引发的组合漏洞攻击,因其隐蔽性强、利用链路长、防御难度大,已成为黑产攻击和内网渗透的核心手段。Host头作为HTTP协议的基础头域&…

不用写代码!3步完成AI图像透明通道提取

不用写代码!3步完成AI图像透明通道提取 你是否还在为抠图发愁?手动用PS魔棒、钢笔、蒙版反复调整,花半小时只抠出一张人像;电商运营每天要处理上百张商品图,背景不统一、边缘毛糙、透明通道丢失;设计师接到…

AI Agent失控前夜:谁该为授权买单?——重构智能时代的访问权限、问责机制与全域风险管控体系

AI Agent作为新一代智能执行实体,正从实验室走向企业核心业务场景,但其背后的授权混乱、权限失控、责任真空等问题,已成为数字时代企业面临的重大安全隐患。破解这一困局,不能简单套用传统IT治理规则,而需建立**“分级…

通义千问3-14B部署教程:vLLM加速推理,吞吐提升3倍实测

通义千问3-14B部署教程:vLLM加速推理,吞吐提升3倍实测 1. 为什么选Qwen3-14B?单卡跑出30B级效果的务实之选 你是不是也遇到过这些情况:想用大模型做长文档分析,但Qwen2-72B显存爆了;想部署一个能写代码、…

潜伏11年的Telnetd核弹漏洞:CVE-2026-24061零认证提权席卷全球,公开PoC触发全网紧急防御

2026年1月,一则安全通告引爆全球网络安全圈:GNU InetUtils telnetd中存在一个潜伏长达11年的远程认证绕过漏洞(CVE-2026-24061),CVSS评分高达9.8/10(关键级)。攻击者利用该漏洞无需任何账号密码…

2026年国内有实力的工厂吸污公司怎么选,国内专业的工厂吸污企业10年质保有保障

工厂吸污作为环保基础设施维护的关键环节,直接影响企业生产效率与区域环境安全。随着工业园区规模化发展及环保政策趋严,市场对专业化、规范化吸污服务的需求持续攀升。然而,行业准入门槛低、服务质量参差不齐等问题…