在前文中,我们利用tushare和python工具分析实现了对证券市场股票数据的获取与保存。验证了股票收益率符合正态分布,进而验证了股票走势较好符合布朗运动规律、维纳过程和伊藤过程的这一基础理论事实。此后,我们进一步探究股票价格的运动规律,引入基于神经网络的LSTM模型,通过学习以往的股票价格运动对未来趋势加以预测,实现了更为细致精确的拟合。


提示:本文内容限于本人对相关技术的原创性思考和理解,仅供学习参考。

目录

  • 前言
  • 一、神经网络是什么?
  • 二、时间序列与神经网络
    • 1.传统神经网络的局限性
    • 2.循环神经网络RNN
    • 3.长短期记忆神经网络LSTM
    • 4.采用LSTM模型研究的优势
  • 三、沪深股指实证研究
    • 1.导入相关包
    • 2.读入数据
    • 3.数据预处理
    • 4.LSTM模型训练
    • 5.可视化绘制
  • 四、预测结果
  • 总结

前言

本文主要分为三部分,在第一部分主要是对机器学习中的人工神经网络技术作简要的介绍和引入。第二部分,将简要说明时间序列(也即随机过程)数据所具有的特征,以及传统神经网络对于时间序列的学习所具有的缺陷,并引出当前较为时兴和前沿的LSTM神经网络技术,强调其在时间序列数据训练和处理上所具有的优越性。最后,本文将以LSTM网络在沪深股票指数上的学习与训练作为技术的应用实例,从实际的代码层面对LSTM神经网络的具体原理和工作机制进行更为深入的讲解。


一、神经网络是什么?

什么是神经网络呢?一说到神经网络,根据我们在中学期间所学习的生物知识,我们会第一时间联想到我们人类大脑中所拥有的生物神经网络。作为计算机领域人工神经网络技术的原型,人类大脑中的生物神经网络具有极为强大的功能。
在大脑皮层中,约有10^11个神经元通过神经突触与大约103个其它神经元相连,形成了一个高度复杂高度灵活的动态网络。正是这样一个庞大而精密的神经网络系统,让人类得以从事各项复杂精巧的工作,从而开创了属于人类的文化与历史。
接下来,我们将神经网络细化至单个的神经元细胞。在神经元细胞中,外部刺激通过树突输入至细胞体。当细胞体接收的信号量超过某个阈值时,细胞体就会被激活,产生电脉冲,并将电位信号沿着轴突并通过突触传递到其它神经元。神经元细胞的工作机制,启发软件工程师设计出一种最为基本简单的神经网络模型结构,也即右图所示的感知器模型。

  • 感知器模型包括了由两个输入神经元组成的输入层和一个输出神经元的输出层,能够完成基础的与或非运算。

此后,工程师们便在单个网络模型基础上不断丰富完善,搭建多个信息处理层,构建各种激励和损失函数,并用网络相互关联各层的多个细胞,组合构成出一个庞大可观的复杂神经网络决策模型。
其中,长短期记忆LSTM神经网络是以循环神经网络RNN为基础算法模板的改进算法。极大地优化了对于长期依赖信息的学习过程,为长期随机过程序列数据的机器学习提供了一份较好的解决方案。

二、时间序列与神经网络

1.传统神经网络的局限性

传统的神经网络模型在对于某一类型的数据处理上显得有些捉襟见肘。这便是所谓的随机过程,也即传统意义上所说的“时间序列数据”。这类数据相较于常规数据而言,其随机变量的变化依赖于某一特定参数(通常自变量轴为时间),也即在时间轴上的不同时间点处具有不同的变化特征的一类数据。传统神经网络只能单次处理孤立的输入信息并产生输出,但在输入输出的前后序列间却没有构建充分的关联。

  • 打个比方,在英语完形填空的题目上,I grew up in China. There’s many delicious food…I speak(?)。此处根据逻辑判断,很轻易便能依照前文的China联想到“Chinese”。但是对于计算机的神经网络模型而言,却是很难推测出这一缺失信息的。
  • 另一个例子是,如今的拼音输入法能够根据前文的输入内容自动猜测后续内容,在词性推测、语义推断和输入习惯上都进行了充分学习。但是以前常用的智能ABC输入法,只能根据单个输入预测下一词,而不能从整体给出判断建议,也是传统神经网络短板的集中体现。

