【《基于机器学习算法的股票市场预测分析》15000字】_第1页
【《基于机器学习算法的股票市场预测分析》15000字】_第2页
【《基于机器学习算法的股票市场预测分析》15000字】_第3页
【《基于机器学习算法的股票市场预测分析》15000字】_第4页
【《基于机器学习算法的股票市场预测分析》15000字】_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1-基于机器学习算法的股票市场预测分析目录1引言31.1选题背景31.2研究意义41.3研究计划41.4文献综述51.5论文框架72机器学习算法理论72.1机器学习简介72.2K-临近算法82.3线性回归算法102.4长短期记忆网络算法122.5移动平均算法143获取数据和数据处理163.1获取股票数据163.2数据存储173.3数据处理183.4特征选择与处理204系统的界面搭建与完善204.1Django简介204.2使用Django搭建web界面214.3系统完善255实证分析275.1效果分析275.2算法分析27结论29参考文献301引言1.1选题背景早在1990年代,中国股票市场就已经重启,到现在已有超过30年的历史,沪、深两指数已有近3000支股票,整个A股市场也有将近3000多家上市公司,成为了世界第二大股票市场,总市值超过50亿元。在当今社会中,股票已成为大众的集聚地,关注股票走势的投资者数量在不断地增长,人们开始尝试通过股票图线指导自己的投资预测。然而,尽管国内股票市场在逐渐成熟、投资数量有着稳步提升,准确的预测股票的走势、从中选出具有投资价值的股票对于投资者来讲仍然是一件十分困难的事情,投资者不仅需要具备足够的投资交易经验,还需要对市场有相当的敏感度。在过去的市场中,投资者主要根据股票的价值和趋势进行分析,即基本面分析和技术分析。发行股票的企业创造现金流的能力很大程度上决定了股票的价值,或者说是股票的价格,若想获得利润,应该先对企业的现金流有一个合理的预估,在企业未来的自有现金流折现高于当前的值时买入;趋势分析,基于的角度是历史会再重演,图像化市场的变化,对有用的信息进行捕捉,根据股票的历史价格和成交量、收盘价等综合判断该股票的走势。综合来讲,企业的基本面分析相对来讲比较容易,投资者可以通过网络等渠道直观地获得企业的综合信息和发展状况,因此,在技术层面对股票的数据和图像进行分析将成为实现股票预测的重要一步。在国外,股票市场的分析在很早以前就已经开始了,研究人员将各种数学理论、数据挖掘技术以及计算机技术等结合起来,并在股票分析软件中使用它们,再通过研究过去时间内的交易数据,探索出了股票价格走势的大致规律。机器学习在股票预测领域发挥了相当重要的作用,很多细小微妙的、固有的和非线性的关系都可以被它捕捉到。自1970年开始,经过不断的成长,机器学习的功能性和实用性有了非常大的提升,例如数据可用性的增长、计算能力的增长、来自包括但不限于计算机科学和统计学的新技术,催生了强大的机器学习的新算法,让我们相信机器学习算法可以提供比线性模型更好的方法。机器学习算法已经应用到了金融以外的许多领域,并被证明比许多传统的技术更加有效,例如语音识别(如siri)、图像识别(如自动驾驶)或是推荐引擎(Amazon的应用)等,因此,机器学习在股票预测领域会发挥非常优秀且可靠的作用是值得信任的。过去的几年里,随着经济发展和科技水平的不断提高,在现实生活和工作中对于股票预测的需求不断加大,针对此原因,不论是国内还是国外,都越来越重视在股票市场的研究中使用机器学习技术。利用不断学习的新内容,机器学习可以对预测模型进行优化和完善,给出可靠地预测结果,并且不需要人为过多地进行干涉。同时,在股票市场的预测中引入机器学习技术,从股票历史数据中提取出重要信息,这样不仅可以帮助股民研究股票,为价格预测提供理论支撑,又可以为企业领导人的决策、计划等提供技术支持。根据此现状和需要,本文选择机器学习作为股票分析和预测的研究技术,分析股票市场和当今环境,选择动量策略作为研究策略,获取沪、深两指数的股票数据并进行数据分析和处理,将Python作为开发工具,使用线性回归算法、移动平均算法、K-临近算法和长短期记忆网络算法对股票数据进行预测并给出预测结果,建立友好交互界面,输出预测图像。1.2研究意义1.2.1理论意义研究机器学习算法、数据处理、特征选择、模型训练等,通过此方面的研究为选股提供可靠的技术和理论依据1.2.2现实意义近年来,随着国家经济的不断进步和国民生活质量的不断提升,股票逐渐走入大众的日常生活。目前现存的一些选股系统大多鱼龙混杂,多以广告、盈利为主,甚至存在一些诸如诈骗、传销等非法问题。从现实中的情况来看,A股市场的发展历程比较短,很多股票的定价都存在偏差,且非理性人投资行为也普遍存在。正是因为这些问题的存在,我国的股市市场的预测分析拥有十分巨大的进步空间。因此,一款正规、有效的选股系统必将为众多股民带来福音,为其提供切实可靠的股市分析和选股预测。同时也能促进证券市场的健康蓬勃发展,挑动更多的国民投资股票,刺激我国证券行业的进步。据此来看,本文研究基于机器学习的选股预测,其现实意义和社会意义十分重要。1.3研究计划首先获取股市数据,选取沪深指数下的股票数据作为训练数据,并对股票数据进行处理;再通过机器学习反转策略、动量策略、均值回归策略等策略方法判断股票是否可以获利,利用机器学习算法如LSTM算法、K-临近算法、线性回归算法等预测股票走势并回测,利用最小二乘法判断拟合效果;最后完善前后端接口,给出友好交互界面,实现选股功能(在界面中可以输入股票代码,根据不同的算法分别给出预测,再由用户自行选择)。从机器学习和股票市场来看,选择动量策略有更大的可能性获得较高利润。具体如下:1)分行业拿到历史数据,找到估值的上下沿(比如,对于一些传统行业适用于市盈率pe,或市净率pb)2)利用LSTM、K-临近、线性回归等、移动平均算法对股票数据进行预测,并对预测结果进行验证拟合3)建立相应的投资组合,并拿部分数据回归测试,验证效果4)实现交互界面,输出预测图像,给出选股建议1.4文献综述利用机器学习对股票进行预测离不开计算机技术和数理金融的研究,下面就一些机器学习、股票投资的相关内容做一个简单的总结。由文献[5][6]可知,股票收益来源大约分为三类,均值回归、趋势延续和盈利增长,其中均值回归适用于熊市或者震荡市,趋势延续适用于牛市;盈利增长两者均可,收益取决于买点,需要具体分析。在获取到股票数据后,对此采用不同的策略、在不同的市场情况下可能会有不同的预测结果,并且股市的各种状况以及社会环境都可能会对股民的决策造成影响。文献[1]中指出,随着经济的发展,股票投资成为越来越多人青睐的对象,使用机器学习SVM算法和DTW算法构建股票的分析和预测模型,选取盘中模型作为之后模型评估的基准线。其分别选取了上证指数、鸿达兴业股票、鼎汉股票数据,利用已构建的支持向量机和时间动态扭曲模型在Python平台上进行预测分析。其结果为,针对上证指数而言,支持向量机(SVM)预测下逆向策略效果更好,对于鸿达兴业股票和鼎汉股票而言,支持向量机预测下正向策略效果更好;基于时间动态扭曲算法(DTW)的预测方法对于特定的股票有较高的精度和可信度。针对其研究结果与实际情况能够看出,当股票的类型不同时,不一样的算法给出的结果可能不同,甚至有可能出现很大的偏差,因此是否需要考虑针对不同的股票采用不同的算法分别进行预测,给出基于不同算法的预测结果,由用户综合考量决定。同时本人认为,“盘中策略”并不是一个很好的策略,其盈利情况并不理想。针对目前的股票市场,应该寻找一个更有效、更适合、盈利可能性更大的策略。LKCChan(2000)【12】在JournalofFinance发表了一篇《动量策略》,其研究结果表面,动量确实会对股票的价格产生影响,就相当于物理学中所说的惯性,市场出现波动后,这些波动并不会在发生之后就立刻消失,而是会在一定的时间内仍持续存在。因此,动量策略在当今的股票市场中成为了一种十分重要的量化投资策略,为本文选取策略提供了新的思路,同时动量策略对于趋势的捕捉也十分有利。文献[2]又给出了一个新的方向,通过XGBoost算法建模,利用定价信号来判断买入还是卖出。他们试图利用大量的股票特征来对股票的“公允价值”进行预测,并对“错误定价”信号进行量化,即买入或卖空估值过低或过高的股票,在此基础上还加入了新闻情绪信号作为叠加,进一步完善了策略。摩根大通【2】的这种研究方法更加注重投资者的兴趣以及投资能力,综合考虑了超过37种可能有助于预测股票市场的股票特征,从估值、盈利能力、运营效率、质量、增长、情绪和风险等角度进行分析,能使结果更加理性和贴近人性需求,但是影响股票市场的不确定因素太多,未来难以预测的事情也有很多,例如战争、疫情等都会对股市产生影响。另外本人认为“错误定价”对于投资者来说说服力不够强,人们或许更愿意买入预测出是直线上涨的股票,而并非低估/高估的股票。李映照和黄琳(2010)[3]运用多元线性回归提取出了机构增持股的21个财务特征的公因子,得出公司规模,每股指标,经营收益等9个因子对机构持股偏好有影响。李辰颖,田治威(2014)[4]基于遗传神经网络的独立机构投资者持股偏好研究指出,投资者更喜欢比较安全和有良好收益的股票,而企业规模和市场收益率两个非财务特征是安全性的两个主要内容,盈利性主要包含每股收益和净资产收益率两个财务特征,这为本文股票特征的选取提供了参考。同时,近些年随着计算机技术的不断进步和发展,将机器学习算法应用与金融尤其是股票领域相结合逐渐成为热门的研究方向。由于金融数据关系十分的复杂,线性的、参数化的模型通常不能很好的拟合数据关系,这时,机器学习算法就可以充分地利用它自身非线性、非参数的优势,快速地挖掘庞大的数据,从而探索出其中复杂的关系。近几年以来,许多国内学者都在这个领域开始了研究探索。汤凌冰(2014)【13】对机器学习算法应用于投资领域的思想和策略进行了系统的总结整理,初步提出了线性回归算法、移动平均算法应用于股票预测,和曾经经常使用的高斯核函数相比,收益有很明显的提升。黄卿(2018)【14】等利用神经网络、SVM和LSTM预测分析了具有股票指数的期货的高频收益变动方向,三种方法都具备一定的预测能力,LSTM的拟合结果最好。综上所述,我国股票投资市场的规模和股票开户数据都呈迅速增长的趋势,不论是从国内的股票市场规模以及国外股票市场的发展经验来看,股票市场、量化投资拥有十分令人期待的发展前景。本文将进一步利用机器学习算法对股票市场进行预测和分析,给出选股建议,以期为股票预测提供新的思路和方法,拓宽该领域的研究。1.5论文框架本文由六部分内容构成,各个部分主要内容如下:第一章为绪论,主要是当今股票市场、股票预测等发展情况的介绍以及机器学习技术在数据预测方面应用的现状和成果,以及对相关文献的学习,阐述本文的研究角度和研究意义。第二章为机器学习相关算法的介绍与应用,包括线性回归算法、长短期记忆网络算法、移动平均算法、K-临近算法,以及应用这些算法对股票数据进行训练和回测。第三章为数据获取和数据处理部分,主要阐述获取股票数据的方法,以及对股票数据的清洗、处理和储存,使其能够被利用。第四章为系统界面的搭建,才用Django作为Web框架,实现交互功能和预测图线的输出,以及其他简单应用的实现。第五章为实证分析,对算法的有效性和稳定性进行验证。最后为结论,对本文进行概括,总结研究的不足,并期望能分析指出未来机器学习在金融股票领域可能的研究方向和作用。2机器学习算法理论2.1机器学习简介作为近几年大热的研究方向之一,机器学习的主要功能为:根据相关计算机的技术、学习已有数据的规律,进而分析预测未来的数据。机器学习主要分为监督学习、无监督学习和半监督学习,监督学习中的数据集是由特征以及标签组成,其目的是训练机器,从而对标签取值准确的预测。例如:房价预测、肿瘤判定等;无监督学习则是不知道数据的答案和标签,不对数据集作任何说明,其目的是让机器自动将一堆混乱的数据分成几个簇(类),而分类的标准没有人为的事先提供。显然,对于股价的预测应属于监督学习,从所给的训练数据集(股票数据)中训练出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果。在监督学习中,其训练集包括输入和输出两部分,有时也被称为特征和目标。训练集中的目标是由人来进行标注的,为了达到预测的目的,首先要训练已有的训练样本(对应到本项目中为已知股票数据及其对应的输出),得到一个最优模型;再通过这个模型,把全部的输入映射为相应的输出,并初步判断这些输出。本文要做的就是要训练股票数据,建立预测模型,预测输出股票的大致走向,从而可以建议用户在最优的时机买入股票,进而获得最大的利润。2.2K-临近算法2.2.1K-临近算法简介K-临近算法,全称是KNearestNeighbors(KNN),意为K个最相近的邻居,属于有监督学习中的分类算法。从它的名字我们可以直观地看出,其算法的基本原理就是,当想要预测一个新的值x时,根据它距离最近的K个点的类别进而判断x的类别。如图2-1,假设绿色的点为想要预测的点,此时K=3,则K-临近算法就去寻找与它最近的三个点(图内圆圈内的点),看哪种点的类别多一些,则把要预测的点归为这一类。本例中蓝色的三角形多一些,这个绿色的点被归为蓝色三角形一类。如图,当K=5时,则变成红色的圆多一些,那么新来的点被归为红色的圆。由此可见,预测结果的准确度十分依赖K值的选取和点距离的计算。图2-SEQ图2-\*ARABIC1K-临近算法预测举例2.2.2距离计算对于计算两个点之间的距离,可以使用欧拉公式来计算,以二维平面为例,二维空间中两点之间的距离计算公式为:ρ(公式2-1二维空间两点间距离公式)K-临近算法就是将待预测的点与平面中各个点之间的距离进行计算,保存后再对其进行排序,选出前K个值,观察这K个值内哪些类别比较多,待预测的这个点就可被化为哪一类。2.2.3K值选择通过先前的例子可以看出,K值的选择十分重要。本文计划采用交叉验证法选择K的值,将样本数据按照8:2拆分出用于训练的数据和用于验证的数据,首先从较小的值开始,再不断增加K值,然后计算验证集合的方差,直到找到一个最优的值。通过交叉验证计算方差后得到的大致图线如下:图2-SEQ图2-\*ARABIC2交叉验证计算方差的结果从图中可以看出,增大K时,错误率会先降低,因为周围有了更多的可以用来借鉴的样本,其效果会更好。为了更好的实现预测效果,本文计划使用SKLearn数据包,调用其中的K-临近算法,指定出参数范围为[2,9],该数据包会自动运行所有参数组合并建立模型,最后返回出效果最好的一组。如图为采用K-临近算法对浦发银行股票的预测图线:图2-SEQ图2-\*ARABIC3利用K-临近算法对浦发银行股票数据预测的结果2.3线性回归算法2.3.1线性回归算法简介很明显,线性回归属于回归问题,也是监督学习的一种。线性回归(LinearRegression)是一种线性的模型,它通过使用线性组合来对所给数据进行训练和预测,其训练目标是将训练数据集间的关系拟合成直线或者是平面,尽可能地降低估计值和实际值之间的误差。2.3.2线性回归算法模型线性回归算法的模型很简单,假设每批数据有n个特征,每个特征都对应着一个属于自己的权重值,将数据与权重值的乘积再加上一个偏离值,就得到了线性回归的模型,公式如下:y=w(公式2-2线性回归模型)权重w即为线性回归要学习的参数,通过模型的训练将w的值计算出来,再代回公式,即可得到数据的预测值。2.3.3损失函数很明显,对模型的预测得出的值与实际值约接近,这个模型越好,为此,定义了损失函数。在线性回归中,通常使用均方根误差表示,即最小二乘法。先假设出这个线的方程,然后再把数据点代入假设的方程,得到观测值,进而再求得实际值与观测值相减的平方和最小的参数。损失代价函数为:Jθ其中,y=[(公式2-3损失代价函数)接下来就是求解公式中的向量θ,使得J(θ)最小。求解J(θ)有两种方法:梯度下降法和正规方程法。1)梯度下降算法,是经过每次迭代后,使得当前的向量θ代入J(θ)损失函数后,其值逐渐降低,直到最后收敛。2)正规方程法,提供了一种求解最优θ的解析解法。只需要对J(θ)函数中每个θj​(j=0,1,…,n)求偏导,求出每个θj​使得偏导等于0。这些解组合成对应的向量将梯度下降法和正规方程对比,将特征值进行缩放可能是梯度下降算法的一个必不可少的步骤;在特征缩放梯度下降算法中,学习率α需要自己决定,并且其值要适当,且迭代运算要进行很多次。与梯度下降相比,当n比较小时,使正规方程法能更快地得到结果,因此其在普通的线性回归问题中用的比较多。但是在机器学习中,梯度下降法有更大的适用范围。综上所述,由于股票数据的n很大,进行矩阵运算会有很大的代价,正规方程求解的过程也会变的很慢,所以梯度下降更适合系统,因此选用梯度下降的方法来计算损失代价函数。2.3.4使用线性回归算法进行预测同样,为了预测的有效性和易实施性,本文依旧调用SKLearn中的线性回归方法。采用线性回归算法对浦发银行股票数据进行预测结果如下:图2-SEQ图2-\*ARABIC4利用线性回归算法对浦发银行数据进行预测的结果2.4长短期记忆网络算法2.4.1长短期记忆网络算法简介长短期记忆网络(LongShort-TermMemory,下文称LSTM算法),因为其拥有记忆功能,所以通常被用在一些具有时间特性的场景中,并解决了原始的RNN算法的梯度消失问题。假设模型为依次输入一句话,我们要对单词进行分类,例如arriveTianjinonNov,11th,和leaveTianjinonNov,11th,’Tianjin’分别是目的地和出发地,如果使用普通的神经网络,输入是’Tianjin’,输出是确定的。然而,我们的期望是,‘Tianjin’前是‘arrive’时,‘Tianjin’被识别为目的地;‘Tianjin’前是‘leave’时,则被识别为出发地。这就是LSTM常见的应用,它可以记住历史信息,在读到‘Tianjin’时,LSTM会知道它前面是‘leave’还是‘arrive’,根据历史信息的不同来做出判断,即使有相同的输入,由于历史信息不同,输出也会不同。2.4.2长短期记忆网络算法模型普通的神经元是一个输入,一个输出,而对于LSTM来讲,它有四个输入,分别是input(模型输入),forgetgate(遗忘门),inputgate(输入门)和outputgate(输出门)。遗忘门用来决定前一时刻的memory中的是否会被记住,当遗忘门打开(为1)时,前一刻的memory会被保留,当遗忘门关闭(为0时),前一刻的memory则会被清空。输入门的作用是决定目前的输入序列有多少会被记忆下来,在输入序列中,清除掉那些无用的输入信息。输出门则用来决定当前memory内的信息有多少被用来输出。如图,假设用ft表示遗忘门,it表示输入门,Ot表示输出门。C代表memorycell,用来存储记忆信息,Ct-1表示上一个时刻的记忆信息,图2-5LSTM基本模型遗忘门计算:f输入门计算:i当前输入:c当前时刻的记忆信息的更新:c输出门计算:o输出门:h2.4.3模型的训练和实现LSTM的训练过程大致为:首先计算各个神经元的输出值,再反向对每个神经元的误差项进行计算,根据相应的误差项,把各个权重的梯度计算出来,再代回公式进行预测。对于算法的实现,选择调用TensorFlow库和SKLearn数据包:fromkeras.layersimportLSTM,接下来对模型进行了一定的调参,使用默认的超参数设置,并在训练过程中持续观察loss的变化,初步给定的参数范围为[0,60],60%的数据作为训练集,40%作为验证集。关键代码如下:foriinrange(60,len(train)):

