python cointegration()函数详解
最近做的小项目是协整关系用于配对交易。顺便复习了协整和相关性之间的差异。应该来说,协整关系是时间序列的一个重点内容,多次碰到,值得注意。
一、相关性(correlation)VS协整关系(cointegration)
1、相关性(correlation)
定义:通常是两个序列X 和 Y之间的线性依存关系(linear dependence)。
\begin{aligned} & corr(X,Y)=\frac{cov(X,Y)}{\sigma(X)\sigma(Y)}\\ \end{aligned}
XY相关系数corr(X,Y)=0,未必独立(独立定义P(XY)=P(X)P(Y)),因为XY可能服从非线性的相关关系;而独立一定不相关。
corr(X,Y)=0,是指X的线性组合无法解释Y。
相关系数介于[-1,1]之间——±1是完全线性相关。
检测相关性,pearsonr检测的是具体值之间的相关性,spearsonr检测的是rank之间的相关性(券商多因子中提到的RankIC一般就是spearmanr)。
from scipy.stats import pearsonr, spearmanr
pearson_corr, pearson_pvalue = pearsonr(X, Y)
spearnman_corr, spearnman_pvalue = spearmanr(X, Y)。
2、平稳性(Stationarity)
定义:如果数据产生过程的参数(例如均值和方差)不随着时间变化,那么数据平稳。
例如,时间序列x_t的均值和方差是常数、和时间t无关,那么x_t具有平稳性。
如果用平稳的分析刻画一个均值/方差随时间变化的时间序列,那么将会导致garbage in garbage out。
例如,下图series B,是一个随着时间t而均值不断增大的曲线。
测试平稳性:使用augmented Dickey Fuller test,P值越小,说明越可能是平稳的时间序列。
from statsmodels.tsa.stattools import adfuller
pvalue = adfuller(some_series)[1]
3、单整(Integration)——不是很重要
单整阶数(order of integration)
I(0) :如果一个时间序列Y的移动平均表达 Y_t = \sum_{i=1}^{\infty}b_i\epsilon_{t-i} + \eta_t ,满足条件 \sum_{i=0}^{\infty}|b_i|^2 <\infty ,那么 Y_t 服从 I(0) ;其中 \epsilon_i 是随机过程的白噪声(残差项), b_i 是残差项的权重, \eta 是起决定作用的序列。
注意: I(0) \in Stationarity
I(1):如果一个序列X的一阶差分服从I(0),那么X服从I(1)。
实际运用:资产收益率一般被认为是服从I(0),资产价格被认为服从I(1)。
4、协整(Cointegration)
问题:单整I(1)的时间序列未必平稳,但是如果通过一阶差分得到平稳的时间序列,那么刻画的是短期的动态。这里需要协整关系。
定义:如果 X_t 和 Y_t 均为I(1),但是线性组合 aX_t+bY_t\sim I(0) ,那么X_t 和 Y_t之间存在协整关系。
通常表达, Y_t = cX_t+\epsilon_t ,其中 \epsilon_t 是平稳的时间序列,那么当回归系数 c 和\epsilon_t均和时间t无关的时候,那么就能够用 X_t 预测 Y_t 。
直觉
当两个资产价格服从协整关系的时候,那么其线性组合满足均值回复(mean reverting)的性质。
X_2=\alpha+\beta X_1+\epsilon ,那么从 X_2 中剔除X_1的影响之后, \alpha+\epsilon = X_2-\beta X_1 是平稳的序列、满足均值回复。如果X_2-\beta X_1超出了这个关系,那么就能够在突破上下限的时候进行套利交易。
测试协整关系
from statsmodels.tsa.stattools import coint
_, pvalue, _ = coint(X1, X2)
P值越小,说明X1和X2的协整关系越强。
5、协整VS相关性
协整不一定相关
import pandas as pd
import numpy as np
from scipy.stats import pearsonr
from statsmodels.tsa.stattools import coint
import matplotlib.pyplot as plt
x1 = pd.Series(al(0,1,1000))
x2 = x1.copy(
for i in range(10):
    x2[(100*i):(100*i+100)] = (-1)**i
   
plt.figure(figsize=(6,3))
plt.plot(x1, c='blue')
plt.plot(x2, c='red')
plt.show(   
_, pv, _ = coint(x1, x2)
print("Cointegration test p-value : ", pv)
correl, pv = pearsonr(x1, x2)
print("Correlation : ", correl)。
结果:协整关系非常显著p-value = 0.0;但是基本没有相关性。
相关不一定协整
ret1 = al(1,1,100)
ret2 = al(2,1,100)
s1 = pd.Series(np.cumsum(ret1))
s2 = pd.Series(np.cumsum(ret2))
python trunc函数
plt.figure(figsize=(6,3))
plt.plot(s1)
plt.plot(s2)
plt.show(

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。