对于随机过程的时间序列数据而言,其重要特征和意义,往往就蕴含于序列的前后关联性上,常常具备时间相关性。因此,传统神经网络所采用的简单分类划分的策略,不再普遍适用于此类数据的学习与预测。

2.循环神经网络RNN


循环神经网络RNN是一类以序列数据为输入,并在序列的演进方向递归且所有节点按链式连接的递归神经网络。RNN的引入最初是为了解决时间序列数据的机器学习问题的,可被视为同一神经网络的多次复制和循环消息传递,其链式的特征能够较好揭示序列的相关性。RNN的输入和输出能够前后关联,便于存储长期记忆,并随时根据当前的输入对状态进行更新,克服了传统神经网络的短板。
但是,当RNN学习的序列间隔不断增大时,其对信息的学习能力会不断衰减至0,从而产生了长期记忆的依赖问题,也即RNN对于长记忆依赖关系的学习能力趋近于0。

3.长短期记忆神经网络LSTM

长短期记忆神经网络LSTM是在RNN的循环神经网络上加以改造和优化的神经网络模型,通过在RNN的重复神经网络模块基础上引入四层神经网络交互层,极大地优化了对于长期依赖信息的学习过程,为长期随机过程序列数据的机器学习提供了一份较好的解决方案。

在LSTM中,其关键在于细胞状态。类似于传送带,细胞状态呈水平线在整个链图上贯穿运行,而LSTM则通过精心设计的三大门层结构,控制信息在细胞上的传递与交互,从而影响对序列数据的学习效果。
三大门层是LSTM神经网络的核心,包括决定从细胞状态中丢弃信息的忘记门层、确定添加至细胞状态中信息的输入门层和确认过滤后输出信息内容的输出门层。三大门层的核心内涵如下:

  • 忘记门层:对于前一状态矩阵中每个输入值都会产生一个对应的向量,该向量中的0-1值表示细胞状态中的信息遗忘的程度。具体逻辑如图所示。
  • 输入门层:在输入逻辑上,首先利用输入门层筛选所需要更新的信息,然后利用内部的一个tanh层得到新的候选细胞信息。接下来,通过忘记门层筛选忘记旧细胞信息的一部分(σ),再通过输入门层选择添加候选细胞信息的一部分(忘记后剩下的部分与新添加信息的权重加和),从而更新得到新的细胞信息。
  • 输出门层:细胞状态更新完毕后,将输入信息经过输出门层的sigmoid层得到判断条件,然后将细胞状态经过tanh层激活得到一个-1~1之间值的向量。该向量再与输出门得到的判断条件相乘,便得到了该层LSTM网络的输出结果。

整体流程:遗忘→根据现有的输入和上一个细胞的输出更新状态→根据现有的状态输出预测值。

在上述所列示的图中,有几个要点:

  • LSTM模块当中的线就是状态矩阵C和输出h的流动,一般来说变动很少,主线是最上面那条直线,其他的线都是对这条主要流动线进行微加工。

  • 里面有一些黄色方块代表层:σ激活层输出0到1的值,代表权重;tanh层表示对输入进行激活,输出新的候选值。

  • 粉色的部分代表操作,x号代表矩阵点乘,+代表添加,tanh代表运算。

概括来说,LSTM上细胞状态信息流动过程的主要特征可总结为以下三点:

  • 基于RNN,更好适应刻画时间序列长记忆依赖关系。具有更多的神经网络重复模块链结构层数,构建门层方式用以交互。相较于BP神经网络和传统RNN模型具有更高的预测准确度。
  • LSTM具备优异的特征,包括时间序列特性、选择记忆特性以及信息门层逻辑的架构。
  • LSTM作为一种模型本身,自然也具备一些短板和不足。其中最大的缺陷便是“时滞效应”,也即预测值可能在时间轴上相较真实值具备滞后性。这一现象产生的原因可追溯至时间序列本身所存在的自相关特性,可通过对时间序列数据采用广义差分法等消减自相关性,或者调整优化模型训练参数来较好规避。

