python股票预测_基于Python预测股价的那些人那些坑,请认真看完!【系列52】

2023-12-30 02:50

本文主要是介绍python股票预测_基于Python预测股价的那些人那些坑,请认真看完!【系列52】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原标题:基于Python预测股价的那些人那些坑,请认真看完!【系列52】

e869395bb20441bcb48b313a80bbe462.jpeg

11f5d5bd8f424fbcbfa6004a827dc8ef.jpeg

来源:AI科技大本营(rgznai100)

编辑部:

前几天我们已经看过此文,@爱可可发过一次,今天AI科技大本营又翻译了此文。这篇文章真的很不错,不是在于模型的好坏,而是在于作者对预测股价的一些心得和体会,编辑部觉得大家应该好好的看一下这篇文章,它告诉我们所有高大上的东西,想在资本市场去赚钱,还是有难度的,预测股价的方法千奇百出,但是要正真理市场解去做,这才是最重要的。

不要跟风,不要盲目,不要虚荣。

B是给别人装的!钱是给自己挣的!

对数据科学家来说,预测证券市场走势是一项非常有诱惑力的工作,当然,他们这样做的目的很大程度上并不是为了获取物质回报,而是为了挑战自己。证券市场起起伏伏、变幻莫测,试想一下,如果在这个市场里存在一些我们或者我们的模型可以学习到的既定模式,让我们可以打败那些商科毕业的操盘手,将是多么美妙。当然,当我一开始使用加性模型(additive model)来做时间序列预测时,我不得不先用模拟盘来验证我的模型在股票市场上的表现。

一众挑战者们都希望在每日收益率上能够跑赢市场,但是大多数都失败了,我也未能幸免。不过,在这个过程中也学到了大量Python相关知识,包括面向对象编程、数据处理、建模、以及可视化等等。同时,我也认清了一个道理,不要在每日收益率上锱铢必较,学会容忍适当的短期亏损,放长线才能钓大鱼。



3ecdf451d18f42089be5704a6a157098.png





0c8511b838d640869b0e85fa9b619690.png



一天与三十年对比结果:你宁愿把钱投在哪里?

在任何任务中(不只是数据科学),当我们没有取得立竿见影的成效时,我们都有三个选择:

1. 调整结果,让我们看起来像是成功了

2. 隐藏结果,所以没有人会注意到

3. 公开我们所有的结果和方法,以便其他人(以及我们自己)可以从中吸取经验和教训

显然,不管站在个人还是社会层面,方案三都是最佳选择,但它同时也是最需要勇气去实践的。我可以选择性地公布结果,比如当我的模型能够带来丰厚的利润回报时,我也可以掩盖失败的事实,假装自己从来没有在这项工作上花过时间。这似乎是很天真的想法!我们之所以能够进步是因为不断重复失败——学习这个过程,而不仅仅是之前的成功。而且,为有难度的任务编写Python代码而付出的努力也并不应该白费!

这篇文章记录了我使用Python开发的“stock explorer”工具——Stocker的预测功能。此前,我曾展示了如何使用Stocker进行分析,并且将完整的代码贴在GitHub上,以方便大家。

Github代码地址:

https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker

▌实现预测的Stocker工具

Stocker是一款用于探索股票情况的Python工具。一旦我们安装了所需的库(查看文档),我们可以在脚本的同一文件夹中启动一个Jupyter Notebook,并导入Stocker类:

fromstocker importStocker

现在可以访问这个类了。我们通过传递任一有效的股票代码(粗体是输出)来创建一个Stocker类的对象:

amazon = Stocker('AMZN')

AMZN Stocker Initialized. Data covers 1997-05-16 to 2018-01-18.

根据上面的输出结果,我们有20年的亚马逊每日股票数据可以用来探索! Stocker对象是建立在Quandl金融库上,而且拥有3000多只股票可以使用。我们可以使用plot_stock函数来绘制一个简单的历史股价图:

amazon.plot_stock()

Maximum Adj. Close = 1305.20 on 2018-01-12.Minimum Adj. Close = 1.40 on 1997-05-22.Current Adj. Close = 1293.32.



