基于泰尔森回归的股票预测研究
绪论
背景
预测股市将如何变化历来是最困难的事情之一。这个预测行为中包含着如此之多的因素—包括物理或心理因素、理性或者非理性行为因素等等。所有这些因素结合在一起,使得股价波动剧烈,很难准确预测。但是,股票曲线的波动,往往代表的都是利益。比较传统的研究模型,大多是时序模型、神经网络模型等,在预测上,对于异常值的接受程度往往是非常敏感的。受到政策、资本、疫情、公司自身发展等因素的影响,往往会使得股票k线并不跟随我们想象那样波动,这样会使模型出现比较大的偏差,使得我们的结果数据严重的偏离我们实际值,如按照模型分析结果进行股票投资,将带来比较大的风险,有可能会造成较大的损失。
本项目设计采用的算法是TheilSenRegresion,该算法模型有很好的异常容忍度有,TheilSen回归是一种基于中值的估计量,因此它对损坏的数据(也就是离群值)更为稳健。在单变量设置中,如果是简单的线性回归,Theil-Sen的崩溃点约为29.3%,这意味着它可以容忍高达29.3%的任意损坏数据。
本项目将爬取东方财富网站的所有上市企业的数据信息保存到数据库中,并同金融数据接口toshare获取对应的股票数据集。并使用pycaret对数据集进行前期的预测分析与模型比较,以及参数的调整。最后通过sklearn的TheiSenRegresion数据包对模型进行预测处理。
目的
综合运用数据分析、与大数据技术手段,对股票数据信息数据进行分析预测。使用机器学习算法,挖掘股票K线数据变化的内在规律,使得模型算法能够规避一些现实中潜在的风险。
流程
1、数据源:https://tushare.pro/ 从东方财富网上爬取上市企业的的股票数据进行数据爬取,并保存到本地数据库中。
2、利用tushare金融工具,获取企业的股票数据变化信息,并对该数据使用pyecharts进行可视化分析,挖掘数据中潜在的规律。
3、利用pycaret对数据集进行模型比较,得出对泰尔森回归模型的平均绝对误差(Mean Absolute Error, MAE)、均方误差(Mean Squared Error, MSE)、均方根误差(Root Mean Square Error, RMSE)、平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)、确定系数(R-Square or R2)的相关信息,对模型效果进行比较。
4、模型应用,对历史数据进行预测,并利用pyecharts进行数据开盘价、收盘价、最高价、最低价、价格变动进行数据可视化。
5、数据批量处理。读取数据企业的股票信息,循环应用算法模型,对企业隔天收盘价进行预测。
6、对批量预测结果进行数据处理,得出明天会涨的企业股票。
主要内容
数据获取与数据存储
2.1.1 网站分析
目标网站:东方财富-沪深A股
目标url: http://quote.eastmoney.com/center/gridlist.html#hs_a_board
网站的数据信息是使用Ajax异步加载。想要反爬获取具体数据,方法非常简单,只需要找到正确网站所对于的url,通过获取json数据,我们就可以获取网页的具体数据信息。
2.1.2 数据查找
网站数据信息保存在:
get?cb=jQuery112407428295034149348_1592400963106&p…5,f22,f11,f62,f128,f136,f115,f152&_=1592400963107
通过chrom开发者模式,我们点击Preview,我们可以观察到我们需要的数据信息都保存在页面该json文件中。
主要的url为:
http://23.push2.eastmoney.com/api/qt/clist/get
其他数据信息为我们对页面请求的参数数据,我们通过构建向页面请求的params,来获取页面的具体数据。
2.1.3 数据爬取
tushareid: 379880
token:
我们通过对目标网站:http://23.push2.eastmoney.com/api/qt/clist/get 的数据请求,同时构造需要请求的参数信息,我们可以获取到数据的具体信息。
获取到的数据信息为json数据,我们只需要json.loads(data),就能获取到包含数据的列表信息,再通过get方法,data.get(‘data’).get(‘diff’),再循环,对我们刚刚构造的params数据进行传递页面跳转的参数,‘pn’: str(number),实现页面跳转,就能爬取所有的数据信息,以下是数据爬取的效果。
爬取数据展示
2.1.4 数据存储
为了使我们爬取的能够为我们接下的来的继续时候。我们将爬取到的数据集保存到mysql数据库当中。Mysql 是功能齐全的关系数据库管理系统。使用mysql进行数据存储,非常利于我们的数据管理。
数据pycharm与mysql连接上,我们使用python的pymysql库进行数据连接。
具体代码:
def Get_mysql(sql_, data):
conn = pymysql.connect(host="localhost",port=3306,user='root',passwd='2424',db='stock')
cursor = conn.cursor() #建立数据库连接
cursor.execute(sql_, data) #执行数据库操作
conn.commit() #提交事物
cursor.close() #关闭指针对象
conn.close() #关闭数据库连接对象
print("数据存储成功!")
存储数据库结果展示:
以上为数据库的存储结果。
数据调取以及案例数据分析
2.2.1 数据调取
为了我们接下来的数据分析,我们需要调取数据文件内容,以及使用tushare金融接口对数据集进行数据调取。
2.2.1.1 数据库数据获取
2.2.1.2 Tushare金融数据获取
我们将以股票代码为‘000882’,华联股份的股票信息为例进行获取。获取方式非常简单,只需要 用ts.get_hist_data ,就能获取到华联股份的股票是数据。
爬取到的信息非常多,按时间序列排序,由近到远排序。
2.2.2 数据探索
2.2.2.1缺失值统计
数据集中的缺失值数据对我们数据的整体性会造成很大的影响,我们需要对该数据信息进行整理。按照数据关系,填补或删除缺值所在的行或者列,这样使我们数据变得干净,能提高我们模型的准确度。
根据数据输出,我们数据非常的干净,并没有存在缺失值。这与我们使用的金融工具有关,我们使用的tushare 的数据集,是以及被处理干净的数据集,所有我们在我们使用过程会大大减少我们的工作量,是一个非常不错的金融工具。
2.2.2.2 描述性信息统计
通过数据的描述性信息统计,我们可以比较简单的观察到数据规律与数据的变化。
由描述性数据我们可以观察到,该股票的均价、收盘均价在2.5左右,我们目前的现价在1.96元。考虑到今年疫情的印象,该股票的存在0.5元左右的利润空间,长期持有收益率在25%左右。当然,这只是我们可以从粗略数据中看出的一些简单内容。更多数据描述我们应该用可视化方式来展示数据集的变化。
2.2.3 数据可视化
数据可视化上,我们选用的可视化工具是pyecharts,该可视化工具用很好的动态交互效果,能更加漂亮的展示我们的数据信息。并且,该工具能吧我们的可视化结果下载为html,这将为我们以后搭建web平台进行数据描述带来很大的帮助。
2.2.3.1 开盘价、收盘价、最高价、最低价
通过观察股票信息最高价、最低价、收盘价、开盘价的数据变化,我们能比较直观的观察到数据最近价格的变动情况。接下来我们来使用pyecharts 的kline,来绘制股票数据的变化。
红色代表数据开盘价比收盘价高,代表我们的股票在涨,深色的数据表示开盘价比收盘价低,在跌。箱的长度代表着我们数据的涨跌幅度。
通过可视化结果我们可以观察到,在2020-6-12日,我们股票在大涨,价格的变动幅度比较大,12日到下18好,价格的变动幅度比较小,在微跌。
观察2017年12-19日到2020年6月18日,的股票数据变化,我们在疫情期间我们股票出现熔断式跌,之后估计都在[1.8,2]元之间波动。观察3年的数据变化,我们目前的股价处在低谷,随着我国经济的复苏,在一月内将拥有0.5元的增长利润。是一个挺不错的选择。
2.2.3.2 开盘价与收盘价
通过观察股票的收盘价与开盘价,我们可以看见股票价格的波动,股票是在涨还是在跌。
从今年2020-6月开始,该股票总体的表现是在涨,收盘的价格都比开盘的价格高,有潜在的上次征兆。
最近两个月该股票的表现比较低迷,最高价收盘价只有2.04,最低收盘价1.79。每股利润最大波动0.25元。
2.2.3.3 最高价与最低价
通过最高价与最低价,我们可以观察到股票的潜力。
在2018-2019年区间,最高价为3.75,最低价2.06,利润波动1.69元。
在2019-2020年区间,最高价3.62,最低价2.03,利润波动1.59元。
在2020-今区间,最高价2.43,最低价1.9,利润波动0.52元。
按照近3年数据变化的规律,2020年的最高价应该也为3元以上,目前现价位1.96元,所有该股票的在未来半年的收益率在50%以上 ,利润空间将在1元附近波动。
2.2.3.4 收盘价与均价
通过观察收盘价与均价的变化,我们能观察目前的收盘价格与5日均价之间的关系。
观察上图,可以发现,最近一个月,收盘价都比5日均价的水平高说明最近一个月的总体水平在涨。由于中国疫情得到控制,经济在不断的复苏,企业的销售情况也在逐渐的变化。市场总体在利好。符合现实情况。
2.2.3.5 价格涨跌幅度
价格的涨跌幅度变化,能让我们直观的观察的价格的每日变化情况。
观察上图近一月的价格变动情况,我们可以清楚的看见,价格在大部分实际都是在涨,涨的幅度比跌的要大,股票价格在慢慢上升。符合我们前期的预测。
模型比较分析
模型比较是模型算法应用前期的重要环节。通过模型比较,能观察出模型的优略情况,通过数据模型的平均绝对误差(Mean Absolute Error, MAE)、均方误差(Mean Squared Error, MSE)、均方根误差(Root Mean Square Error, RMSE)、平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)、确定系数(R-Square or R2)的相关信息,对模型效果进行比较,我们能得出最优的算法模型。
在模型比较上,我们使用的是pycaret,该库能简单的对机器模型算法进行应该有,还能对数据进行前期的数据预处理,是一个非常好的选择。
2.3.1 模型初始化
我模型比价之前,我们先来确定数据集,我们选取收盘价、最高最低价格变化百分比、收盘开盘价格变动的百分比、5日均价、市场总值,这几列的数据作为我们最终的数据集选项。
我们先对数据集和进行初始化。最终我们预测的价格是收盘价。 总数据有607条数据,424条数据作为训练集,183条数据作为测试集。
以下是对模型比较的结果。
很明显,我们的TheilSen Regressor在数据集中的表现是最好的,平均绝对误差(Mean Absolute Error, MAE)、均方误差(Mean Squared Error, MSE)、均方根误差(Root Mean Square Error, RMSE)、平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)这几个的值是约小约好,可以清楚的看见,我们TheilSen Regressor的在其他模型上非常有优势。确定系数(R-Square or R2),R2越接近1时,表示相关的方程式参考价值越高;相反,越接近0时,表示参考价值越低。TheilSen Regressor的值为0.9849。非常接近于1,方程式参加价格非常高。
2.3.2模型创建
接下来,我们创建TheilSen Regressor模型,并对模型进行10次折交运算,最后输出10次折交验证的均值
通过10次折角运算,我们的模型的到进一步的提高,我们简单观察R2的值,相对于1次运算的0.9849。我们现在10次折交运算之后已经提升到0.9852。是一个不错的提升。
2.3.3 模型可视化
数据集与测试集分布比较都围绕回归线分布,数据集呈现正太分布的特征。
随着数据集的增大,我们数据评分一直在提高。损失函数的评分也在上升。
2.3.4 预测结果
下面是预测的结果数据。
模型应用
2.4.1案例测试应用
我们已经对数据进行测试,并且对模型进行了简单的使用,接下来,我们将规范化我们的数据函数,使得我们的模型能够输入股票代码就能输出预测隔天股票的价格数据信息,并且绘制开盘-收盘、最高-最低、涨跌幅曲线。结果保存到以股票代码命名的文件夹中。
我们首先进行属性构造,生成最高-最低变化比例,收盘开盘变化比例。选取’close’收盘价为目标预测属性,最高-最低变化比例、收盘开盘变化比例、十日均价、价格变动、价格总量为自变量。
同时,我们用5日均值作为最高-最低变化比例、收盘开盘变化比例、十日均价、价格变动、价格总量第二天的数据。测试集、训练集按照0.33:0.67比例进行数据集划分。同时调整TheilSenRegressor的参数信息。
并且,我们对预测结果进行输出。
通过主函数,我们传入股票信息,来查看数据集预测结果。
数据集预测结果
可视化文件 :
2.4.2 批量测试
在单个测试上,我们取得了不错的效果,能通过传入股票的代码,就能对股票信息进行数据爬取,并对数据进行预处理,最后输出预测结果,已经我们生成的可视化文件。下面我们将进行股票的批量预测,我们从数据库中,批量导入股票的代码,循环的写入测试模型中,将最后的结果保存在data.csv文件中,里面包含的数据有,股票代码,股票收盘价,预测结果。我们在进行股票预测时候,只需要对预测结果与收盘价进行简单的相减,只要预测结果大于收盘价,该在隔天将会上涨,否则,该股票价格将下跌。
我们只需要对单个数据添加循环,就可以对数据进行批量化的处理。为了预测效率,我们这里只选用400个股票的信息就行数据处理。为了不对tushare网站造成比较大的负担,我们对每抓取一次数据将对数据进行休息2秒。
以下数据的预测结果:
每一个股票代码文件夹里面,都保存这最高价-最低价、开盘价-收盘价、价格变动的html信息。
股票的可视化结果也以及保存成功。
2.5 预测结果
我们对以及保存的文件进行数据处理,用预测价格来减去收盘价,生成新一列数据。
以下,即为股票数据的波动情况。
当然,我们也可以输入股票的代码,来查看该股票的信息情况。