通过上述基本逻辑,LSTM模型便可初步实现通过充分利用过往时间序列信息对未来时点信息进行预测的机制。

4.采用LSTM模型研究的优势

在金融数据等时间序列数据的研究中广泛应用LSTM模型进行学习训练和预测,已逐渐成为当下数据分析和机器学习的热点话题。这是由于LSTM对于这一类数据的学习上,具有诸多独特的优势和特点:

  • LSTM模型能便利地利用已有现成封装的包keras、广泛应用于机器学习算法中的数据流编程符号数学系统TensorFlow,对于初学者较为友好。
  • 在目前的实证研究中,综合比较类似模型而言,LSTM模型对于时间序列分析的拟合优度较高,能较好解决梯度消失和梯度爆炸的问题,从而规避在实证研究和预测中,资产价格出现大幅度偏离实际的极端情况。
  • LSTM模型的构建和使用过程能较好对接tushare接口所导出的数据格式,也能较好发挥python这一高级编程语言及其配套环境的资源禀赋优势。

三、沪深股指实证研究

利用前文的tushare和python工具获取并保存证券市场股票数据,在接下来的代码中采用lstm神经网络对本地保存的金融序列数据进行预测分析并生成图片。

1.导入相关包

在代码中引入了keras包,采用该神经网络学习库提供的现成LSTM模型,对所获取的股票时间序列数据加以学习与训练,可为模型训练提供充足便利。此外,还引入了一个强力的机器学习库sklearn(scikit-learn),用于进行数据预处理,能够极大节省编程时间和代码量。让用户得以拥有更多的精力去分析数据分布,调整模型和修改超参。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"#限于各驱动程序差异,此处禁止GPU运算处理
from keras.models import Sequential
from keras.optimizers import Adam
from keras.layers import Dense, LSTM, LeakyReLU, Dropout
from sklearn.preprocessing import MinMaxScaler

2.读入数据

将待获取的股票代码存为列表,通过遍历的方式将此前存储的股票数据文件加以读取。

stock=['601318','601988','601939','600519','002230','000858','002594','601099','600019','600036']for i in stock:filepath="D:/Documents/finance/data/"+str(i)ds = pd.read_csv(filepath+".csv",index_col="ts_code")[["pct_chg","close","open","high","low"]]#读取表格中的各项数据

3.数据预处理

通过sklearn包中MinMaxScaler()的fit_transform()对数据进行归一化和训练转化处理。

 min_max_scaler = MinMaxScaler()#对数据进行均一化处理close_price = ds[['close']]close_norm_data = min_max_scaler.fit_transform(close_price.values)open_price = ds[['open']]open_norm_data = min_max_scaler.fit_transform(open_price.values)high_price = ds[['high']]high_norm_data = min_max_scaler.fit_transform(high_price.values)low_price = ds[['low']]low_norm_data = min_max_scaler.fit_transform(low_price.values)

4.LSTM模型训练

根据所选时间序列数据的实际特征,设置相应的训练和测试参数,用于对数据进行更好的预处理。例如此处将past_history设为5,future_target设为0,并按TRAIN_SPLIT取了模型的前80%进行训练,后20%用于模型测试。按上述参数调用univariate_data函数,分别获取预处理后的训练数据集和测试数据集。

 past_history = 5future_target = 0# 取 80%数据进行训练 20%进行测试TRAIN_SPLIT = int(len(close_norm_data) * 0.8)# 训练数据集x_train, y_train = univariate_data(close_norm_data,open_norm_data,high_norm_data,low_norm_data,0,TRAIN_SPLIT,past_history,future_target)# 测试数据集x_test, y_test = univariate_data(close_norm_data,open_norm_data,high_norm_data,low_norm_data,TRAIN_SPLIT,len(close_norm_data),past_history,future_target)

配置神经网络相关的参数,按照数据与模型特征和训练实际要求,以达到更为优越的训练与拟合结果。相关参数在机器学习神经网络的训练中具有通用意义。

  • num_units:LSTM网络输出结果向量的维度。
  • learning_rate:学习率,控制模型学习进度。
  • activation_function:激活函数,定义神经网络节点在给定输入或输入集合下输出。
  • loss_function:损失函数,估量模型的预测值与真实值的不一致程度,表征鲁棒性。
  • batch_size:一次训练所选取的样本数。
  • num_epochs:样本批次的训练迭代次数。
  • Input_shape(x,y):规定了时间上展开框的个数以及每个时刻输入样本向量的维度。