5912a083afb2472a91a4dab196f4490c.png

Stocker的分析功能可以用来发现数据中的整体趋势和模式,但我们将重点关注预测股票未来的价格上。Stocker中的预测功能是使用一个加性模型来实现的,该模型将时间序列视为季节性(如每日、每周和每月)的整体趋势组合。Stocker使用Facebook开发的智能软件包进行加性建模,用一行代码就可以创建模型并进行预测:

model, model_data = amazon.create_prophet_model(days=90)

Predicted Price on 2018-04-18 = $1336.98

注意,表示预测结果的绿线包含了相对应的置信区间,这代表在模型预测的不确定性。在这种情况下,如果将置信区间宽度设置为80%,这意味着我们预计这个范围将包含实际值的可能性为80%。置信区间将随着时间进一步扩大,这是因为随着预测时间距离现有数据的时间越来越远,预测值将面临更多的不确定性。任何时候我们做这样的预测,都必须包含一个置信区间。尽管大多数人倾向于一个确定的值,但我们的预测结果必须反映出我们生活在一个充满不确定性的世界!

任何人都可以做股票预测:简单地选择一个数字,而这就是你的估测(我可能是错的,但我敢肯定,这是华尔街所有人都会做的)。为了让我们的模型具有可信度,我们需要评估它的准确性。Stocker工具中有许多用于评估模型准确度的方法。

▌评估预测结果

为了计算准确率,我们需要一个测试集和一个训练集。我们需要知道测试集的答案,也就是实际的股价,所以我们将使用过去一年的历史数据(本例中为2017年)。训练时,我们不选用2014-2016的数据来作为训练集。监督学习的基本思想是模型从训练集中学习到数据中的模式和关系,然后能够在测试数据上正确地重现结果。

我们需要量化我们的准确率,所以我们使用了测试集的预测结果和实际值,我们计算的指标包括测试集和训练集的美元平均误差、正确预测价格变化趋势的时间百分比、以及实际价格落在预测结果80%置信区间内的时间百分比。所有这些计算都由Stocker自动完成,而且可视化效果很好:

amazon.evaluate_prediction()

Prediction Range: 2017-01-18 to 2018-01-18.

Predicted price on 2018-01-17 = $814.77.Actual price on 2018-01-17 = $1295.00.Average Absolute Error on Training Data = $18.21.Average Absolute Error on Testing Data = $183.86.When the model predicted an increase, the price increased 57.66% of the time.When the model predicted a decrease, the price decreased 44.64% of the time.The actual value was within the 80% confidence interval 20.40% of the time.



217ec579734b4a9680e23f06d21a474e.jpeg

可以看到,预测结果真是糟糕透了,还不如直接抛硬币。如果我们根据这个预测结果来投资,那么我们最好是买买彩票,这样比较明智。但是,不要放弃这个模型,第一个模型通常比较糟糕,因为我们使用的是默认参数(称为超参数)。如果我们最初的尝试不成功,那么我们可以调整这些参数来获得一个更好的模型。在Prophet模型中有许多不同的参数设置需要调整,最重要的是变点先验尺度(changepoint prior scale),它控制着模型在数据趋势上的偏移量。

▌变点先验(Changepoint Prior)的选择

变点代表时间序列从增加到减少,或者从缓慢增加到越来越快(反之亦然)。它们出现在时间序列变化率最大的地方。变点先验尺度表示在模型中给予变点的偏移量。这是用来控制过度拟合与欠拟合的(也被称为偏差与方差间的权衡)。

一个更高的先验能创造一个更多变点权重和更具弹性的模型,但这可能会导致过拟合,因为该模型将严格遵守训练数据的规律,而不能将它泛化到新的测试数据中。降低先验会减少模型的灵活性,而这又可能会导致相反的问题:欠拟合,当我们的模型没有完全遵循训练数据,而没有学习到底层模式时,这种情况就会发生。如何找出适当的参数以达到正确的平衡,这更多的是一个工程问题而不是理论问题,在这里,我们只能依靠经验结果。Stocker类有两种不同的方式来选择适当的先验:可视化和量化。 我们可以从可视化方法开始:

