写点什么

Python 数据挖掘与机器学习实战(五):基于线性回归的股票预测

  • 2020-02-01
  • 本文字数:2857 字

    阅读完需:约 9 分钟

Python数据挖掘与机器学习实战(五):基于线性回归的股票预测

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

编者按:本文节选自方巍著《Python 数据挖掘与机器学习实战》一书中的部分章节。

3.5 基于线性回归的股票预测

线性回归预测算法一般用以解决“使用已知样本对未知公式参数的估计”类问题。线性回归在整个财务中广泛应用于众多应用程序中。本节将介绍如何使用线性回归进行股票特征的提取与预测。

3.5.1 数据获取

本节使用的股票数据从大型数据网站www.quandl.com获取,股票数据特征包括:开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)、交易额(Volume)及调整后的开盘价(Adj.Open)、最高价(Adj.High)、最低价(Adj.Low)、收盘价(Adj.Close)和交易额(Adj.Volume)。获取到的原始数据如图 3-5 所示。



图 3-5 数据集中的部分数据示例 1



图 3-5 数据集中的部分数据示例 2

3.5.2 数据预处理

由于带 Adj 前缀的数据是除权后的数据,更能反映股票数据特征,所以主要使用的数据特征为调整后的开盘价、最高价、最低价、收盘价和交易额(即 Adj.Open、Adj.High、Adj.Low、Adj.Close 和 Adj.Volume)。


两个数据特征如下:


(股票最高价与最低价变化百分比):


(股票收盘价与开盘价的变化百分比):


于是,自变量为:。因变量为:


最后,对自变量数据进行规范化处理,使之服从正态分布。只需要执行以下语句就可以达到预处理的目的,代码如下:


X = preprocessing.scale(X)
复制代码


使用 Sklearn 做线性回归,首先导入相关函数:


from sklearn.linear_model import LinearRegression
复制代码


建立线性回归模型:


clf = LinearRegression(n_jobs=-1)
复制代码


进行线性模拟:


clf.fit(X_train, y_train)
复制代码


使用 predict()函数对需要预测的数据进行预测:


forecast_set = clf.predict(X_lately)
复制代码


模型的评估主要使用精度(accuracy)参数。调用线型模型中的精度评估函数 score()。


accuracy = clf.score(X_test, y_test)
复制代码

3.5.3 编码实现

完整的 Python 实现代码如下:


import quandlfrom sklearn import preprocessing#df = quandl.get('WIKI/GOOGL'),先注释这一行,预测Google股票再用df = quandl.get('WIKI/AAPL')import mathimport numpy as np# 定义预测列变量,它存放研究对象的标签名forecast_col = 'Adj. Close'# 定义预测天数,这里设置为所有数据量长度的1%forecast_out = int(math.ceil(0.01*len(df)))# 只用到df中的下面几个字段df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]# 构造两个新的列# HL_PCT为股票最高价与最低价的变化百分比df['HL_PCT']=(df['Adj. High'] - df['Adj. Close'])/ df['Adj. Close'] * 100.0# PCT_change为股票收盘价与开盘价的变化百分比df['PCT_change']=(df['Adj.Close']- df['Adj.Open'])/df['Adj. Open'] * 100.0# 下面为真正用到的特征字段df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]#因为scikit-learn并不会处理空数据,需要把为空的数据都设置为一个比较难出现的值#这里    取-99999,df.fillna(-99999, inplace=True)# 用label代表该字段,是预测结果# 通过让Adj. Close列的数据往前移动1%行来表示df['label'] = df[forecast_col].shift(-forecast_out)# 最后生成真正在模型中使用的数据X?y,以及预测时用到的数据数据X_latelyX = np.array(df.drop(['label'], 1))X = preprocessing.scale(X)# 上面生成label列时留下的最后1%行的数据,这些行并没有label数据,因此可以拿它们    作为预测时用到的输入数据X_lately = X[-forecast_out:]X = X[:-forecast_out]# 抛弃label列中为空的那些行df.dropna(inplace=True)y = np.array(df['label'])# scikit-learn从0.2版本开始废弃cross_validation,改用model_selectionfrom sklearn import  model_selection, svmfrom sklearn.linear_model import LinearRegression# 开始前,先把X和y数据分成两部分,一部分用来训练,一部分用来测试X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y,     test_size=0.2)# 生成scikit-learn的线性回归对象clf = LinearRegression(n_jobs=-1)# 开始训练clf.fit(X_train, y_train)# 用测试数据评估准确性accuracy = clf.score(X_test, y_test)# 进行预测forecast_set = clf.predict(X_lately)print(forecast_set, accuracy)import matplotlib.pyplot as pltfrom matplotlib import styleimport datetime# 修改matplotlib样式style.use('ggplot')one_day = 86400# 在df中新建Forecast列,用于存放预测结果的数据df['Forecast'] = np.nan# 取df最后一行的时间索引last_date = df.iloc[-1].namelast_unix = last_date.timestamp()next_unix = last_unix + one_day# 遍历预测结果,用它向df中追加行# 这些行除了Forecast字段,其他都设为np.nanfor i in forecast_set:    next_date = datetime.datetime.fromtimestamp(next_unix)    next_unix += one_day    # [np.nan for_in range(len(df.columns)-1)]生成不包含Forecast字段的列表    # 而[i]是只包含Forecast值的列表    # 上述两个列表拼接在一起就组成了新行,按日期追加到df的下面    df.loc[next_date] = [np.nan for _ in range(len(df.columns)- 1)] + [i]# 开始绘图df['Adj. Close'].plot()df['Forecast'].plot()plt.legend(loc=4)plt.xlabel('Date')plt.ylabel('Price')plt.show()
复制代码