上述参数指定完毕后,即可开始编译模型并指定相应参数变量。采用model.fit()函数训练LSTM模型,并返回一个名为history的对象,用于在周期结束时记录跟踪的损失和所指定的参数。

 # Initialize the RNNmodel = Sequential()# input_shape 时间步,每个时间步的特征长度(dim)model.add(LSTM(units=num_units, activation=activation_function, input_shape=(4, 5)))model.add(LeakyReLU(alpha=0.5))model.add(Dropout(0.2))model.add(Dense(units=1))# Compiling the RNNmodel.compile(optimizer=adam, loss=loss_function)# 训练模型# Using the training set to train the modelhistory = model.fit(x_train,y_train,validation_split=0.1,batch_size=batch_size,epochs=num_epochs,shuffle=False)
  • validation_split:指定一部分训练数据作为验证集
  • shuffle:指定每个epoch开始前是否打乱训练集数据顺序(由于时间序列相关数据的特性恰恰体现在其顺序相关性上,因此在时间序列的训练中该参数应被禁用)

5.可视化绘制

模型训练完毕后,将数据格式处理为pd.DataFrame,并调用matplotlib.pyplot对结果进行可视化绘图,便于直观衡量模型的训练和测试结果,分析并比较模型的拟合优度和有效性。

 #绘图并加入标签original_value = min_max_scaler.inverse_transform(y_test).flatten()predictions_value = min_max_scaler.inverse_transform(model.predict(x_test)).flatten()df_result = pd.DataFrame({"key": pd.Series(range(0, len(original_value))), "original": original_value, "predictions": predictions_value})df_result["original"].plot(label="original")df_result["predictions"].plot(label="predictions")plt.xlabel('time')plt.ylabel('index')plt.title('Stock:'+i+'\'s chart')plt.legend()plt.savefig(filepath+"lstm.png")plt.close()

四、预测结果

我们在python中编译运行上述代码,将10只股票1318个交易日内的开盘价(open)、最高价(high)、最低价(low)、收盘价(close)进行归一化处理后导入LSTM模型,取其中80%的数据(约1055个交易日的股票数据)对神经网络进行训练,并用剩余的数据对模型加以验证。利用matplotlib包提供的可视化工具将进行训练预测后10只股票真实值和预测值折线图绘制如下:


上图中,蓝色线为原始数据,橙色线为预测线。我们可以明显观察得出,经由LSTM神经网络训练后的预测曲线和原始数据曲线走势的重合度较高,证明该模型能够较好预测拟合证券市场股票的价格走势。
不过,从图中仍可看出LSTM的些许弊端,例如预测值存在时滞效应,预测效果仍较差强人意等,可通过改进模型算法、参数调整、数据预处理等方式进一步优化模型的拟合精度。


总结

总而言之,LSTM是一种基于RNN的长短期记忆神经网络,通过精心设计的“三大门层”架构,对细胞状态中的数据加以选择性过滤,能够更好刻画时间序列的长记忆依赖关系。相较于BP、RNN等传统神经网络模型而言,LSTM对于时间序列的学习具有更高的预测准确度。尽管LSTM模型本身也具备“时滞效应”的短板,不过随着模型的不断丰富和优化,LSTM的优势正被不断挖掘和凸显。各种在LSTM基础上衍生而出的变种算法也不断涌现。相信在不远的将来,LSTM模型的应用领域将会更加广泛。

