一个简单的股票数据分析及可视化库
2020-06-24
作者:老齐
与本文相关的图书推荐:《跟老齐学Python:数据分析》
本书是数据分析、机器学习等数据科学方向的入门读物,主要介绍了Numpy、Pandas和数据可视化的内容,并且贯穿了大量实用案例,包括本文阐述的股票数据分析案例。
在这篇文章中,我将利用stocker
模块,演示如何进行数据分析的,你可以从Github仓库中获得这个模块的代码:https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker。
开始
安装好各种有关的库之后,首先要引入stocker
,以下演示都是在Jupyter Notebook中进行的。
1 | !pip install quandl |
1 | from stocker import Stocker |
然后,就可以加载数据,创建股票数据对象。
1 | microsoft = Stocker('MSFT') |
现在我们创建了microsoft
对象了。Stocker中包含了3000支美国股票的每个交易日的股票数据。
通过microsoft
的属性,可以得到历史数据。
1 | stock_history = microsoft.stock |
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语言的特点。另外,通过执行对象的方法,能够实现某些操作,比如可视化图像。
1 | microsoft.plot_stock() |
默认是绘制收盘价的图示。这是最基本的操作,当然,也可以设置一些参数,比如开始日期、结束日期等。
1 | microsoft.plot_stock(start_date = '2000-01-03', end_date = '2018-01-16', stats = ['Daily Change', 'Adj. Volume'], plot_type='pct') |
注意y轴,是相对平均值的变化的百分比。这是很有必要的,因为如果采用价格绝对值,更多时候变化可能不大。
在股票投资方面,有的人搞长线,有的人搞短线,那么,如果长期持有微软的股票,会怎么样呢?有一个方法,可以显示出来。
1 | microsoft.buy_and_hold(start_date='1986-03-13', end_date='2018-01-16', nshares=100) |
从1986年开始,如果长期持有100份微软股票,是不是收益满满呢?
创建模型
股票数据时一种时间序列数据,可以通过一些模型对它进行分析。我们知道微软股票的长期趋势是稳定的增长,但也可能有每年或每天的模型,例如每周二的增长,这对投资会非常有利。分析时间序列数据,最常用的是Prophet库,它是由Facebook开发的。Stocker也使用Prophet来建模,下面用一个简单的方法来创建模型。
1 | model, model_data = microsoft.create_prophet_model() |
上图用一条曲线,将原有图像平滑了,这就是一个新的模型。Prophet能够计算不确定性,这是建模的一个重要部分。对于波动性比较大的真实数据,是无法进行预测的。要通过以往的数据,创建模型,预测未来,就不得不将数据平滑化。注意,上面使用的方法返回了两个对象,一个模型和一些数据,然后可以绘制绘制时间序列中的某些部分。
1 | model.plot_components(model_data) |
通过图示中的trend,可以看到过去三年里的总体趋势是的增长。在yearly的年度图示中,9月和10月两月触底,11月和1月达到峰值。随着时间尺度的减小,数据的噪声也越来越大。在一个典型的月中,有价值的信号多于噪音。如果要查看以周为单位模型,可以通过更改Stocker的weekly seasonalit
参数,将它添加到Prophet模型中。
1 | print(microsoft.weekly_seasonality) |
weekly_seasonality
的默认值是False
,如果要在模型中包含每周的分析,就要将其修改为True
。再次调用create_prophet_model
,就可以得到下图所示效果。
拐点
对于时间序列的数据而言,拐点是我们关注的重点。在Stocker模块中,有非常简单地查看观点的方法。
1 | microsoft.changepoint_date_analysis() |
股价的拐点往往和某些时间关联起来,通过上面的操作,找到了拐点出现的日期,可以用搜索引擎搜一下,那一天有什么大事件。Prophet尚未能挑出所有拐点,目前只在前80%的数据中显示了拐点,但是已经足够了。
Stoker提供了一些搜索比较的功能,比如,比较微软的利润搜搜量和股价关系。
1 | microsoft.changepoint_date_analysis(search = 'Microsoft profit') |
即使找到了相关性,但也不要认为这是因果关系。我们不知道利润或者某些时间导致了股价变化,还是反之。
下面再看看微软Office的搜索量会不会与股价相关?
1 | microsoft.changepoint_date_analysis(search = 'Microsoft Office') |
这张图显示,微软股价上升的同时,Office的搜搜量下降。是不是因为这个原因股价上涨了呢?哈哈。告诉微软吧。
预测
分析股票数据,最终的目的是期望能找到一个规律,从而预测未来股票价格趋势——虽然不一定准。
1 | model, future = microsoft.create_prophet_model(days=180) |
Stoker是一个非常简单好用的工具,是一个开源工具。以上做个简要介绍,希望能够对读者有用。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
关注微信公众号,读文章、听课程,提升技能