作者:Max,「数据游戏」优胜队伍成员

前阵子报名参加了「数据游戏」比赛,题目是预测5月15号(星期三)招商银行的股价,截止时间是在5月12号(星期天)。在本次预测中,我用到的是岭回归。

岭回归

岭回归是回归的一种,它解决回归中重大疑难问题:排除多重共线性,进行变量的选择,在存在共线性问题和病态数据偏多的研究中有较大的实用价值。按照度娘百科的解释:岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

多重共线性指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。

由于岭回归涉及的数学知识比较复杂,且文章篇幅有限,这里不过多展开。

数据获取

本次数据是通过 Tushare 的 get_hist_data() 获取的。Tushare 是一个免费、开源的 python 财经数据接口包。python 安装 tushare 直接通过 pip install tushare 即可安装。

import tushare as ts
data = ts.get_hist_data('600848')
复制代码

运行之后可以查看它的前后几行数据。按照 tushare 官方的说明,get_hist_data() 只能获取近3年的日线数据,而他的返回值的说明是这样的:

  • date:日期;
  • open:开盘价;
  • high:最高价;
  • close:收盘价;
  • low:最低价;
  • volume:成交量;
  • price_change:价格变动;
  • p_change:涨跌幅;
  • ma5:5日均价;
  • ma10:10日均价;
  • ma20:20日均价;
  • v_ma5:5日均量;
  • v_ma10:10日均量;
  • v_ma20:20日均量

均价的意思大概就是股票 n 天的成交价格或指数的平均值。均量则跟成交量有关。至于其他的返回值,应该是一下子就能明白的吧。在获得数据之后,我们查看一下描述性统计,通过data.describe()查看是否存在什么异常值或者缺失值。

这样看来似乎除了由于周末以及节假日不开盘导致的当天的数据缺失以外,并没有其他的缺失和异常。但是这里我们不考虑节假日的缺失值。

数据预处理

由于获取的数据是按日期降序排序,但本次预测跟时间序列有关,因此我们需要把顺序转一下,让它按照日期升序排序。

data1 = data[::-1]
复制代码

处理完顺序之后,我们要做一下特征值的选择。由于 volume 以及均量的值很大,如果不进行处理的话,很可能对整体的预测造成不良影响。由于时间有限,而且考虑到运算的复杂度,这里我没有对这些特征进行处理,而是直接将它们去掉了。至于均价,我是按照自己的理解,和10日均价、20日均价相比,5日均价的范围没那么大,对近期的预测会比另外两个要好,因此保留5日均价。接着,我用 sklearn.model_selection 的 cross_val_score,分别查看除 'open', 'close', 'high', 'low', 'ma5' 以外的其他剩余属性对预测值的影响。发现 、 'p_change'、'price_change'这两个属性对预测结果的影响不大,为了节省内存,增加运算速度,提高预测的准确性,也直接把它们去掉了。完了之后,查看前后三行数据。

data1 = data1[['open','high','low','ma5','close']]
data1.head(3), data1.tail(3)
复制代码

建模预测

由于提交截止日期是周日,预测的是周三,因此需要先对周一周二的信息进行预测。在这里我突然想到一个问题,是用前一天的所有数据来训练模型以预测当天的 close 比较准确,还是用当天除了 close 以外的其他数据来训练模型以训练当天的 close 比较准呢?为了验证这个问题,我分别对这两种方法做了实验。

为了减少代码量,定义了一个函数用以评估模型的错误率。

def get_score(X_train, y_train):ridge_score = np.sqrt(-cross_val_score(ridge, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))return np.mean(ridge_score)
复制代码

用前一天的所有数据来当训练集

y_train = data1['close'].values[1:]
X_train = data1.values[:-1]
score = get_score(X_train, y_train)
复制代码

输出结果大约为0.469,这个错误率就比较大了,不太合理,更何况还要预测其他特征值作为测试数据。

用当天除了 close 以外的其他数据来当训练集

data2 = data1[:]
y_train = data2.pop('close').values
X_train = data2.values
score = get_score(X_train, y_train)
复制代码

输出结果大约为0.183,跟第一个相比简直好多了。所以,就决定是你了!

接下来建模并把模型保存下来:

y_train = data1['close']
X_train = data1[['open', 'high', 'low', 'ma5']]
close_model = ridge.fit(X_train, y_train)
joblib.dump(ridge, 'close_model.m')
复制代码

在预测之前呢,我们先拿训练集的后8组数据做一下测试,做个图看看:

scores = []
for x in X_train[-8:]:score = close_model.predict(np.array(x).reshape(1, -1))scores.append(score)
x = np.arange(8)
fig, axes = plt.subplots(1, 1, figsize=(13, 6))
axes.plot(scores)
axes.plot(y_train[-8:])
plt.xticks(x, data1.index[-8:].values, size=13, rotation=0)
复制代码

看到这样子我还是相对比较放心的,不过,这个模型的训练值除了 close 以外的属性都是已知的,要预测三天后的还得预测前两天的测试值。

def get_model(s):y_train = data1[s].values[1:]X_train = data1.values[:-1]model = ridge.fit(X_train, y_train)return model
def get_results(X_test):attrs = ['open', 'high', 'low', 'ma5']results = []for attr in attrs:result = get_model(attr).predict(X_test)results.append(result)return results
复制代码

接下来预测三天的股价:

X_test = data1[-1:].values
for i in range(3):results = get_results(X_test)close = close_model.predict(np.array(results).reshape(1, -1))print(close)results.append(close)X_test = np.array(results).reshape(1, -1)
print("5月15日招商银行关盘时的股价为:" + str(round(close[0], 2)))
复制代码

输出结果为:

[33.46370029] [33.4532047] [33.43836721]

5月15日招商银行关盘时的股价为:33.44

