阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

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

    阅读完需:约 9 分钟

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

编者按:本文节选自方巍著《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数据挖掘与机器学习实战(五):基于线性回归的股票预测


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2020-02-01 16:202385

评论 1 条评论

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

小程序容器技术加入到混合App开发队伍

Geek_99967b

小程序 混合开发

在小程序中开启直播的解决方案

Geek_99967b

小程序容器 小程序开发

行业智能化走向何方?昇腾AICE带来的新范式,新起点

脑极体

技术团队如何高效落地代码CR

慕枫技术笔记

架构 后端 9月月更

LeetCode-26. 删除有序数组中的重复项(java)

bug菌

9月日更 Leet Code 9月月更

剖析智能运维的五大应用场景

穿过生命散发芬芳

智能运维 9月月更

Dubbo Mesh:从服务框架到统一服务控制平台

阿里巴巴中间件

阿里云 微服务 云原生 dubbo

对jdbc的讲解

楠羽

JDBC 笔记 9月月更

设计模式的艺术 第八章建造者设计模式练习(开发一个视频播放软件,为了方便用户使用,该播放软件提供多种界面显示模式,例如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异。例如,在精简模式下只显示主窗口、控制条)

代廉洁

设计模式的艺术

为什么要用小程序容器做小程序生态

Geek_99967b

小程序 小程序容器 小程序开发

数据治理的内核:数据质量

Taylor

数据治理 数据质量管理 数据质量 数据生命周期

MVCC

急需上岸的小谢

9月月更

DDD领域驱动设计

源字节1号

软件开发 前端开发 后端开发 软件设计思想

深入学习SAP UI5框架代码系列之四:HTML原生事件 VS UI5 Semantic事件

Jerry Wang

JavaScript SAP SAP UI5 ui5 9月月更

使用 CRD 开启您的 Ingress 可观测之路

观测云

C++学习------iso646.h与limits.h头文件的源码学习

桑榆

c++ 9月月更

跟着卷卷龙一起学Camera--AWB

卷卷龙

ISP 9月月更

动态规划-编辑距离

wing

LeetCode-21. 合并两个有序链表(java)

bug菌

9月日更 Leet Code 9月月更

「工作小记」接口请求数据的缓存实践

叶一一

前端 设计思维 9月月更

小程序能否成为电商的突破口

Geek_99967b

小程序 小程序开发

2022服贸会 | 洞见科技姚明:从智能化到密态化,数据科技向善升级

洞见科技

前端食堂技术周刊第 51 期:pnpm v7.10.0、8 月登陆网络平台的新内容、重新思考流行的 Node.js 模式和工具、打包 JavaScript 库的现代化指南

童欧巴

chrome Node React Chrome开发者工具 pnpm

轻松理解20种常用AI算法

Baihai IDP

AI 算法

观测云&亚马逊云科技「可观测性体验日」北京站圆满落幕

观测云

Dragonfly 基于 P2P 的文件和镜像分发系统

SOFAStack

容器 云原生 镜像 日志 文件

业务应用小程序化,一种潜在的技术趋势

Speedoooo

小程序 移动开发 小程序容器

计算机网络——速率相关的性能指标

StackOverflow

计算机网络 编程‘ 9月月更

ShareSDK Android端主流平台分享示例

MobTech袤博科技

an'droid

Vue基础语法--插槽(Slot)基础使用

Sam9029

Vue 前端 基础 9月月更

SD-WAN网络可靠性设计

阿泽🧸

9月月更 网络可靠性设计

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