3.5.4 结果分析

以股票代号为 GOOGL 和 AAPL 的股票为例,线性模拟的结果如图 3-6 和图 3-7 所示。


上面对两个股票进行了线性模拟,并对一部分数据进行了预测。实验结果显示,对 GOOGL 股票的预测精度达到了 0.976871737402434;对 AAPL 股票的预测精度达到了 0.9719097855057968,表明该程序能对股票数据进行较好的预测。



图 3-6 GOOGL 股票数据预测结果


说明:图中的曲线部分为历史数据,最上部的竖直线部分为预测数据。



图 3-7 AAPL 股票数据预测结果


说明:除图中最上部的竖直线部分为预测数据,其余曲线均为历史数据。


图书简介:https://item.jd.com/12623592.html?dist=jd



相关阅读


Python数据挖掘与机器学习实战(一):Python语言优势及开发工具


Python数据挖掘与机器学习实战(二):Python语言简介


Python数据挖掘与机器学习实战(三):网络爬虫原理与设计实现


Python数据挖掘与机器学习实战(四):用 Python 实现多元线性回归


Python数据挖掘与机器学习实战(五):基于线性回归的股票预测


公众号推荐:

AIGC 技术正以惊人的速度重塑着创新的边界,InfoQ 首期《大模型领航者AIGC实践案例集锦》电子书,深度对话 30 位国内顶尖大模型专家,洞悉大模型技术前沿与未来趋势,精选 10 余个行业一线实践案例,全面展示大模型在多个垂直行业的应用成果,同时,揭秘全球热门大模型效果,为创业者、开发者提供决策支持和选型参考。关注「AI前线」,回复「领航者」免费获取电子书。

2020-02-01 16:202591

评论 1 条评论

发布
用户头像
专家老师您好,我是Ryan Ding来自亮数据。我们是品牌方,寻求付费商业合作。请加我微信联系 ryanding-brd
2024-03-19 15:17 · 美国
回复
没有更多了
发现更多内容

分析 | 通过 NFTScan 率先捕获 NFT 投资趋势

NFT Research

NFT

OpenHarmony生态贡献获肯定,华秋践行加速硬件创业初心

华秋电子

【网络安全】CVE漏洞分析以及复现

网络安全学海

网络安全 安全 信息安全 计算机 渗透测试

Django 的基础模板和模板文件重构

宇宙之一粟

Python django 三周年连更

破防了!这个在Ins上保存视频到手机相册的方法把我给感动哭了!

frank

Appuploader证书申请教程

雪奈椰子

网络视频监控如何入门?如何安装和配置、设备选择和实时监控?

wljslmz

三周年连更

大文件传输的3个重要替代方案

镭速

九科信息与统信、电科申泰完成产品适配联合认证

九科Ninetech

RPA 信创

【揭秘】智慧公厕监控系统,让你告别糟糕公厕体验!

光明源智慧厕所

智慧城市

AI的道德风险测试:偏见风险

陈磊@Criss

报名开启,明天直播!龙蜥社区多位专家在线报告 | 2023 大学生操作系统大赛培训会

OpenAnolis小助手

活动 操作系统 计算机 大学生 龙蜥社区

Ins保存图片保姆级教程!拯救手残党的图文教程,速来GET!

frank

Appuploader证书申请教程

MySQL WHERE 子句

Node 版本控制

程序员海军

Node 三周年连更

数据治理体系建设与实践

Openlab_cosmoplat

数据治理 开源社区

劝人写码,千刀万剐——“前端已死”难道要成真了?

引迈信息

前端 大前端 低代码 JNPF

C++ 数组

雪奈椰子

《简化iOS APP上架流程,App Uploader助你搞定!》

雪奈椰子

MySQL 序列使用

政企数智办公巡展回顾 | 通信赋能传统行业数智化转型的应用实践

融云 RongCloud

音视频 办公 即时通讯IM 数智化 通讯

C++ 基本的输入输出

雪奈椰子

C++ 基本语法

雪奈椰子

Appuploader安装指南

雪奈椰子

《简化iOS APP上架流程,App Uploader助你搞定!》

MySQL 教程

重塑元宇宙体验!3DCAT元宇宙实时云渲染解决方案来了

3DCAT实时渲染

元宇宙 元宇宙解决方案

仅需三步,快速打造指标数据应用

Kyligence

数据分析 指标平台

Appuploader安装指南

如何快速在手机中查看UDID,无需itunes、itools

Python数据挖掘与机器学习实战(五):基于线性回归的股票预测_大数据_方巍_InfoQ精选文章