Python中文社区(ID:python-china)
本文将展示如何使用 Python 的第三方库 Stocker 来进行股票分析和预测。
安装第三方库
安装所需的库后,我们要做的第一件事就是将 Stocker 类导入到我们的 Python 代码中。我们可以通过在脚本目录中启动的 Jupyter Notebook 执行此操作。
- !pip install quandl
- !pip install fbprophet
- !pip install plotly
- from stocker importStocker
现在在 Python 代码中有 Stocker 类,我们可以使用它来创建该类的实例。在 Python 中,类的实例称为对象,创建对象的行为有时称为实例化或构造。为了创建 Stocker 对象,我们需要传入有效股票代码的名称。
- # MSFT Stocker Initialized. Data covers 1986-03-13 to 2018-01-16.
- microsoft = Stocker('MSFT')
- MSFT StockerInitialized. Data covers 1986-03-1300:00:00 to 2018-03-2700:00:00.
现在,我们有一个包含 Stocker 类所有属性的 microsoft 对象。Stocker 建立在 quandl WIKI 数据库上,该数据库使我们可以访问 3000 多只美国股票以及多年的每日价格数据(完整列表)。对于此示例,我们将坚持使用 Microsoft 数据。因为微软正在拥抱开源社区(包括 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()
- MaximumAdj. Close= 96.77 on 2018-03-1200:00:00.
- MinimumAdj. Close= 0.06 on 1986-03-2400:00:00.
- CurrentAdj. Close= 89.47 on 2018-03-2700:00:00.
绘制的默认值是调整后的收盘价,它考虑了股票的分割(当一只股票被分割成多只股票时,比如 2 只,每只新股票价值是原始价格的 1/2)。
这是我们可以从 Google 搜索中找到的一个非常基本的图,但是我们自己用几行 Python 来完成它是令人满意的! plot_stock 函数有许多可选参数。默认情况下,此方法绘制整个日期范围的调整后收盘价,但我们可以选择范围、要绘制的统计数据以及绘图类型。例如,如果我们想将价格的每日变化与调整后的交易量(股票数量)进行比较,我们可以在函数调用中指定这些。
- microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct')
- MaximumDailyChange= 2.08 on 2008-10-1300:00:00.
- MinimumDailyChange= -3.34 on 2017-12-0400:00:00.
- CurrentDailyChange= -5.47 on 2018-03-2700:00:00.
- MaximumAdj. Volume= 591052200.00 on 2006-04-2800:00:00.
- MinimumAdj. Volume= 7425503.00 on 2017-11-2400:00:00.
- CurrentAdj. Volume= 53704562.00 on 2018-03-2700:00:00.
注意,y 轴是相对于统计平均值的百分比变化。这个单位是必要的,因为每天的交易量本来就是股票,范围在数亿,而每天的价格变化通常是几美元!通过转换为百分比变化,我们可以以相似的比例查看两个数据集。该图显示交易的股票数量与价格的每日变化之间没有相关性。这是令人惊讶的,因为我们可能期望在价格变化较大的日子里交易更多股票,因为人们急于利用波动。然而,唯一真正的趋势似乎是交易量随着时间的推移而减少。2017 年 12 月 4 日的价格也大幅下降,我们可以尝试将其与有关 Microsoft 的新闻报道联系起来。
使用 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 from1986-03-13 to 2018-01-16for100 shares = $8829.11
使用这些结果将使我们能够及时调整我们的计划,以最大限度地提高利润。
加法模型
加法模型是分析和预测时间序列的强大工具,时间序列是最常见的现实世界数据类型之一。这个概念很简单:将时间序列表示为不同时间尺度上的模式和整体趋势的组合。我们知道微软股票的长期趋势是稳步上涨,但也可能有每年或每天的模式,例如每周二上涨,这在经济上是有益的。由 Facebook 开发的 Prophet 是一个用于通过日常观察(例如股票)分析时间序列的第三方库。Stocker 在底层使用 Prophet 为我们完成所有建模工作,因此我们可以使用简单的方法调用来创建和检查模型。
- model, model_data = microsoft.create_prophet_model()
加法模型消除了数据中的噪声,这就是模型线与观测值不完全一致的原因。Prophet 模型还计算不确定性,这是建模的重要组成部分,因为在处理波动的现实过程时,我们永远无法确定我们的预测结果。我们也可以使用prophet模型对未来进行预测,但现在我们更关心过去的数据。请注意,此方法调用返回了两个对象,一个模型和一些我们分配给变量的数据。我们现在使用这些变量来绘制时间序列分量。
- model.plot_components(model_data)
- plt.show()
总体趋势是在过去三年中明显增加。似乎还有一个明显的年度模式,价格在 9 月和 10 月触底,并在 11 月和 1 月达到峰值。随着时间尺度的减小,数据变得更加嘈杂。在一个典型的月份中,信号多于噪音!如果我们认为可能存在每周模式,我们可以通过更改 Stocker 对象的weekly_seasonality 属性将其添加到先知模型中:
- print(microsoft.weekly_seasonality)
- microsoft.weekly_seasonality = True
- print(microsoft.weekly_seasonality)
- False
- True
weekly_seasonality 的默认值为 False,但我们更改了该值以在我们的模型中包含每周模式。然后我们再次调用 create_prophet_model 并绘制结果组件。
我们可以忽略周末,因为价格只会在一周内变化(实际上在下班后的期间价格变化很小,但不影响我们的分析)。不幸的是,没有一周的趋势可供我们使用,在我们继续建模之前,我们将关闭每周季节性。这种行为是意料之中的:对于股票数据,随着时间尺度的减小,噪声开始冲刷掉信号。从日常来看,股票的走势本质上是随机的,只有缩小到年度范围,我们才能看到趋势。
变化点
变化点发生在时间序列从增加到减少或相反时(在更严格的意义上,它们位于时间序列速率变化最大的地方)。这些时间非常重要,因为了解股票何时会达到顶峰或即将起飞可能会带来显著的经济效益。确定变化点的原因可能让我们预测股票价值的未来波动。Stocker 对象可以自动为我们找到 10 个最大的变化点。
- microsoft.changepoint_date_analysis()
- Changepoints sorted by slope rate of change (2nd derivative):
- DateAdj. Close delta
- 4102016-09-0855.811396-1.378093
- 3382016-05-2650.1134531.116720
- 2172015-12-0252.572008-0.882359
- 4582016-11-1557.5898190.603127
- 482015-04-0237.6125900.442776
变化点往往与股价的高峰和低谷一致。Prophet 只在前 80% 的数据中找到变化点,但尽管如此,这些结果还是很有用的,因为我们可以尝试将它们与现实世界的事件相关联。我们可以重复我们之前所做的并在这些日期前后手动搜索 Google 新闻,但我认为如果Stocker 为我们这样做会更好。您可能已经看过 Google 搜索趋势工具,该工具可让您查看任何搜索词在 Google 搜索中随时间的流行程度。Stocker 可以自动检索我们指定的任何搜索词的数据,并在原始数据上绘制结果。为了找到并绘制搜索词的频率,我们修改了之前的方法调用。
- microsoft.changepoint_date_analysis(search = 'Microsoft profit')
- TopRelatedQueries:
- query value
- 0 microsoft non profit 100
- 1 microsoft office 60
- 2 apple profit 40
- 3 microsoft 36540
- 4 apple 35
- RisingRelatedQueries:
- query value
- 0 apple stock 170
- 1 microsoft 365130
- 2 apple profit 50
除了绘制相对搜索频率的图形之外,Stocker 还显示了图表日期范围内相关度最高的查询和上升最快的查询。在图中,y 轴通过将值除以其最大值而在 0 和 1 之间归一化,使我们能够比较具有不同尺度的两个变量。从图中可以看出,搜索“Microsoft profit”与微软股价之间似乎没有相关性。
如果我们发现了相关性,那么仍然会有因果关系的问题。我们不知道是搜索还是新闻导致了价格的变化,还是价格的变化导致了搜索。可能会找到一些有用的信息,但也有很多机会相关性。随意尝试一些不同的搜索词语,看看是否能找到任何有趣的趋势!
- microsoft.changepoint_date_analysis(search = 'Microsoft Office')
- TopRelatedQueries:
- query value
- 0 microsoft office download 100
- 1 microsoft office 201090
- 2 office 201085
- 3 microsoft office 201375
- 4 office 201370
- RisingRelatedQueries:
- query value
- 0 microsoft office 2016 key 80300
- 1 office 201673200
- 2 download microsoft office 201672150
- 3 microsoft office 2016 mac 69350
- 4 microsoft office 201667650
看起来对Microsoft Office 的搜索量下降会导致股价上涨。也许有人应该让微软知道。
预测
我们只探索了 Stocker 功能的前半部分。后半部分用于预测,或预测未来的股票价格。如下图所示:
- model, future = microsoft.create_prophet_model(days=180)
- PredictedPrice on 2018-07-21= $102.40