老齐教室

一个简单的股票数据分析及可视化库

作者:老齐

与本文相关的图书推荐:《跟老齐学Python:数据分析》

本书是数据分析、机器学习等数据科学方向的入门读物,主要介绍了Numpy、Pandas和数据可视化的内容,并且贯穿了大量实用案例,包括本文阐述的股票数据分析案例。


在这篇文章中,我将利用stocker模块,演示如何进行数据分析的,你可以从Github仓库中获得这个模块的代码:https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker。

开始

安装好各种有关的库之后,首先要引入stocker,以下演示都是在Jupyter Notebook中进行的。

1
2
3
!pip install quandl
!pip install fbprophet
!pip install plotly
1
from stocker import Stocker

然后,就可以加载数据,创建股票数据对象。

1
2
3
4
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的属性,可以得到历史数据。

1
2
3
4
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语言的特点。另外,通过执行对象的方法,能够实现某些操作,比如可视化图像。

1
2
3
4
5
6
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.

默认是绘制收盘价的图示。这是最基本的操作,当然,也可以设置一些参数,比如开始日期、结束日期等。

1
2
3
4
5
6
7
8
9
10
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轴,是相对平均值的变化的百分比。这是很有必要的,因为如果采用价格绝对值,更多时候变化可能不大。

在股票投资方面,有的人搞长线,有的人搞短线,那么,如果长期持有微软的股票,会怎么样呢?有一个方法,可以显示出来。

1
2
3
4
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来建模,下面用一个简单的方法来创建模型。

1
model, model_data = microsoft.create_prophet_model()

上图用一条曲线,将原有图像平滑了,这就是一个新的模型。Prophet能够计算不确定性,这是建模的一个重要部分。对于波动性比较大的真实数据,是无法进行预测的。要通过以往的数据,创建模型,预测未来,就不得不将数据平滑化。注意,上面使用的方法返回了两个对象,一个模型和一些数据,然后可以绘制绘制时间序列中的某些部分。

1
2
model.plot_components(model_data)
plt.show()

通过图示中的trend,可以看到过去三年里的总体趋势是的增长。在yearly的年度图示中,9月和10月两月触底,11月和1月达到峰值。随着时间尺度的减小,数据的噪声也越来越大。在一个典型的月中,有价值的信号多于噪音。如果要查看以周为单位模型,可以通过更改Stocker的weekly seasonalit参数,将它添加到Prophet模型中。

1
2
3
4
5
6
7
print(microsoft.weekly_seasonality)
microsoft.weekly_seasonality = True
print(microsoft.weekly_seasonality)

# 输出
False
True

weekly_seasonality的默认值是False,如果要在模型中包含每周的分析,就要将其修改为True。再次调用create_prophet_model,就可以得到下图所示效果。

拐点

对于时间序列的数据而言,拐点是我们关注的重点。在Stocker模块中,有非常简单地查看观点的方法。

1
2
3
4
5
6
7
8
9
10
11
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提供了一些搜索比较的功能,比如,比较微软的利润搜搜量和股价关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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的搜索量会不会与股价相关?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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的搜搜量下降。是不是因为这个原因股价上涨了呢?哈哈。告诉微软吧。

预测

分析股票数据,最终的目的是期望能找到一个规律,从而预测未来股票价格趋势——虽然不一定准。

1
2
3
4
5
model, future = microsoft.create_prophet_model(days=180)

# 输出

Predicted Price on 2018-07-21 = $102.40

Stoker是一个非常简单好用的工具,是一个开源工具。以上做个简要介绍,希望能够对读者有用。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能