pair trading(cointegration), 202
(2022.09.02 Fri)
pair trading可以使用多种方法实现交易,包括
- 最小化偏差平方和法则(最小距离法)(Gatev,Goetzmann ,Rouwenhorst(1999))
- 协整理论方法(Vidyamurthy(2004))
- 随机价差模型方法(Elliott,Van Der Hoek,Malcolm(2005))
这里列举整理了协整的方法。
Co-integration
首先了解平稳性。
平稳性(stationarity)是一个序列在时间推移中保持稳定不变的性质,也就是它的均值和方差保持不变,这样可以方便地在序列上应用一些统计技术。
一个平稳的序列是围绕着一个长期均值在波动的序列,非平稳序列的长期均值是变动的。
举一个应用的例子,如果某个资产的价格序列(或者两个序列的价差)是平稳的,那么当它在偏离了其均值后,人们可以期待价格会在未来的某一个时间回归这个均值。我们可以借助这个性质进行投资从而获利。假设一只股票的长期均值是9元,而现在的价值是8元。如果经过检验,我们认为这个股票的历史序列具有平稳的性质,并且假设这个平稳性是能保持的,就可以买入这只股票,等待未来它的价格回归9元,从而获得1元的利润。
现实中,绝大多数的股票价格都是非平稳的。想利用平稳特性获利就需要协整关系(cointegration)。如果两组序列是非平稳的,但它们的线性组合可以得到一个平稳序列,则这两组时间序列数据具有协整性,我们同样可以把统计性质用到这个组合的序列上来。之所以会出现价差平稳的特性,是因为某些金融时间序列受到了共同经济因素影响,表现出趋同性。
需要注意,协整关系并不是相关关系(correlation)。
举个例子,两组时间序列数据(股价)未必是平稳的,但它们的价差(线性组合)可能是平稳的,则我们可以根据这个差的平稳性进行投资获利:当两只股票的价差过大,根据平稳性我们预期价差会收敛,因此买入低价的股票,卖空高价的股票,等待价格回归的时候进行反向操作从而获利。
平稳性检验
(就是取两个标的,然后相关性检验->序列单整检验->同阶单整的进行协整检验->取相关性系数、均值和标准差计算两只标的目前的价差值->价差值符合开仓平仓条件的,做相应操作。)
平稳性可以分为严平稳(strictly stationary)和弱平稳(或叫协方差平稳,covariance stationary等)两种。严平稳是指一个序列始终具有不变的分布函数,而弱平稳则是指具序列有不变的常量的描述性统计量。严平稳和弱平稳性质互不包含;但如果一个严平稳序列的方差是有限的,那么它是弱平稳的。我们一般所说的平稳都是指弱平稳。在时间序列分析中,通常通过单位根检验(unit root test)来判断一个过程是否是弱平稳。平稳的时间序列应该会在某固定值附近随机震荡,该现象称为均值回归(mean-reversion)。
一个常见的单位根检验方法是Dickey-Fuller test,大致思路如下:假设被检测的时间序列满足自回归模型,其中α为回归系数,为噪声的随机变量。若经过检验,发现,则可以肯定序列是平稳的。在Dickey Fuller Test的基础上,还有衍生出来的augmented Dickey-Fuller test,考虑了序列的滞后性。
ADF检测平稳性代码。
from statsmodels.tsa.stattools import adfuller
import numpy as np
import pandas as pd
adf_test = adfuller(timesequence, autolag='AIC')
adf_test_output = pd.Series(dftest[0:4],index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in adf_test[4].items():
adf_test_output['Critical Value (%s)' % key] = value
print(adf_test_output)
这里的p值越小,协整关系越强。
from statsmodels.tsa.stattools import coint
_, pvalue, _ = coint(timesequence1, timesequence2)
实例
import numpy as np
import pandas as pd
import seaborn
import statsmodels
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import coint
构造两组数据,每组数据长度为100。第一组数据为100加一个向下趋势项再加一个标准正态分布。第二组数据在第一组数据的基础上加30,再加一个额外的标准正态分布。有:
其中为趋势项,和为无相关性的正态随机变量。
np.random.seed(100)
x = np.random.normal(0, 1, 500)
y = np.random.normal(0, 1, 500)
X = pd.Series(np.cumsum(x)) + 50
Y = X + y + 10
for i in range(500):
X[i] = X[i] - i/10
Y[i] = Y[i] - i/10
plt.plot(X); plt.plot(Y);
plt.grid(1)
plt.xlabel("Time"); plt.ylabel("Price");
plt.legend(["X", "Y"]);
price trend
价格走势不稳定,但是其价差稳定,如图
plt.plot(Y-X);
plt.axhline((Y-X).mean(), color="red", linestyle="--");
plt.grid(1)
plt.xlabel("Time"); plt.ylabel("Price");
plt.legend(["Y-X", "Mean"]);
pair trading: price gap
一个可能的交易策略,在不允许做空的市场中
当价差序列为时:卖高价,买低价。
当价差序列为时:买高价,卖低价。
其中的系数可适当调整。
Reference
1 【量化课堂】协整的直观认识,聚宽
2 配对交易,倔强的小DB,知乎
3 量化策略原理:基于协整理论的配对交易,苏什么来着,知乎