时间序列学习(6):单整、协整、格兰杰检验
前面的笔记里,我们都是在研究一个时间序列(不同时间段)中的关系及性质。
很显然,我们可以把方法推广到两个时间序列(相同时间段)的研究中去。这就是这篇要讲的协整关系。
1、单整序列
我们在第5篇笔记的第3节里对指数的对数收益率序列做了一次差分。实际我们可以在差分序列上再做差分。
当某一个不平稳的时间序列做了n次差分后第一次变成平稳序列了,那么我们就称这个时间序列为n阶单整。
根据重要统计量(之前介绍过的均值、方差、自相关系数)的可加性,我们有以下两个结论:
- 平稳序列的线性组合也是平稳的;
- 平稳序列和一阶单整序列的线性组合是一阶单整的;
那么问题来了,两个一阶单整序列的线性组合还是一阶单整的吗?答案是不一定。
2、协整关系
但是有一种情况我们可能用两个一阶单整的序列构造出平稳序列(平稳序列的一阶差分一定也是平稳的)。
对于两个走势很像的时间序列,比如,格力和美的的股价走势,它们的对数收益率序列可以看成股价序列的一阶差分。
从前面的笔记可以假设对数收益率序列是平稳的。所以格力和美的的股价走势可以说是一阶单整的。
因为格力和美的的股价走势强相关,那么可以想象它们股价的差值序列似乎应该是平稳的。如果是平稳的,我们就说格力和美的的股价走势序列具有协整关系(Cointegration)。
更为严格的定义如下。给定两个时间序列 { x t } \{x_t\} {xt}和 { y t } \{y_t\} {yt},它们有如下的线性关系:
y t = α x t + β + r e s i d t y_t=\alpha x_t+\beta+resid_t yt=αxt+β+residt
其中 { r e s i d t } \{resid_t\} {residt}是残差序列。若, { x t } \{x_t\} {xt}和 { y t } \{y_t\} {yt}是一阶单整的,且 { r e s i d t } \{resid_t\} {residt}是平稳的,那么 { x t } \{x_t\} {xt}和 { y t } \{y_t\} {yt}具有协整关系。
描述协整关系的模型和AR模型很像,都是线性模型。区别在于AR模型描述的是一个序列的不同时间点的关系;协整模型描述的是两个序列的相同时间点的关系。
协整关系通常用在配对交易中,用来判断两个走势相近的标的价格差值序列是否平稳,进而判断这两个标的走势是否平稳。
在实际应用中,我们通常会对标的价格取对数,以减小量纲的影响。
3、模型解释与协整检验
我们针对两个序列寻找它们的协整关系,我们在它们之间建立了下面的关系:
y t = α x t + β + r e s i d t y_t=\alpha x_t+\beta+resid_t yt=αxt+β+residt
由上式,我们已经假设这两个序列之间是线性关系。究竟具不具有线性关系,实际上需要验证的。所以当我们拟合出模型后,我们首先应该看看模型是否有不错的解释效果(实际上很多人都忽略了这一点);然后我们再进行协整的检验。
验证线性模型的解释效果有很多指标,SSE(和方差)、MSE(均方误差)、RMSE(均方根误差)、MAE(平均绝对误差)、R-Squared(R平方检验,为R平方,修正R平方等)。
因为本篇笔记还是以协整为核心,所以上述方法不详述了。后面碰到实际问题再说。
那么协整性怎么检验呢?一般有两个方法,约翰森(Johansen)检验法与恩格尔-格兰杰(Engel-Granger)检验法。
约翰森(Johansen)检验法针对含有滞后项的情况,如下:
y t = α 0 x t + α 1 x t − 1 + . . . + β + r e s i d t y_t=\alpha_0x_t+\alpha_1x_{t-1}+...+\beta+resid_t yt=α0xt+α1xt−1+...+β+residt
本篇笔记考虑更为简单的恩格尔-格兰杰(Engel-Granger)检验法。对于下述关系式进行两步检验:
y t = α x t + β + r e s i d t y_t=\alpha x_t+\beta+resid_t yt=αxt+β+residt
- 第一步: 基于OLS方法回归上述模型得到系数;
- 第二步:基于ADF方法检验序列 { r e s i d t } \{resid_t\} {residt}是否平稳;若平稳,则 { x t } \{x_t\} {xt}和 { y t } \{y_t\} {yt}具有协整关系;否则,“存在协整关系”不成立。
4、华泰柏瑞300与兴全300究竟能否搬砖?
我们用上面的方法来研究两个时间序列:华泰柏瑞300与兴全300的净值序列。这两个序列都是跟踪沪深300的,因此我们会感性上觉得他们的走势应该强相关,所以很多人会用来做搬砖。那么我们看看它们究竟有没有这种强相关的关系,也就是协整关系。
首先,获取华泰柏瑞300(510300.XSHG)与兴全300(163407.XSHE)的2017年1月1日至2019年12月13日的净值序列,然后做对数处理。两者的走势如下:
p1 = get_price('510300.XSHG', start_date='2017-01-01', end_date='2019-12-13', frequency='daily', fields='close')
p2 = get_price('163407.XSHE', start_date='2017-01-01', end_date='2019-12-13', frequency='daily', fields='close')
ln_p1 = log(p1)
ln_p2 = log(p2)
看上去还挺一致。
下面我们构建它们净值之间的线性模型:
Y = α X + β + r e s i d Y=\alpha X+\beta+resid Y=αX+β+resid
import statsmodels.api as sm
x = ln_p2
y = ln_p1
# 所构建模型若含常数项使用这一步,不含常数项就不含这一句
X = sm.add_constant(x)
result = (sm.OLS(y,X)).fit()
打印拟合结果看看:
红色框体中的R平方分析是模型对原始数据的解释度。0.7左右说明模型的解释性马马虎虎。
绿色框体是我们求得的两个参数: α = 0.7082 ; β = 0.8818 \alpha=0.7082; \beta=0.8818 α=0.7082;β=0.8818。
按照这两个参数可以画出拟合的线性曲线(其实是直线):
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, 'o', label="data")
ax.plot(x, result.fittedvalues, 'r', label="OLS")
ax.legend(loc='best')
有了上面的具体参数,残差序列就得到了:
r e s i d = Y − 0.7082 X − 0.8818 resid=Y-0.7082X-0.8818 resid=Y−0.7082X−0.8818
我们进一步用ADF检验看看其平稳性:
from statsmodels.tsa.stattools import adfuller
adfuller(resid.close)
结果如下:
(-1.5651429207395833,
0.5010757745369381,
5,
713,
{'1%': -3.43955476721974,
'5%': -2.865602155751202,
'10%': -2.5689331692727135},
-4994.155385095142)
t-检验值没有显著小于10%的临界值,说明不能拒绝不平稳的假设。
在statsmodels中有更方便的判断两者是否协整的函数。
from statsmodels.tsa.stattools import coint
coint(x, y)
(-1.4004315479475968,
0.7973652863497567,
array([-3.9117583774179283, -3.3446531236567063, -3.0503622399733086]))
可以看到程序自带的函数进行的协整结果的t-检验值(-1.4004315479475968)也没有显著地小于array
中的三个临界值,所以不能接受这两个序列平稳的结论。
我们看看残差序列:
从残差序列也可以大概看出其不平稳性。
因此,利用华泰柏瑞300与兴全300搬砖的小伙伴可要小心,要反复确认它们在所考察的时间段内是否协整,且是否这种协整关系可延续。
另外,我们在建模的时候加入了常数项,也可以将常数项去掉看看建模效果。