amazon.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2])



9f3a95512bdc43a0a88dfbb3254c2939.jpeg

在这里,我们使用三年的数据进行训练,然后显示了六个月的预测结果。我们没有量化这里的预测结果,因为我们只是试图去理解变点先验值的作用。这个图表很好地说明了过拟合与欠拟合!代表最小先验的蓝线与代表训练数据的黑线值并不是非常接近,就好像它有自己的一套模式,并在数据的附近随便选了一条路线。相比之下,代表最大先验的黄线,则与训练观察结果非常贴近。变点先验的默认值是0.5,它落在两个极值之间的某处。

我们还要注意先验值不同带来的不确定性(阴影区间)方面的差异。最小的先验值在训练数据上表现有最大的不确定性,但在测试数据上的不确定性却是最小。相比之下,最大的先验值在训练数据上具有最小的不确定性,但在测试数据上却有最大的不确定性。先验值越高,对训练数据的拟合就越好,因为它紧跟每次的观察值。但是,当使用测试数据时,过拟合模型就会因为没有任何数据点来定位而迷失掉。由于股票具有相当多的变化性,我们可能需要比默认模型更灵活的模型,这样才能够捕捉尽可能多的模式信息。

现在我们对先验值带来的影响有了一个概念,我们可以使用训练集和验证集对数值进行评估:

amazon.changepoint_prior_validation(start_date='2016-01-04',

end_date='2017-01-03', changepoint_priors=[0.001, 0.05, 0.1, 0.2])

Validation Range 2016-01-04 to 2017-01-03. cps train_err train_range test_err test_range0 0.001 44.475809 152.600078 149.373638 152.5647661 0.050 11.203019 35.820696 152.033810 139.5056242 0.100 10.722908 34.593207 152.903481 172.6542553 0.200 9.725255 31.895204 127.604543 324.376524

在这里,我们必须注意到,我们的验证集和测试集是不一样的数据。如果它们是一样的,那么我们会得到在测试数据上效果最好的模型,但是它只是在测试数据上过拟合了,而我们的模型也不能用于现实世界的数据。总的来说,就像在数据科学中通常所做的那样,我们正在使用三组不同的数据:训练集(2013-2015)、验证集(2016)和测试集(2017)。

我们用四个指标来评估四个先验值:训练误差、训练范围(置信区间)、测试误差和测试范围(置信区间),所有的值都以美元为单位。正如我们在图中看到的那样,先验值越高,训练误差越低,训练数据的不确定性越低。我们也可以看到,更高的先验能降低我们的测试错误。为了在测试集上获得更高的准确率,作为交换,随着先验的增长,我们在测试数据上得到了更大范围的不确定性。

Stocker先验验证还可以通过两条线来阐述这些点:



4d3cf3800eba4a3ca3fe3bf02364a699.png



0d62296675bc4c039b54fc41c6ecc203.png



基于不同变点先验尺度下,训练和测试准确性曲线和不确定性曲线

既然最高的先验值产生了最低的测试误差率,我们应该尝试再增加先验值来看看是否能得到更好的结果。我们可以通过在验证中加入其它值的方法来优化我们的搜索:

amazon.changepoint_prior_validation(start_date='2016-01-04',

end_date='2017-01-03', changepoint_priors=[0.15, 0.2, 0.25,0.4, 0.5, 0.6])

c3eb0d068f3a4ff590d492e0dde90fdd.png

改进后的训练和测试曲线

当先验值为0.5时,测试集的错误率将最小化。因此我们将重新设置Stocker对象的变点先验值。

amazon.changepoint_prior_scale = 0.5

我们可以调整模型的其他参数,比如我们期望看到的模式,或者模型使用的训练数据。找到最佳组合只需要重复上述过程,并使用一些不同的值。请随意尝试任意的参数!

▌评估改进的模型

现在我们的模型已经优化好了,我们可以再次评估它:

amazon.evaluate_prediction()