LSTM神经网络在证券市场分析上的应用相关推荐

  1. (转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)

    干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译  参与:老红.李亚洲 就像雨季后非洲大草原许多野 ...

  2. 数据分享 | LSTM神经网络架构和原理及其在Python中的预测应用(附视频)

    本文约2800字,建议阅读10+分钟 本文与你分享如何使用长短期记忆网络(LSTM)来拟合一个不稳定的时间序列. 长短期记忆网络--通常称为"LSTM"--是一种特殊的RNN递归神 ...

  3. 【深度学习】LSTM神经网络解决COVID-19预测问题(一)

    [深度学习]LSTM神经网络解决COVID-19预测问题 文章目录 1 概述 2 数据分析 3 SIR模型和LSTM网络的对比 4 LSTM神经网络的建立 5 参考 1 概述 我们将SIR传播模型和L ...

  4. LSTM神经网络 和 GRU神经网络

    LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...

  5. 图解LSTM神经网络架构及其11种变体(附论文)

    来源:机器之心 英文原文:Deep learning architecture diagrams 参与:老红.李亚洲 原文链接:图解LSTM神经网络架构及其11种变体(附论文) 本文经机器之心(微信公 ...

  6. python程序写诗_pytorch下使用LSTM神经网络写诗实例

    在pytorch下,以数万首唐诗为素材,训练双层LSTM神经网络,使其能够以唐诗的方式写诗. 代码结构分为四部分,分别为 1.model.py,定义了双层LSTM模型 2.data.py,定义了从网上 ...

  7. Linux(Centos7.8)中conda虚拟环境搭建LSTM神经网络基于django3.1.2的api接口

    目录 1.准备工作 2.项目需求 2.1 根据需求下载LSTM依赖包 2.2 代码实现 3.启动服务 4.第三方应用调用webapi服务提供的api接口 1.准备工作 由上一博客Linux(Cento ...

  8. 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络

    忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络 原文:Long short-term memory networks in memristor crossbar arrays 作者:CanLi. ...

  9. 【锂电池容量预测】基于matlab灰狼算法优化LSTM神经网络锂电池容量预测【含Matlab源码 2004期】

    一.灰狼算法简介 1 前言: 灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法.该算法受到了灰狼 ...

  10. 【LSTM回归预测】基于matlab LSTM神经网络回归预测【含Matlab源码 2227期】

    ⛄一.时间序列简介 1 时间序列模型概述 1.1 时间序列的不同分类 时间序列是按时间顺序排列的.随时间变化且相互关联的数据序列.分析时间序 列的方法构成数据分析的一个重要领域,即时间序列分析. 时间 ...

最新文章

  1. pytorch dropout用法
  2. ajax不能设置哪些header
  3. Eclipse上Maven环境配置使用
  4. 飞鸽传书是怎么就变成飞秋了的?
  5. ERROR org.hibernate.proxy.pojo.javassist.JavassistProxyFactory - HHH000142:错误
  6. 快速读取内存文件-内存映射文件的方法
  7. 微信小程序弹框之获取输入内容(2)
  8. 【流量池】裂变营销:10种人脉裂变技能,6个裂变核心,8个吸粉人性本能怎样玩粉丝裂变?
  9. 绝对干货!百度文档 用python一键下载
  10. vivado ERROR: [Synth 8-4556] size of variable is too large to handle
  11. SSD算法详解 及其 keras实现 (下)
  12. 睿智的目标检测12——使用labelimg进行目标检测数据集标注
  13. hadoop详细笔记(十一) mapreduce数据分析案例之线段重叠案例
  14. 《三国演义》十大不义之人
  15. LabVIEW编程LabVIEW开发 十六进制转换ASCII例程与相关资料
  16. c语言松树树干如何编程jemg,JE-C编程指南(上)
  17. VSCode鼠标滚轮控制字体大小
  18. flutter icon 大全
  19. RPA赋能与数据化运营
  20. 【Flash笔记】Flash-8动画入门常见问题解决办法

热门文章

  1. 操作系统课程设计——文件系统
  2. 北京科技大学计算机博士统考,北京科技大学计算机与通信工程学院2016年博士录取方案...
  3. springboot+vue网络课程教学网站系统java源码介绍
  4. ntsd调试dump文件
  5. 友善之臂Mini2440NORflash bootloader烧写详述---亲测可用
  6. Tiny4412 小试牛刀
  7. c语言开发刷机工具,移动叔叔专用mtk刷机工具
  8. Dreamweaver文字或图片如何添加空链接代码
  9. CF55D: Beautiful Number
  10. P2422 良好的感觉