x_train.append(scaled_data[i-60:i,0])

y_train.append(scaled_data[i,0])

x_train,y_train=np.array(x_train),np.array(y_train)训练过程中,观察到trainloss逐渐下降,valloss也在不断下降,这表明网络依旧在学习,因此需要加大数据集。同时,为了使数据的训练数据更好,将训练集增加到80%,最终选择的参数为50,此时图线拟合的效果最好。结果如下:图2-6利用LSTM算法对浦发银行股票数据预测的结果2.5移动平均算法2.5.1移动平均算法简介移动平均(MovingAverage),又称滑动平均,经常用来去衡量当前趋势的方向。移动平均算法适用于即期预测,当产品的需求既不呈现快速上涨的趋势也不呈现急速下降的趋势,且季节性的因素对其没有明显影响时,使用该算法能够把预测过程中的随机波动有效地清楚掉。移动平均和平日所提到的平均的概念是一致的,都是通过计算过去的数据的平均值从而得到数学结果。该算法经常应用于金融领域的预测,通过绘制图线将计算出的平均值显示出来,以便于观察平滑的数据,而不是聚焦于金融市场内固有的价格波动。移动平均可以过滤掉高频噪声,反映出中长期的低频趋势,进而辅助投资者做出投资判断。移动平均与普通的平均的不同之处在于,它使用的不是简单的平均值,而是采用“移动”平均技术,这个技术能够为每一个预测使用一组最新的值,对于每个后续步骤,从集合中删除掉最旧的观察值,同时考虑预测值,即数据集在不断地“移动”,因而这种算法能够确保只对当前信息进行核算,并保证了平滑性。2.5.2移动平均算法模型移动平均算法的根本理念是,依据时间行列的资料,一项一项推移,分别计算得出包括特定项数的序时平均值,进而对长时间的趋势进行描述。因此,当时间序列的数值受周期变动和随机波动的影响,有较大的起伏,且事件的趋势不容易被展现出来时,使用移动平均算法能够清除掉这些元素带来的影响,把待预测事件的发展方向和趋势展现出来,然后根据趋势线对待预测序列的长远发展趋势进行分析。移动平均法可以分为:简单移动平均和加权移动平均,本文主要采用的是简单移动平均的方法,调用了Tensorflow中的移动平均模型。Ft(公式2-7简单移动平均)公式中:·Ft:·n:移动平均的时期个数;·At·At-2,At-2和2.5.3模型的训练和实现在对移动平均数进行计算时,每次计算需要使用多少个值,其决定依赖于时间序列的序数和变动的周期。如果时间序数多,变动周期长,则能够使用每6个月直到每12个月来进行计算;反之,可以采用每2个月或每5个月来计算。对获取到的股票数据的移动平均数,本文采用每5个月的实际值来进行计算。对于模型的实现,本文计划使用TensorFlow中的ExponentialMovingAverage()来实现。在TensorFlow中,ExponentialMovingAverage()可以传入两个参数:衰减率(decay)和数据的迭代次数(step),此处decay对应着β,step对应着和num_updates,实现移动平均模型的步骤如下:1)定义训练轮数step2)定义滑动平均的类3)指定要用到移动平均模型的变量(w和b)4)执行模型,将变量转换为指数加权的平均值部署完成后,在每次使用反向传播的时候,改为使用run.(train_op)就可以正常执行模型,实现股票的预测。利用移动平均算法对浦发银行股票数据进行预测,输出的图线如下:图2-7利用移动平均算法对浦发银行股票数据进行预测的结果3获取数据和数据处理3.1获取股票数据通过查阅相关资料,目前获取股票数据的来源主要有Tushare数据包、AKShare数据包以及Morgan选股池等,由于Morgan大多为美股数据,而使用Tushare数据包需要的限制过多,且对账号等级和积分有要求,因此最后本文选择使用AKShare作为数据来源。AKShare是一个开源的数据库接口,它基于Python,其目标是完成对股票、基金、期货等金融产品和其他金融领域的数据从采集、下载、到清洗加工的工具。其特点是获取到的数据为相对权威的财经数据网站公布的原始数据,通过利用原始数据进行各数据源之间的交叉验证,进而再进行加工,从而得到科学的结论。AKShare提供了众多数据接口,本文计划使用其中的沪市股票和深市股票数据,利用这些数据进行模型训练和预测。如图所示,需要使用的数据为股票的市盈率PE(股票每股价格与每股盈利的比率)、股票的市净率PB(市净率=股价每股净资产)、PS(市销率)、ds_ratio(股息率)。同时还有最高价、最低价、成交量、开盘价、收盘价五个,由于本文主要是进行股票的分析和预测,因此在综合考量各个指标的基础之上,选择收盘价作为模型的输出向量。图3-SEQ图3-\*ARABIC1AKShare股票数据除了个股股票数据,本文还获取了沪深各指数的数据,每个指数下包含不同各股票数据,并通过一定的计算规则计算出指数。除了常规的单个股票数据预测,本文还推出了指数预测。通过AKShare获得各个指数下的股票数据,并将其保存在本地Excel文件中,在进行股票预测时,可直接输入某股票指数,进而可直接得到该指数下的所有股票的预测结果。3.2数据储存为避免网络拥堵或者数据来源不稳定,本文计划把股票数据保存到本地,作为数据库调用。使用AKShare的save命令把沪深两市3000多支股票201001到202012近11年的历史数据缓存到本地excel中,获取到的数据如图所示(部分)。图3-SEQ图3-\*ARABIC2各股数据(部分)图3-SEQ图3-\*ARABIC3股票指数数据(部分)3.3数据处理通过AKShare获取到的数据并不是直接可用,还存在无用数据、杂乱值等等特殊情况,需要进一步的处理,使其符合机器学习训练集和验证集的要求,进而实现股票预测。3.3.1Pandas清洗脏数据首先利用Pandas进行初步的数据清洗。Pandas是一个Python类库,使用它能够对数据进行科学计算和分析,它提供了功能强大的类库,对于那些存在数据缺失、数据错误或数据格式不统一等问题的数据集,都可以进行清洗和排序,最后得到清晰可用的数据。对于获取到的股票数据,主要存在的问题大致是存在异常字符、有缺失值、空行、长度不统一等,利用Pandas可以很好的处理这些问题,通过删除行、列、替换为NaN等解决异常字符和空行问题;通过补0可以很轻松地解决掉长度不统一的问题。3.3.2数据规范数据的基本格式经过处理后,就可以进行下一步的数据处理。首先,为规避股票分拆及分红对数据计量维度的不一致,要进行复权处理。由于股票存在一些诸如配股、分拆、合并和发放股息等事件,可能会导致股价出现较大的缺口,如果没有对股价进行复权处理,将会导致它们失去连贯性。股票数据复权一般包括前复权处理和后复权处理。前复权处理即保证当前价格不变,增减历史价格,从而使股价连续。前复权适用于看盘和叠加技术指标,但是由于其为了保证当前价格不变,每次股票除权除息时都需要重新调整历史价格,因此其历史价格是时变的,这可能会导致在不同的时间点看到的历史前复权价出现差异;另外,对于有持续分红的公司来说,前复权价可能出现负值。后复权处理,则是保证历史价格相同,在每次股票权益事件发生后,调整当前的股票价格。通过后复权处理的股票数据可以被看做投资者的长期财富增长曲线,能够反映投资者的真实收益率情况。在量化投资研究中,普遍采用后复权数据,因此本系统统一以20100101为基准日期,对所有历史数据进行了后复权处理。使用AKShare中的接口可以直接进行上述操作,接口实例如下:importakshareasakstock_zh_a_daily_hfq_df=ak.stock_zh_a_daily(symbol="sz000002",start_date='20200101',end_date='20200125',adjust="hfq")print(stock_zh_a_daily_hfq_df)后复权后的数据示例如下图所示:图3-SEQ图3-\*ARABIC4后复权处理后的股票数据(部分)3.3.3归一化数据获取到的数据可能会有不同的取值范围,而在某些线性模型或与距离相关的模型中,数据的取值范围可能会对最终的结果产生很大的影响。例如二元特征的取值范围为[0,1],而距离特征取值可能是[0,+∞),因而在应用中,要截断部分距离,例如[0,4000000]。然而特征的值范围不同,这使得模型会向取值范围更大的特征靠近。所以,为了使取值不同的特征互相平衡,我们需要归一化处理所选取的特征,将特征的对于归一化数据,本文计划使用分维度归一化的方法,使用最大最小归一化(这里的最大值最小值指的是数据所属类别的最大最小值,而非全局的最大最小值)。使用TensorFlow中的Timescale(feature_range=(0,1))可直接对数据进行归一化,使数据处于同一个量级。3.4特征选择与处理对于回归问题,需要采集数据。对于得到的采样数据,还需要进行一定的划分。训练集为数据的80%,验证集为数据的20%,同时在此基础上再给出后续一段时间内的预测。除了采样外,还需要过滤数据的样本,包括:1)结合业务情况进行数据过滤,去除Crawler,抓取Spam作弊等数据。2)异常点检测,采用异常点检测算法分析样本,本文使用聚类算法对异常的点进行检测。本文计划选用日期作为数据的特征,该特征属于Lowlevel特征,即较低级别的特征,属于原始特征,不需在后期进行人工处理和干预。以日期作为特征,将日期设置为索引,创建好带有日期和目标变量的数据帧,再读取Excel表中的数据,调用机器学习算法,对股票数据进行预测,展示出预测结果随着时间的变化结果。4系统的界面搭建与完善在完成了数据和算法的部分之后,已经可以对股票数据进行基础的预测,但由于本文要完成的是一个选股系统,因此还需要将各个部分整合在一起,给出友好交互界面,实现前后端交互。因此本文计划使用Django作为web框架,搭建系统的前端界面。4.1Django简介Django是一个开源的模型,它使用Python编程语言驱动,其框架使用MVC设计模式。MVC分别代表Model、View和Controller。Model(模型),是存放和取出数据的层次,其职责是对和数据相关的内容进行处理,包括存取数据、验证数据、行为分析以及处理数据间的关系等;View(视图),其主要职责是将数据格式化,然后展现给用户;Controller(控制器),其主要功能是接受外部用户的一系列操作,根据用户的操作访问Model并获取数据,最后调用View显示出用户想要的内容。根据Django的这种模式,视图对用户能看到的数据起决定作用,但往往忽略用户的输入,而Django的模板仅决定如何展现视图指定的需要展现给用户的数据。对于控制器部分,由Django框架的URLconf来实现。其工作原理是通过正则表达式来与URL进行匹配,然后对需要使用的Python函数进行调用。因此在写代码时,仅仅需要写少量的调用代码即可。图4-SEQ图4-\*ARABIC1Django模型示意图4.2使用Django框架搭建Web界面一个Django项目包含四个目录层级,分别是manage.py、init.py、settings.py、urls.py、wsgi.py,其中manage.py是一个命令行工具,通过它,你可以使用多种不同的方式与此Django项目交互;settings.py是项目的配置文件;urls.py用来声明项目的URL,;wsgi.py是一个Web服务器的入口,它兼容WSGI,用来运行项目。4.2.1Django路由系统URL配置(URLconf)可以看作是Django所支撑的网站的目录。其本质其实就是一个映射表,将URL的模式和为该URL模式调用的views间进行映射,即告诉Django,哪个URL对应着调用哪段URL代码。将需要被调用的视图函数写入urlpatterns的表达式下,即可在后续的请求中调用该函数。4.2.2DjangoViews(视图函数)根据Web知识可知,Http的请求中心会产生两个核心的对象,分别是Http请求:HttpRequest对象、Http响应:HttpResponse对象。每次对一个页面进行请求时,Django会创建一个HttpRequest对象,用来传递原数据的请求。然后Django会加载被调用的视图,Views的第一个参数是HttpRequest,每个视图都负责返回一个HttpResponse目标。Django会自动创建HttpRequest对象,然而,HttpResponse对象需要由自己创建,每个View请求处理方法必须要返回一个HttpResponse对象。4.2.3DjangoModels对于模板来说,其实其本质过程就是读取模板(其中嵌套着模板的标签),然后将Model中获取到的数据再插入到模板中去,最后将信息返还给用户。而Model作为Django的抽象层,用来建立Web应用程序的数据并对它们进行管理。创建好项目后,就可以继续创建项目的应用(Application)。对于本项目来说,之前所实现的获取股票数据和利用机器学习算法训练数据,对应着Django项目中的一个模块,因此,需要对原来的代码进行一定程度的改写,将其变为面向对象的方法,使其变为Django的一个模型类。改写完后,将这些模型定义在models.py中,并继承models.Model类,这样之前所写的基于各种机器学习算法的预测就成为了Django项目中的一个model,使用import调用,将算法模块引入到此项目中,就可以使预测的输出的图线显示在前端界面中。完成后使用pythonmanage.pyrunserver启动项目,在浏览器输入默认端口号8000,就可以进入本系统,系统界面如下图所示:图4-SEQ图4-\*ARABIC2系统基本界面“算法”输入框可以选择想要使用的机器学习算法;“指数代码”输入框可以输入想要查询的指数代码,系统会调取该指数下的所有股票和股票数据,对其进行预测并输出在界面中;“股票代码”输入框可以输入想要查询的单个股票代码,系统会调取该指数下的股票数据并输出结果。图4-SEQ图4-\*ARABIC3系统基本功能按钮示意1)图4-4到图4-7为指数预测的举例,在算法一栏输入想要使用的算法,在指数代码处输入想要查询的指数代码,例如sz399350,包含股票为江淮汽车、精工钢构、伯特利、口子窖等,其预测结果会逐一在界面中显示。图4-SEQ图4-\*ARABIC4sz399350指数下股票预测结果图4-SEQ图4-\*ARABIC5sz399350指数下股票预测结果图4-SEQ图4-\*ARABIC6sz399350指数下股票预测结果图4-SEQ图4-\*ARABIC7sz399350指数下股票预测结果2)如图4-8,除了指数搜索外,也可以选择单个股票查询。输入想要预测的股票代码和想要实现的算法(最多可同时选择三种不同的算法),其预测结果会显示在界面中。如图4-8所示:图4-SEQ图4-\*ARABIC8采用移动平均算法和线性回归算法对浦发银行股票预测结果4.3系统完善经过上述内容,本系统已经大致成型,完成了基本的股票预测、图线输出和交互功能,在此又对本系统进行了完善,期望能让使用感有所提升。首先,在原有的系统基础上加入了登入登出功能,使用者可注册成为系统用户,登陆系统使用选股功能。原本的预测图线是由训练部分、预测部分和拟合部分组成,拟合部分的对所有的预测部分进行拟合,为了使预测结果更直观,在这基础上又对数据进行了一小部分后续的预测,即在预测-拟合图线的后面又绘制了一段预测图线,给出更直观的预测结果,使用户能更好的选择。同时,为了方便用户选股,在原有的功能基础上加入了股票排序功能和自定义指数功能。当用户选择一个指数下的股票预测时,系统会算出各个股票的收益率(即(预测集最高价-训练集最后一天收盘价)/训练集最后一天收盘价),根据股票的收益率对所选指数下的股票排序,按收益率由高到低输出预测的图像。可以给用户更直观的结果,帮助其直观的了解到该指数下购买哪支股票可能获得最高的收益;另外,除所有本地文件内的股票指数数据,用户还可以自定义指数。当用户自定义一个指数后,选择机器学习算法并点击查询按钮,系统会查找对应的Excel文件中所有股票数据,生成一个新的数据文件,作为参数传入,并所有该自定义指数下的股票预测。改进后的预测图线如下图所示(以sz399350指数下的部分股票为例),加入了后续预测和排序功能。图4-SEQ图4-\*ARABIC9系统完善后sz399350指数下的部分股票预测结果图4-SEQ图4-\*ARABIC10系统完善后sz399350指数下的部分股票预测结果图4-SEQ图4-\*ARABIC11系统完善后sz399350指数下的部分股票预测结果图4-SEQ图4-\*ARABIC12系统完善后sz399350指数下的部分股票预测结果5实证分析5.1效果分析本文引入均方根误差(Rmse)来对机器学习算法的效果进行评估。其作用是用来衡量观测值与真实值之间的误差,经常被用来作为机器学习模型预测结果衡量的标准。其公式为:RMSEX,h=(公式5-1均方根误差公式)计算结果为观测值与其真值之间的偏差,它可以很好的反应回归模型的拟合效果。其值越小,则拟合的效果越好。对于该值的计算,在之前使用的SKLearn数据包中提供了这个功能,直接调用即可计算出结果。5.2算法分析 对于本系统的预测,选取了线性回归算法、移动平均算法、K-临近算法和长短期记忆网络算法,对于这些算法的实现借助了Tensorflow库、SKLearn数据包等,保证了算法实现的准确性和高效性,避免了处理大量数据的繁琐问题。同时引入了Nummy、Pandas工具进行函数和矩阵运算,引入了Matplotlib来绘制股票图线。根据第二章的机器学习算法介绍可知,每种算法都有自己各自的特点,对于不同数据的预测结果也不尽相同。因此,本文在最后选取了几种典型的股票类型,针对不同的机器学习算法的预测结果进行了一定的分析,期望能够根据不同的股票类型找出最合适的算法。5.2.1LSTM算法首先,针对LSTM算法,由于其预测的实现十分依赖与当前的数据值,在第四章的内容中,对股票进行后续的预测时,当把校验值设置为0时,其预测图线波动非常大,这是由于当前的数值的变化较大,然而这种算法在训练数据时又对近期的数据集依赖较大。LSTM算法的理念是为了使其具有记忆功能,其特意设计的结构之中具有CEC的特点,误差向上依次传递时只有轻微的衰减,因此权值调整的时候,对于那些历史状态造成的影响和结尾状态造成的影响可以一起发挥作用,所以最终训练得到模型能够记忆很长时间内的变动曲线。针对这种特性,该算法对于长远的股票数据预测结果较好,得益于他的记忆功能,他可以很好的对长期数据进行预测,使得较长时间内的股票预测图线拟合效果最好。5.2.2线性回归算法线性,顾名思义,即两个变量间的关系是一次函数关系。人们在测量事物的时候,由于客观条件的限制,求得的往往都是测量值,而不是事物的真实的值。因此,为了能够得到事物的真实值,需要进行无限次的测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。线性回归算法,通俗的讲,就是把真实的数据,映射到坐标轴中。这些数据在坐标轴中,呈现出偏向线状的形状。构建一个函数,让这个函数对应的数据能够尽可能的接近真实的数据,让这个函数在坐标轴上画出的图像尽可能的穿过真实数据中的所有点。根据这种线性回归这种的特性和输出的预测图线,发现其对于那些具有稳定增长值得数据预测得效果较好,例如消费类股票,它们得股票价格随着时间的变化往往呈现逐渐增长的趋势,因此采用线性回归算法对这类股票的预测结果比较理想。5.2.3移动平均算法移动平均的本质其实就是滤波,即过滤掉时间序列中的高频扰动,保留原有的低频趋势。移动平均算法通过平均多个数值,消除需求波动中的随机因素,这种情况下,实际的需求有的时候高,有的时候低;如果前段时间比较低,接下来的时间内就可能变高,通过计算平均值,让高的部分和低的部分相互消除影响,这样我们就能使预测结果更平滑、更准确,也让需求预测更加稳定。由于它的这种特性,它更适合滚动的、周期类的数据,例如煤炭钢铁等股票,其股票价格随着时间往往呈现周期性变化,因此使用移动平均算法的拟合效果往往更好。5.2.4K-临近算法K-临近算法思路很简单,即按照距离来对事物进行分类,某样本在它所处的特征空间中,与K个最相近的样本中数量最多的那一个,属于相同类别。在本算法中,所挑中的邻居对象都是已有正确分类的,该方法在决定样本的分类时,只依赖那些与它最邻近的样本,去判定待预测样本的所属类别或数据走向。该算法的准确率较高,对于异常值和噪声的容忍度也很高虽然K-临近算法常用来对未知的事物进行判断,使用的领域大多是对未知事物的识别,但根据它判断离散数据的特性,K-临近算法非常适用于那些类域的交叉或重叠部分较多的样本集,即那些波动没有明显的规律、数据较为离散的股票数据,它们的股票价格随着时间的变化往往并没有呈现出明显的变化规律,数据分布不太均匀,例如医疗股票、互联网股票等,采用该算法得到的预测结果可能较其它几种较为准确.结论本文的研究基于机器学习算法,其出发点和结论基于特定时间(选取股票价格的时间)以及机器学习算法的特性,还需要进一步考察将来的市场情况和它的适应情况。此外,本文所展开的技术面分析基于三个假设:一是市场可以很好的消化那些会对股价造成影响的相关信息,例如上市、舆论等;二是历史将会不断地重复;三是股价的变化会是趋势性的。然而,在实际的生活中,股票价格、股市发展或受到各种各样的因素影响,例如宏观经济的发展、政治环境的变化、投资者的心理变化等等,所以在具体运用本文的系统时,仍需要根据一些实际情况进行改进和优化。本文所选取的机器学习算法都有其各自独特的有点,并且都有很广泛的应用范围,然而这些算法在实际的操作中仍然存在许多地方需要改进和完善。在之后的进一步研

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论