干货丨 用 Python 进行股票分析
人们很容易被丰富的数据和各种免费开源工具所吸引。在研究了quandl financial library和prophet modeling library之后,我打算试着探究简单的股票数据。我花了几天的时间,前后写了1000多行Python代码,最终得出了一个完整的股票分析预测工具。虽然我没有自信用这个来投资某些个股,但在整个过程中我学到了很多Python的知识。秉承开源的精神,在这里我打算分享这些代码,让更多的人受益。
本文将展示如何使用Stocker,这是基于Python的股票分析预测工具。我看过一些对象导向的Python编程书籍,但就像大多数编程书籍一样,当我阅读这些书时,我并没有真正理解当中的内容。只有当我在深入一个项目,且遇到从未解决问题时,我才会终于理解那些概念,这也再次证明了实践比理论更重要。除了探索Stocker之外,我们还会涉及一些重要的内容,包括Python的基础知识和加性模型(additive model)。如果你想使用Stocker,可以在GitHub上找到完整的代码以及使用文档。Stocker很简单易用,即使是Python初学者也能学会,我建议每个人都试试。下面让我们一起看看Stocker的分析能力!
Stocker入门
在安装完需要的库之后,我们首先要将Stocker类导入到Python会话中。这里可以使用交互式Python会话或者在脚本目录中启动Jupyter Notebook。
from stocker import Stocker
现在,我们的Python会话中有了Stocker类,接着可以用它来创建类的实例。在Python中,类的实例称为对象,创建对象有时称为实例化或构造。为了创建一个Stocker对象,我们需要传递一个有效的股票代码。
microsoft = Stocker('MSFT') MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.
现在,我们有了具有Stocker类属性的microsoft对象。Stocker建立在quandl WIKI数据库上,因此我们可以访问3000多只美国股票,并且可以查看多年的每日价格数据。这里我建议使用微软的数据。尽管微软被认为是开源的对立面,但他们最近做了一些改变,因此我认为他们正在接受开源社区(包括Python)。
Python中的类由两个主要部分组成:属性和方法。没有太多的细节,属性是与类相关的值或数据,或者是类的特定实例(对象)。方法是类中可用于数据的函数。Stocker对象的一个属性是特定公司的股票数据,当我们进行构造时,属性与该对象相关联。我们可以访问该属性,并将其分配给另一变量进行检查:
# Stock is an attribute of the microsoft object stock_history = microsoft.stock stock_history.head()
微软股票数据
Python类的好处是方法(函数)和所操作的数据与同一个对象相关联。我们可以使用Stocker对象的方法来绘制股票的历史股价。
# A method (function) requires parentheses microsoft.plot_stock() Maximum Adj. Close = 89.58 on 2018-01-12. Minimum Adj. Close = 0.06 on 1986-03-24. Current Adj. Close = 88.35.
默认值是调整后的收盘价格,这解释了股票拆分的原因(当一只股票被拆分成多只股票,比如2,每个新股票的价值是原始价格的1/2)。
这个图可以在谷歌搜索中轻松找到,但是这里我们可以用Python代码完成。plot_stock函数有许多可选的参数。默认情况下,这种方法会绘制整个日期范围的调整收盘价格,但我们还可以选择范围、统计数据和绘图类型。例如,如果我们想比较每日价格变化与交易量(股票数量),我们可以在函数指定那些变量。
microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct') Maximum Daily Change = 2.08 on 2008-10-13. Minimum Daily Change = -3.34 on 2017-12-04. Current Daily Change = -1.75. Maximum Adj. Volume = 591052200.00 on 2006-04-28. Minimum Adj. Volume = 7425503.00 on 2017-11-24. Current Adj. Volume = 35945428.00.
注意,y轴的百分比变化对应统计的平均值。这个规模是有必要的,因为股票的日常交易量数以亿计,而每日价格变化通常是几美元!通过转换为百分比的变化,我们可以用类似的规模查看这两个数据集。该图表显示,交易的股票数量和每日价格变化之间没有相关性,这很令人惊讶。我们通常认为,在股价变动大的时候股票交易更多。然而,真正的情况是交易量随着时间而下降。2017年12月4日,价格大幅度下降,我们可以联系相关微软新闻。12月3日的新闻如下:
不确定这些新闻来源是否可靠
当然,没有任何迹象表明微软股票将在第二天出现十年来最大的下跌。
使用plot_stock,我们可以查看任何日期的数据,并查找与现实事件(如果有的话)的相关性。接下来,我们看到Stocker当中很有意思的部分。
假设我们很有远见的在公司首次公开募股(IPO)中投资了100股微软股票。那如今我们肯定赚翻了!
microsoft.buy_and_hold(start_date='1986-03-13', end_date='2018-01-16', nshares=100) MSFT Total buy and hold profit from 1986-03-13 to 2018-01-16 for 100 shares = $8829.11
除了让我们感觉更好,使用这些结果能让我们对之后进行规划,实现利润最大化。
microsoft.buy_and_hold(start_date='1999-01-05', end_date='2002-01-03', nshares=100) MSFT Total buy and hold profit from 1999-01-05 to 2002-01-03 for 100 shares = $-56.92
加性模型
加性模型是分析和预测时间序列的强大工具,而且是最常见的数据类型之一。这个概念很简单:将时间序列表示为不同时间范围和整体趋势的组合。众所周知,微软股票的长期趋势是稳步增长的,但也可能会有每年、每天的增长模式,比如每个星期二增长一次。由Facebook开发的Prophet是通过日常观察,从而分析时间序列的库。Stocker用Prophet完成了所有建模的工作,因此我们可以用简单的方法创建、检查模型。
model, model_data = microsoft.create_prophet_model()
加性模型可以消除数据中的噪音,这就是为什么建模线与观测结果不完全一致的原因。Prophet模型能够计算不确定性,这是建模的一个重要部分。我们也可以用Prophet模式来预测未来,但现在我们更关注过去的数据。注意,这个方法调用返回了两个对象,模型和一些数据,我们将它们分配给变量。现在我们用用这些变量绘制时间序列组件。
# model and model_data are from previous method call model.plot_components(model_data) plt.show()
总体趋势是过去三年来的明显增长。此外,还有一个值得注意的年度模式(下图),股价在9月份和10月份触底,11月份和1月份达到峰值。随着时间范围的缩短,数据中变化幅度越来越大。如果我们认为可能存在周模式,那么可以更改Stocker对象的weekly_seasonality属性,并将其添加到prophet 模型中:
print(microsoft.weekly_seasonality) microsoft.weekly_seasonality = True print(microsoft.weekly_seasonality) False True
weekly_seasonality的默认值是False,但我们改变该值,从而让模型包含周模式。然后,我们再次调用create_prophet_model并绘制结果组件。以下是新模式的每周模式。
我们可以忽略周末,因为价格只会在一周内发生变化。在继续建模之前,我们将关闭每周的季节性。股票的走势基本是随机的,只能从每年的大范围才能看到趋势。
变点 (Change points)
当时间序列从递增到递减或相反情况时,会出现变点(严格地说,变点位于时间序列变化率最大的地方)。这是非常重要的,因为知道什么时候股票将上涨或达到顶峰会带来显著的经济效益。识别变点能够让我们预测股票价格的未来波动。Stocker对象能够自动为我们找到10个最大的变点。
microsoft.changepoint_date_analysis() Changepoints sorted by slope rate of change (2nd derivative): Date Adj. Close delta 48 2015-03-30 38.238066 2.580296 337 2016-05-20 48.886934 2.231580 409 2016-09-01 55.966886 -2.053965 72 2015-05-04 45.034285 -2.040387 313 2016-04-18 54.141111 -1.936257
变点往往与股价的高峰和低谷一致。Prophet只能在前80%的数据中找到变点,但是这些结果是有用的,因为我们可以尝试将其与真实事件相关联。我们可以重复之前的做法,比如在这些日期手动搜索相关新闻资讯,但是如果能让Stocker完成就更好了。你也许知道搜索趋势工具,该工具可让你随时查看谷歌搜索中的关键字的流行度。Stocker可以自动检索任何搜索内容,并将结果绘制在原始数据上。为了查找和绘制搜索词的频率,我们修改了之前的方法调用。
# same method but with a search term microsoft.changepoint_date_analysis(search = 'Microsoft profit') Top Related Queries: query value 0 microsoft non profit 100 1 microsoft office 55 2 apple 30 3 microsoft 365 30 4 microsoft office 365 20 Rising Related Queries: query value 0 microsoft 365 120 1 microsoft office 365 90 2 microsoft profit 2014 70
除了绘制相关的搜索频率外,Stocker还会显示图表日期范围内的热门搜索词。通过将值除以最大值将y轴的值控制在0和1之间,从而让我们比较两个不同比例的变量。从图中可以看出,搜索“微软利润”和微软股价之间没有任何联系。
即使找到了相关性,还是存在因果关系的问题。我们不知道新闻是否导致价格变化,或价格变化导致搜索。可能有会找到一些有用信息,但也可能是偶然的。你可以试试不同的词,看看能否找到相关趋势。
microsoft.changepoint_date_analysis(search = 'Microsoft Office')
预测
到目前为止,我们只探索了Stocker一半的作用,另一半可以用来预测未来股价。虽然这可不会带来收益,但在这个过程中能够学到很多东西。
# specify number of days in future to make a prediction model, future = microsoft.create_prophet_model(days=180) Predicted Price on 2018-07-15 = $97.67
尽管Stocker的所有功能已经公开可用,但是创建这个工具的过程很有趣。重要的是相比大学课程,这能让我学到更多的数据科学、Python和股票市场的知识。如今在大数据的时代,每个人都能学习编程、机器学习。如果你有项目创意,但不确定自己有能力去完成,不要让它阻止你。你可能会得出更好的解决方案,即使没有成功你也在过程中学到很多知识。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-02最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27TensorFlow Datasets(TFDS)是一个用于下载、管理和预处理机器学习数据集的库。它提供了易于使用的API,允许用户从现有集合中 ...
2025-03-26"不谋全局者,不足谋一域。"在数据驱动的商业时代,战略级数据分析能力已成为职场核心竞争力。《CDA二级教材:商业策略数据分析 ...
2025-03-26当你在某宝刷到【猜你喜欢】时,当抖音精准推来你的梦中情猫时,当美团外卖弹窗刚好是你想吃的火锅店…… 恭喜你,你正在被用户 ...
2025-03-26当面试官问起随机森林时,他到底在考察什么? ""请解释随机森林的原理""——这是数据分析岗位面试中的经典问题。但你可能不知道 ...
2025-03-25在数字化浪潮席卷的当下,数据俨然成为企业的命脉,贯穿于业务运作的各个环节。从线上到线下,从平台的交易数据,到门店的运营 ...
2025-03-25在互联网和移动应用领域,DAU(日活跃用户数)是一个耳熟能详的指标。无论是产品经理、运营,还是数据分析师,DAU都是衡量产品 ...
2025-03-24ABtest做的好,产品优化效果差不了!可见ABtest在评估优化策略的效果方面地位还是很高的,那么如何在业务中应用ABtest? 结合企业 ...
2025-03-21在企业数据分析中,指标体系是至关重要的工具。不仅帮助企业统一数据标准、提升数据质量,还能为业务决策提供有力支持。本文将围 ...
2025-03-20解锁数据分析师高薪密码,CDA 脱产就业班助你逆袭! 在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的 ...
2025-03-19在 MySQL 数据库中,查询一张表但是不包含某个字段可以通过以下两种方法实现:使用 SELECT 子句以明确指定想要的字段,或者使 ...
2025-03-17在当今数字化时代,数据成为企业发展的关键驱动力,而用户画像作为数据分析的重要成果,改变了企业理解用户、开展业务的方式。无 ...
2025-03-172025年是智能体(AI Agent)的元年,大模型和智能体的发展比较迅猛。感觉年初的deepseek刚火没多久,这几天Manus又成为媒体头条 ...
2025-03-14以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-13以下的文章内容来源于刘静老师的专栏,如果您想阅读专栏《10大业务分析模型突破业务瓶颈》,点击下方链接 https://edu.cda.cn/go ...
2025-03-12