在这篇文章中,我将利用stocker
模块,演示如何进行数据分析的,你可以从Github仓库中获得这个模块的代码:https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker。
安装好各种有关的库之后,首先要引入stocker
,以下演示都是在Jupyter Notebook中进行的。
!pip install quandl
!pip install fbprophet
!pip install plotly
from stocker import Stocker
然后,就可以加载数据,创建股票数据对象。
microsoft = Stocker('MSFT')
# 输出
# MSFT Stocker Initialized. Data covers 1986-03-13 00:00:00 to 2018-03-27 00:00:00.
现在我们创建了microsoft
对象了。Stocker中包含了3000支美国股票的每个交易日的股票数据。
通过microsoft
的属性,可以得到历史数据。
stock_history = microsoft.stock
stock_history.head()
# 以下表格是输出
Date | Open | High | Low | Close | Volume | Ex-Dividend | Split Ratio | Adj. Open | Adj. High | Adj. Low | Adj. Close | Adj. Volume | ds | y | Daily Change | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1986-03-13 | 25.50 | 29.25 | 25.5 | 28.00 | 3582600.0 | 0.0 | 1.0 | 0.058941 | 0.067609 | 0.058941 | 0.064720 | 1.031789e+09 | 1986-03-13 | 0.064720 | 0.005779 |
1 | 1986-03-14 | 28.00 | 29.50 | 28.0 | 29.00 | 1070000.0 | 0.0 | 1.0 | 0.064720 | 0.068187 | 0.064720 | 0.067031 | 3.081600e+08 | 1986-03-14 | 0.067031 | 0.002311 |
2 | 1986-03-17 | 29.00 | 29.75 | 29.0 | 29.50 | 462400.0 | 0.0 | 1.0 | 0.067031 | 0.068765 | 0.067031 | 0.068187 | 1.331712e+08 | 1986-03-17 | 0.068187 | 0.001156 |
3 | 1986-03-18 | 29.50 | 29.75 | 28.5 | 28.75 | 235300.0 | 0.0 | 1.0 | 0.068187 | 0.068765 | 0.065876 | 0.066454 | 6.776640e+07 | 1986-03-18 | 0.066454 | -0.001734 |
4 | 1986-03-19 | 28.75 | 29.00 | 28.0 | 28.25 | 166300.0 | 0.0 | 1.0 | 0.066454 | 0.067031 | 0.064720 | 0.065298 | 4.789440e+07 | 1986-03-19 | 0.065298 | -0.001156 |
这也体现了Python语言的特点。另外,通过执行对象的方法,能够实现某些操作,比如可视化图像。
microsoft.plot_stock()
# 输出
Maximum Adj. Close = 96.77 on 2018-03-12 00:00:00.
Minimum Adj. Close = 0.06 on 1986-03-24 00:00:00.
Current Adj. Close = 89.47 on 2018-03-27 00:00:00.
默认是绘制收盘价的图示。这是最基本的操作,当然,也可以设置一些参数,比如开始日期、结束日期等。
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 00:00:00.
Minimum Daily Change = -3.34 on 2017-12-04 00:00:00.
Current Daily Change = -5.47 on 2018-03-27 00:00:00.
Maximum Adj. Volume = 591052200.00 on 2006-04-28 00:00:00.
Minimum Adj. Volume = 7425503.00 on 2017-11-24 00:00:00.
Current Adj. Volume = 53704562.00 on 2018-03-27 00:00:00.
注意y轴,是相对平均值的变化的百分比。这是很有必要的,因为如果采用价格绝对值,更多时候变化可能不大。
在股票投资方面,有的人搞长线,有的人搞短线,那么,如果长期持有微软的股票,会怎么样呢?有一个方法,可以显示出来。
microsoft.buy_and_hold(start_date='1986-03-13', end_date='2018-01-16', nshares=100)
# 输出
SFT Total buy and hold profit from 1986-03-13 to 2018-01-16 for 100 shares = $8829.11
从1986年开始,如果长期持有100份微软股票,是不是收益满满呢?
股票数据时一种时间序列数据,可以通过一些模型对它进行分析。我们知道微软股票的长期趋势是稳定的增长,但也可能有每年或每天的模型,例如每周二的增长,这对投资会非常有利。分析时间序列数据,最常用的是Prophet库,它是由Facebook开发的。Stocker也使用Prophet来建模,下面用一个简单的方法来创建模型。
model, model_data = microsoft.create_prophet_model()
上图用一条曲线,将原有图像平滑了,这就是一个新的模型。Prophet能够计算不确定性,这是建模的一个重要部分。对于波动性比较大的真实数据,是无法进行预测的。要通过以往的数据,创建模型,预测未来,就不得不将数据平滑化。注意,上面使用的方法返回了两个对象,一个模型和一些数据,然后可以绘制绘制时间序列中的某些部分。
model.plot_components(model_data)
plt.show()
通过图示中的trend,可以看到过去三年里的总体趋势是的增长。在yearly的年度图示中,9月和10月两月触底,11月和1月达到峰值。随着时间尺度的减小,数据的噪声也越来越大。在一个典型的月中,有价值的信号多于噪音。如果要查看以周为单位模型,可以通过更改Stocker的weekly seasonalit
参数,将它添加到Prophet模型中。
print(microsoft.weekly_seasonality)
microsoft.weekly_seasonality = True
print(microsoft.weekly_seasonality)
# 输出
False
True
weekly_seasonality
的默认值是False
,如果要在模型中包含每周的分析,就要将其修改为True
。再次调用create_prophet_model
,就可以得到下图所示效果。
对于时间序列的数据而言,拐点是我们关注的重点。在Stocker模块中,有非常简单地查看观点的方法。
microsoft.changepoint_date_analysis()
# 输出
Changepoints sorted by slope rate of change (2nd derivative):
Date Adj. Close delta
410 2016-09-08 55.811396 -1.378093
338 2016-05-26 50.113453 1.116720
217 2015-12-02 52.572008 -0.882359
458 2016-11-15 57.589819 0.603127
48 2015-04-02 37.612590 0.442776
股价的拐点往往和某些时间关联起来,通过上面的操作,找到了拐点出现的日期,可以用搜索引擎搜一下,那一天有什么大事件。Prophet尚未能挑出所有拐点,目前只在前80%的数据中显示了拐点,但是已经足够了。
Stoker提供了一些搜索比较的功能,比如,比较微软的利润搜搜量和股价关系。
microsoft.changepoint_date_analysis(search = 'Microsoft profit')
# 输出
Top Related Queries:
query value
0 microsoft non profit 100
1 microsoft office 60
2 apple profit 40
3 microsoft 365 40
4 apple 35
Rising Related Queries:
query value
0 apple stock 170
1 microsoft 365 130
2 apple profit 50
即使找到了相关性,但也不要认为这是因果关系。我们不知道利润或者某些时间导致了股价变化,还是反之。
下面再看看微软Office的搜索量会不会与股价相关?
microsoft.changepoint_date_analysis(search = 'Microsoft Office')
# 输出
Top Related Queries:
query value
0 microsoft office download 100
1 microsoft office 2010 90
2 office 2010 85
3 microsoft office 2013 75
4 office 2013 70
Rising Related Queries:
query value
0 microsoft office 2016 key 80300
1 office 2016 73200
2 download microsoft office 2016 72150
3 microsoft office 2016 mac 69350
4 microsoft office 2016 67650
这张图显示,微软股价上升的同时,Office的搜搜量下降。是不是因为这个原因股价上涨了呢?哈哈。告诉微软吧。
分析股票数据,最终的目的是期望能找到一个规律,从而预测未来股票价格趋势——虽然不一定准。
model, future = microsoft.create_prophet_model(days=180)
# 输出
Predicted Price on 2018-07-21 = $102.40
Stoker是一个非常简单好用的工具,是一个开源工具。以上做个简要介绍,希望能够对读者有用。