总结

虽然预测结果是这样子,但感觉这样预测似乎很菜啊。毕竟预测的每个值都会有偏差,多个偏差累加起来就很多了,这让我有点害怕。不知道存不存在不预测其他值直接预测close的方法,或者说直接预测5月15号的而不用先预测13、14号的方法。虽然我知道有种算法是时间序列算法,但不是很懂。希望哪位大神看了能给我一些建议,指点迷津。

对于一个自学数据分析的在校学生,苦于没有项目经验,正好赶上这次的「数据游戏」,能利用此次机会操作一波真的很不错。既能学到东西,获胜的话还能得到奖品。

Ad Time

学习更多数据科学知识请关注微信公众号:read_csv

参与数据科学活动请加 QQ 群:759677734

「数据游戏」:使用岭回归预测招商银行的股价相关推荐

  1. 「数据游戏」:使用 ARIMA 算法预测三日后招商银行收盘价

    作者:天琼,「数据游戏」优胜队伍成员 介绍 本文整理记录了参与的一次小型数据分析竞赛「数据游戏」,竞赛目标是预测2019年5月15日A股闭市时招商银行600036的股价. 主要思路是利用ARIMA算法 ...

  2. 从「猜画小歌」,谈企业的「数据困惑」该何去何从?

    「猜画小歌」坐拥5000万组大数据,你怎么看? Google很会玩. 当所有做云计算.大数据.手机的厂商在广而告之其先进的技术能力时,通常采用直白宣讲式的说教,落地的东西却很少,听多了也就是过眼烟云. ...

  3. 腾讯AI Lab x 王者荣耀:开放让「AI+游戏」想象力落地

    感谢阅读腾讯AI Lab微信号第81篇文章.本文将介绍腾讯 AI Lab 与王者荣耀共同推进的 AI+游戏开放平台计划. 8月18日,王者荣耀「无限开放计划交流会」在深圳举办,这是一次「造梦之旅」的开 ...

  4. 「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

    在前面一文中,正式引出了SSIS专业数据ETL工具,笔者仅能作引路作用,未能使用文章的方式给大家写出更多的入门级的文章,希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习. 同时也想给大家分 ...

  5. 不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口?...

    雷锋网 AI 科技评论按:人工智能经过漫长发展,近些年成功突破技术与算力上的限制,因此得以在新世纪发挥着举足轻重的作用.不过随之而来是一系列的新问题--最典型的比如「数据孤岛」问题.该问题一日不被解决 ...

  6. 花了几百万,仍然无法消除「数据孤岛」,这份数字化建设方案下载

    中国信息化建设发展了几十年,像政府和央企.国企这类不差钱的,很多系统购买的原因之一就是"消除数据孤岛".这个口号喊了几十年,结果系统是越来越多,数据孤岛也越来越严重.就像给裤子打补 ...

  7. 史上最强攻略!手把手教你建「数据中台」!

    文章转自「首席数字官」 ID:ChiefDigitalOfficer 作者:李国欢 4 月 24 日晚,由数澜科技联合锦囊专家共同打造的<数据中台硬核汇>系列线上微课第一讲火热开启.100 ...

  8. 分享预告:「数据安全问题」+「 股权与期权」

    这些点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 本周星球分享话题预告 - 技术人系列:一个给阿里提的 ...

  9. 全文详解:「深度学习」如何协助处理医疗中的「数据难题」

    原文来源:WordPress 作者:Luke Oakden-Rayner 「雷克世界」编译:嗯~是阿童木呀.KABUDA.EVA 医疗数据很难处理. 在医学成像中,数据存储(档案)是基于临床假设进行操 ...

最新文章

  1. aes离线解密工具_CrazyCrypt2.1勒索病毒已有一键解密工具
  2. win内置ubuntu安装_win10安装内置ubuntu教程
  3. python 文件操作的模块_Python之文件操作修改模块
  4. Spring5参考指南:组件扫描
  5. java 暂停循环_java小白关于while死循环时处理办法的一发求助帖
  6. 磁盘读写流程和网络读写流程
  7. 期待!小米电视5官曝新功能:可准确识别家中每一个人
  8. linux下实现在程序运行时的函数替换(热补丁)
  9. cadz轴归零命令_cad 中z轴归0方法
  10. php完美导出word,使用phpword插件实现word文档导出
  11. 微信开发工具导入git项目
  12. java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
  13. R forcast auto arima用法
  14. unreal无损音乐百度云_Roxette女主唱Marie Fredriksson - Den Standiga Resan 个人瑞典语专辑 [APE]...
  15. QA问答系统总体介绍
  16. 胡歌12年后首谈车祸:既然活下来了,就不能白白活着
  17. 电商平台如何才能对接银行分账核算服务?
  18. 选对池塘钓大鱼([美]雷恩·吉尔森)第五章 挑选一口池塘:选择公司
  19. 如何选购电子烟?FLOCO乐氪满足你一切需求
  20. Git相关:Gitee的PR显示权限形同虚设?

热门文章

  1. 干鱼尺寸分拣视觉系统
  2. PL/SQL开发常见SQL知识
  3. 批处理文件获取本机mac地址与ip地址
  4. 一组数中寻找加和最接近某个值的组合 JAVA实现
  5. ROS-Control专题:PR2的六个概念【4】
  6. 压力传感器PFPL203 3BSE055365R1 NPI-15J-C00903 GE/Nova70M P7620C0042A A1004 A1020 C0040 C0042B LPE9400
  7. 方向向量转欧拉角_如何将欧拉角转换为方向向量?
  8. 【elasticsearch】search type 含义与使用
  9. js动态写入check; 设置 checked; 选取,获取数据
  10. 第十八届全国大学生智能汽车竞赛网络报名方法