Prediction Range: 2017-01-18 to 2018-01-18.Predicted price on 2018-01-17 = $1160.43.Actual price on 2018-01-17 = $1295.00.Average Absolute Error on Training Data = $10.21.Average Absolute Error on Testing Data = $99.99.When the model predicted an increase, the price increased 56.90% of the time.When the model predicted a decrease, the price decreased 44.00% of the time.The actual value was within the 80% confidence interval 95.20% of the time.



efc36b84d78b4f8e84364ad403c655c9.jpeg

现在看起来好多了! 这显示了模型优化的重要性。使用默认值可以提供第一次合理猜测,但是我们需要确定,我们正在使用正确的模型“设置”,就像我们试图通过调整平衡和淡入淡出来优化立体声的声音那样(很抱歉引用了一个过时的例子)。

▌玩转股票市场

股票预测是一个有趣的实践,但真正的乐趣在于观察这些预测结果在实际市场中会发挥多好的作用。使用evaluate_prediction函数,我们可以在评估期间使用我们的模型“玩一玩”股票市场。我们将使用模型预测给出的策略,与我们在整个期间简单地购买和持有股票的策略进行一个对比。

我们的策略规则很简单,如下:

1、当模型预测股价会上涨的那一天,我们开始买入,并在一天结束时卖出。当模型预测股价下跌时,我们就不买入任何股票;

2、如果我们购买股票的价格在当天上涨,那么我们就把股票上涨的幅度乘以我们购买的股票的数量;

3、如果我们购买的股票价格下跌,我们就把下跌的幅度乘以股票的数量,计作我们的损失。

在整个评估期间,也就是2017年,我们每天以这样的方式进行股票操作。将股票的数量添加进模型回馈里面,Stocker就会以数字和图表显示的方式告诉我们这个策略是如何进行的:

amazon.evaluate_prediction(nshares=1000)

You played the stock market in AMZN from 2017-01-18 to 2018-01-18 with 1000 shares.When the model predicted an increase, the price increased 57.99% of the time.When the model predicted a decrease, the price decreased 46.25% of the time.The total profit using the Prophet model = $299580.00.The Buy and Hold strategy profit = $487520.00.Thanks for playing the stock market!

548544eca61e445eb4c58a0f8bb17432.jpeg

上图告诉了我们一个非常宝贵的策略:买入并持有!虽然我们可以在策略上再作出相当大的调整,但更好的选择是长期投资。

我们可以尝试其他的测试时间段,看看有没有什么时候我们的模型给出的策略能胜过买入和持有的方法。我们的策略是比较保守的,因为当我们预测市场下跌的时候我们不进行操作,所以当股票下跌的时候,我们期待有比持有策略更好的方法。

58f27e4c3c31418d85c44d32f52f13c2.jpeg

一直用虚拟货币实验

我就知道我们的模型可以做到这一点!不过,我们的模型只有在已经有了当天的数据时才能战胜市场,也就是说还只是事后诸葛亮。

▌对股票未来价格的预测

现在我们有了一个像样的模型,然后就可以使用predict_future()函数来对股票未来价格的进行预测。

amazon.predict_future(days=10)

amazon.predict_future(days=100)

cde4d33b792140d1b860237a7a3bd7f0.png

f4b4a0bb8c564efbbfd14634208eddd9.jpeg

预测接下来10天和100天的股票价格趋势

这个模型和大多数“专业人士”一样,总体上看好Amazon这支股票。另外,我们按照预期做出的估计,不确定性会进一步增加。实际上,如果我们使用这个模型策略进行交易,那我们每天都可以训练一个新的模型,并且提前预测最多一天的价格。

虽然我们可能没有从Stocker工具中获得丰厚的收益,但是重点在于开发过程而不是最终结果! 在我们尝试之前,我们实际上不知道自己是否能解决这样一个问题,就算最终失败,也好过从不尝试!任何有兴趣检查代码或使用Stocker工具的人,都可以在GitHub上找到代码。(https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker)

作者 | William Koehrsen

原文 | https://towardsdatascience.com/stock-prediction-in-python-b66555171a2

责任编辑:

这篇关于python股票预测_基于Python预测股价的那些人那些坑,请认真看完!【系列52】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551477

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主