导语:本文旨在直观地为大家介绍协整的概念,帮助大家理解其基本含义,这个概念提出的动机,以及简单的应用场景。
阅读前需要了解:
基本的统计概念,理解深度level-0
平稳的概念,理解深度level-0
这里只是想给大家指出协整的直观定义,并没有涉及严格的数学符号的定义及严密的公式推导。
一、平稳/协整
提到协整,就不得不提平稳性。
简单地说,平稳性(stationarity)是一个序列在时间推移中保持稳定不变的性质,它是我们在进行数据的分析预测时非常喜欢的一个性质。如果一组时间序列数据是平稳的,那就意味着它的均值和方差保持不变,这样我们可以方便地在序列上使用一些统计技术。我们先看一个例子,了解平稳和非平稳序列直观上长什么样。
图片来源:维基百科
上图中,靠上的序列是一个平稳的序列,我们能看到它始终是围绕着一个长期均值在波动,靠下的序列是一个非平稳序列,我们能看到它的长期均值是变动的。
举一个应用的例子,如果某个资产的价格序列(或者两个序列的价差)是平稳的,那么当它在偏离了其均值后,人们可以期待价格会在未来的某一个时间回归这个均值。我们可以借助这个性质进行投资从而获利。假设一只股票的长期均值是9元,而现在的价值是8元。如果经过检验,我们认为这个股票的历史序列具有平稳的性质,并且假设这个平稳性是能保持的,就可以买入这只股票,等待未来它的价格回归9元,从而获得1元的利润。
这就是一个具有平稳性质的股票价格序列:
平稳性是很好用,但在现实中,绝大多数的股票都是非平稳的,那么我们是否还能够利用平稳性质进行获利呢?答案是肯定的,这时协整关系(cointegration)就出场了!如果两组序列是非平稳的,但它们的线性组合可以得到一个平稳序列,那么我们就说这两组时间序列数据具有协整的性质,我们同样可以把统计性质用到这个组合的序列上来。但是需要指出的一点,协整关系并不是相关关系(correlation)。
举个例子,两组时间序列数据的差是平稳的,则我们可以根据这个差的平稳性进行投资获利:当两只股票的价差过大,根据平稳性我们预期价差会收敛,因此买入低价的股票,卖空高价的股票,等待价格回归的时候进行反向操作从而获利。
这就是配对交易(pairs trading)的由来。是不是很清晰。
二、平稳性和检验方法
严格地说,平稳性可以分为严平稳(strictly stationary)和弱平稳(或叫协方差平稳,covariance stationary等)两种。严平稳是指一个序列始终具有不变的分布函数,而弱平稳则是指具序列有不变的常量的描述性统计量。严平稳和弱平稳性质互不包含;但如果一个严平稳序列的方差是有限的,那么它是弱平稳的。我们一般所说的平稳都是指弱平稳。在时间序列分析中,我们通常通过单位根检验(unit root test)来判断一个过程是否是弱平稳的。
一个常见的单位根检验方法是Dickey-Fuller test,大致思路如下:假设被检测的时间序列YtYt
Y<em>t
Y
t满足自回归模型Yt=αYt?1 εtYt=αYt?1 εtYt=αY</em>t?1 εt
Y_t= \alpha Y{t-1} \varepsilon_t
,其中ααα
\alpha
为回归系数,εtεtεt
\varepsilon_t
为噪声的随机变量。若经过检验,发现α<1α<1\alpha< 1
\alpha< 1
,则可以肯定序列是平稳的。在Dickey Fuller Test的基础上,还有衍生出来的augmented Dickey-Fuller test,是考虑了序列的滞后性,在此不做过多陈述,在未来量化课堂的数学专栏里将会介绍。
三、举个应用的例子
我们人为地构造两组数据,由此直观地看一下协整关系。
import numpy as npimport pandas as pdimport seabornimport statsmodelsimport matplotlib.pyplot as pltfrom statsmodels.tsa.stattools import coint
构造数据
首先,我们构造两组数据,每组数据长度为100。第一组数据为100加一个向下趋势项再加一个标准正态分布。第二组数据在第一组数据的基础上加30,再加一个额外的标准正态分布。有:
Xt=100 γt εtXt=100 γt εt
<br>Xt=100 γt εt<br>
X_t=100 \gamma_t \varepsilon_t
Yt=Xt 30 μtYt=Xt 30 μt
<br>Yt=Xt 30 μt<br>
Y_t=X_t 30 \mu_t
其中γtγt
γt
\gamma_t
为趋势项,εtεtεt
\varepsilon_t
和μtμtμt
\mu_t
为无相关性的正态随机变量。
代码如下:
np.random.seed(100)
x = np.random.normal(0, 1, 500)
y = np.random.normal(0, 1, 500)
X = pd.Series(cumsum(x)) 100
Y = X y 30
for i in range(500):
X[i] = X[i] - i/10
Y[i] = Y[i] - i/10
plot(X); plot(Y);
plt.xlabel("Time"); plt.ylabel("Price");
plt.legend(["X", "Y"]);
显然,这两组数据都是非平稳的,因为均值随着时间的变化而变化。但这两组数据是具有协整关系的,因为他们的差序列Yt?XtYt?Xt
Yt?Xt
Y_t-X_t
是平稳的:
plot(Y-X);plt.axhline((Y-X).mean(), color="red", linestyle="");plt.xlabel("Time"); plt.ylabel("Price");plt.legend(["Y-X", "Mean"]);
上图中,可以看出蓝线Yt?XtYt?Xt
Yt?Xt
Y_t-X_t
一直围绕均值波动。而均值不随时间变化(其实方差也不随时间变化)。
小结:如果完全从数学的角度讲清楚协整,会比较复杂,日后的量化课堂会有涉及。我们只是在了解(level-0)的层面上做了一个简单介绍,目的还是让大家更好的将协整与实际应用结合起来。
注:文末有可运行的代码块,大家可以在joinquant*研究,运行程序。
更多深入研究,请参见后面的应用类文章。
本文由JoinQuant量化课堂推出,版权归JoinQuant所有,商业转载请联系我们获得授权,非商业转载请注明出处。
文章更迭记录:
v1.1,2016-10-13,修正概念性错误,感谢 zhangyi 指出
v1.0,2016-07-05,文章上线
import numpy as npimport pandas as pdimport seabornimport statsmodelsimport matplotlib.pyplot as pltfrom statsmodels.tsa.stattools import coint
np.random.seed(100)x = np.random.normal(0, 1, 500)y = np.random.normal(0, 1, 500)X = pd.Series(cumsum(x)) + 100Y = X + y + 30for i in range(500):X[i] = X[i] - i/10Y[i] = Y[i] - i/10plot(X); plot(Y);plt.xlabel("Time"); plt.ylabel("Price");plt.legend(["X", "Y"]);
plot(Y-X);plt.axhline((Y-X).mean(), color="red", linestyle="");plt.xlabel("Time"); plt.ylabel("Price");plt.legend(["Y-X", "Mean"]);