一、 实验目的
- 掌握平稳性检验的相关概念
- 掌握统计套利方法
二、 实验内容
(1)平稳性分析:对2021 年1 月1 日-2021 年3 月1 日,中国石油,贵州茅台,兴蓉环境,招商银行,工商银行这5 只股票进行平稳性分析(均值和方差稳定)。
(2)找出符合平稳性要求的股票;
(3)放宽时间到1 年,分析这些股票是否还具有时间序列的平稳性?
(4)思考并分析平稳性改变的原因?
(5)思考为什么文艺复兴科技公司的统计套利主要针对日内交易?所有的股票都可以进行统计套利吗?
(6)回答,并将程序运行结果贴图。
(7)将代码粘贴附后。
三、 实验步骤
查看企业的股票代号
首先编写平稳性计算函数StableModel(code, name, stime, etime)用于计算每支股票的平稳性相关分析数据。其中参数code表示股票的号,name表示企业名称,stime表示获取股票数据的开始时间,etime表示获取股票数据的结束时间。
获取股票数据,并计算相应时间段内收盘价的均值和方差,并进行单位根检验
stock = ts.get_hist_data(code, start=stime,end=etime,ktype='d') # 获取数据
pcaverage=np.mean(stock.close)
pcq=np.var(stock.close)
print('均值为',pcaverage)
print('方差为',pcq)
print(adfuller(stock.close))
因为获取的股票数据是从当前时间往历史时间递减的,所以需要对数据数列进行重新排序,改成从历史时间向当前时间递增。
# 处理时间顺序,将时间按照递增的次序排列
date = []
for i in stock.index:
t = i.split("-")[1:]
t[0] = int(t[0])
t[-1] = int(t[-1])
date.append(str(t[0])+"-"+str(t[-1]))
date1 = []
for i in range(len(date)):
date1.append(date[len(date)-i-1])
# 相应的改变收盘价的顺序
close = []
c = list(stock.close)
for i in range(len(stock)):
close.append(c[len(stock)-i-1])
处理好数据以后就可以绘制股票收盘价的波动散点图
# 绘制散点图
plt.rcParams["font.sans-serif"] = "SimHei" # 设置图片中字体为中文黑体
plt.scatter(date1,close)
plt.xticks(rotation=-90) # 设置x轴标签旋转90角度,垂直与坐标轴x
plt.title("{}".format(name))
plt.xlabel("日期")
plt.ylabel("股票收盘价(元)")
plt.show()
平稳性分析
程序运行的计算结果如下图1所示
汇总成如下所示的表1
从股票收盘价的均值和方差上来看,2021年的第一季度,贵州茅台的收盘价均值远远超过其他四家企业,而且方差也是十分巨大,贵州茅台的波动性太强,明显不是稳定性的,其次招商银行的均值也相对较大,方差也不小,因此贵州茅台和招商银行是波动性较大,不平稳的。中国石油、兴蓉环境、工商银行三家的股票收盘价均值相差不超过1元,且方差都在0.01级别,可以说是十分平稳,波定性不大。
从图2可以看出过去两个月的时间内中国石油的每日收盘价波动幅度很小,纵坐标的极差在0.5以内。这在股市中是属于很稳定的价格波动,这样的波动相对于前面提到的贵州茅台几乎可以忽略不计。我将中国石油的ADF检验的结果汇总到表2
从表2中显示的结果来看ADF的检验结果为-3.4267小于5%和10%的统计值,因此5%程度拒绝原假设,p值为0.01001也小于0.05,能够接受。所以拒绝原假设,不存在单位根,中国石油指数在过去两个月数据平稳。
从图3可以看出过去两个月的时间内贵州茅台的每日收盘价波动幅度很大,纵坐标的极差在600左右。这在股市中是属于大范围的价格波动,这样的波动极容易让投资者产生恐慌,也是市场收割韭菜的一个良机,同时也是精明的投资者加仓抄底的时机。我将贵州茅台的ADF检验的结果汇总到表3
从表3中显示的结果来看贵州茅台ADF的检验结果为-1.0637大于三个level的统计值,因此不能显著的拒绝原假设,p值为0.7293大于0.05,不能够接受。所以接受原假设,存在单位根,贵州茅台指数在过去的两个月数据不平稳,波动性很大!
从图4可以看出过去两个月的时间内,兴蓉环境的每日收盘价波动幅度很小,纵坐标的极差在0.7以内。这在股市中是属于很稳定的价格波动,这样的波动相对于前面提到的贵州茅台几乎可以忽略不计。我将兴蓉环境的ADF检验的结果汇总到表4
从表4中显示的结果来看兴蓉环境ADF的检验结果为-3.1281小于5%和10%的统计值,因此5%程度拒绝原假设,p值为0.0245也小于0.05,能够接受。所以拒绝原假设,不存在单位根,兴蓉环境指数在过去两个月数据平稳。
从图5可以看出过去两个月的时间内招商银行的每日收盘价波动幅度很大,纵坐标的极差在15左右。我将招商银行的ADF检验的结果汇总到表5
从表5中显示的结果来看招商银行ADF的检验结果为0.4826大于三个level的统计值,因此1%程度接受原假设,p值为0.9843大于0.05,不能够接受。所以接受原假设,存在单位根,招商银行指数在过去两个月数据不平稳,股票收盘价波动明显!
从图6可以看出过去两个月的时间内,工商银行的每日收盘价波动幅度很小,纵坐标的极差在0.6以内。这在股市中是属于很稳定的价格波动,这样的波动相对于前面提到的贵州茅台几乎可以忽略不计。我将工商银行的ADF检验的结果汇总到表6
从表6中显示的结果来看工商银行ADF的检验结果为-1.6153大于三个level的统计值,因此接受原假设,但是p值为0.4751小于0.05,能够接受。所以接受原假设,存在单位根,工商银行指数在过去两个月数据不平稳。
两个月的时间段结果
根据上面对五支股票的平稳性检验得出的结果和最前面仅根据股票收盘价的均值和方差得到的结果有很大出入。ADF检验的结果显示,中国石油、兴蓉环境在过去两个月股价波动小,指数平稳。贵州茅台、招商银行、工商银行在过去两个月股价波动大,指数不平稳!
把统计时间放宽到1年,即从2020年3月-2021年3月。
程序运行的结果如下图
将每支股票的收盘价均值和方差统计成表如下所示。
从整体上来看,时间跨度虽然从两个月扩充到了1年,但是变化并不大,从方差来看,贵州茅台和招商银行依然属于波动大的股票,尤其是贵州茅台很不平稳,收盘价在过去的两个月均值为2181元,在过去一年的收盘价均值为1633元,变化很大。中国石油、兴蓉环境、工商银行这三家的方差依然很低,平稳很多。
综上所述,当时间范围扩大到一年,五家企业的股价都变得不平稳,失去了时间序列的平稳性。我觉得这其中的主要原因在于较长的时间跨度中会出现很多人们无法预料的事情,这些突发事件的出现会对股市产生巨大的影响,虽然人们知道突发性时间会发生,但是却无法预判其发生的时间和地点已及造成的影响。黑天鹅事件是难以让人把握规律,也无法用模型来进行预测的,所以当时间跨度较长时,股票就会失去时间序列的平稳性,变得难以预料。这也是为什么说股市投资是一个风险很大的行为。
有了以上的解释就很好理解为什么文艺复兴科技公司的统计套利主要针对日内交易了,因为一天之内人们可以准确把握是否会有突发性事件发生,并且任何突发性事件的发生都会有一个时间缓冲区,做日内交易就可以很好的对任何突发性事件做出及时的相应和应对。从而将股市未来的不确定性大大减小,风险相应的也就变小了,但是收益却依然客观。
完整代码
'''
python3.7
-*- coding: UTF-8 -*-
@Project -> File :Code -> stable
@IDE :PyCharm
@Author :YangShouWei
@USER: 296714435
@Date :2021/4/4 17:49:54
@LastEditor:
'''
import tushare as ts
import numpy as np
from statsmodels.tsa.stattools import adfuller # 进行单位根检验
import matplotlib.pyplot as plt
def StableModel(code,name,stime,etime):
print("{}统计套利平稳性检验".format(name))
stock = ts.get_hist_data(code, start=stime,end=etime,ktype='d') # 获取数据
pcaverage=np.mean(stock.close)
pcq=np.var(stock.close)
print('均值为',pcaverage)
print('方差为',pcq)
print(adfuller(stock.close))
# 处理时间顺序,将时间按照递增的次序排列
date = []
for i in stock.index:
t = i.split("-")[1:]
t[0] = int(t[0])
t[-1] = int(t[-1])
date.append(str(t[0])+"-"+str(t[-1]))
date1 = []
for i in range(len(date)):
date1.append(date[len(date)-i-1])
# 相应的改变收盘价的顺序
close = []
c = list(stock.close)
for i in range(len(stock)):
close.append(c[len(stock)-i-1])
# 绘制散点图
plt.rcParams["font.sans-serif"] = "SimHei" # 设置图片中字体为中文黑体
plt.scatter(date1,close)
plt.xticks(rotation=-90) # 设置x轴标签旋转90角度,垂直与坐标轴x
plt.title("{}".format(name))
plt.xlabel("日期")
plt.ylabel("股票收盘价(元)")
# plt.show()
if __name__ == "__main__":
# 时间2021年1月1日-2021年3月1日,对五家企业进行平稳性计算
stime = '2021-01-01'
etime = '2021-03-01'
print("2021年1月到3月平稳性计算:")
StableModel("601857","中国石油",stime,etime)
StableModel("600519","贵州茅台",stime,etime)
StableModel("000598","兴蓉环境",stime,etime)
StableModel("600036","招商银行",stime,etime)
StableModel("601398","工商银行",stime,etime)
stime = '2020-03-01'
print("\n========================================================================"*2+"\n")
print("2020-3-01到2021-03-01一年平稳性计算:")
StableModel("601857", "中国石油", stime, etime)
StableModel("600519", "贵州茅台", stime, etime)
StableModel("000598", "兴蓉环境", stime, etime)
StableModel("600036", "招商银行", stime, etime)
StableModel("601398", "工商银行", stime, etime)