LIUKK的工作站
LiuKK
Jul 9, 2016
阅读本文需要 8 分钟

统计套利的配对交易就是基于数学分析的交易策略,利用两只证券的价差(spread)来获取套利机会。价差具有一定关系的两只证券可能存在协整关系(cointegration)。

协整关系存在的条件是:只有当两个变量的时间序列{x}和{y}是同阶单整序列即I(d)时,才可能存在协整关系(这一点对多变量协整并不适用)。因此在进行y和x两个变量协整关系检验之前,先用ADF单位根检验对两时间序列{x}和{y}进行平稳性检验。用单位根检验(ADF)。

这里选取北京银行和交通银行来做研究。

import numpy as np
import pandas as pd
import seaborn 
import matplotlib.pyplot as plt

beginDate="2013-01-01"
endDate="2014-01-01"
data1=get_price("601169.XSHG",start_date=beginDate,end_date=endDate,fields=['close'],frequency='daily')
data2=get_price("601328.XSHG",start_date=beginDate,end_date=endDate,fields=['close'],frequency='daily')

z=pd.concat([data1,data2],axis=1)
z.columns=['BJYH','JTYH']
z.plot(figsize=(14,7))
<matplotlib.axes._subplots.AxesSubplot at 0x7fec21774390>

png

from statsmodels.tsa.stattools import adfuller
def testStationarity(data):
    adftest=adfuller(data)
    result=pd.Series(adftest[0:4],index=['Test Statistics','p-value','Lags Used','Number of Observation Used'])
    for key,value in adftest[4].items():
        result['Critical Value (%s)'%key]=value
    return result
x=np.array(data1)
y=np.array(data2)
x=x.T[0]
y=y.T[0]
zz=pd.concat([testStationarity(x),testStationarity(y)],axis=1)
zz.columns=['BJYH','JTYH']
zz
BJYH JTYH
Test Statistics -2.065881 -1.740105
p-value 0.258454 0.410576
Lags Used 0.000000 4.000000
Number of Observation Used 237.000000 233.000000
Critical Value (5%) -2.873814 -2.874026
Critical Value (1%) -3.458247 -3.458731
Critical Value (10%) -2.573311 -2.573424

p值不显著,说明接受原假设,即存在单位根。下面做一阶差分以后,再检验平稳性。

def diffone(data):
    Diff=data.diff(1)
    Diff.dropna(inplace=True)
    Diff=np.array(Diff).T[0]
    return Diff
diffx=diffone(data1)
diffy=diffone(data2)
tz=pd.concat([testStationarity(diffx),testStationarity(diffy)],axis=1)
tz.columns=['BJYH','JTYH']
tz
BJYH JTYH
Test Statistics -1.676017e+01 -6.075262e+00
p-value 1.312152e-29 1.125575e-07
Lags Used 0.000000e+00 5.000000e+00
Number of Observation Used 2.360000e+02 2.310000e+02
Critical Value (5%) -2.873866e+00 -2.874135e+00
Critical Value (1%) -3.458366e+00 -3.458980e+00
Critical Value (10%) -2.573339e+00 -2.573482e+00

现在的p值很显著,也就是说可以拒绝原假设,即不存在单位根,序列平稳。

既然他们都是一阶平稳的,那么现在就可以做协整检验了。

from statsmodels.tsa.stattools import coint
a,pvalue,b=coint(x,y)
print (pvalue)
0.00102528244038

p值显著,可以拒绝原假设,则两者存在协整关系。

接下来可以根据两者的协整关系做配对交易了。

mean=(data1-data2).mean()
std=(data1-data2).std()
s1=pd.Series(mean[0],index=data1.index)
s2=pd.Series(mean[0]+std[0],index=data1.index)
s3=pd.Series(mean[0]-std[0],index=data1.index)
data3=pd.concat([data1-data2,s1,s2,s3],axis=1)
data3.columns=['spread','mean','upper','down']
print(mean[0]+std[0],mean[0]-std[0])
data3.plot(figsize=(14,7))
1.7175819797 1.43771213795





<matplotlib.axes._subplots.AxesSubplot at 0x7fec16f93978>

png

策略的话,简单的策略就是价差超过upper的时候卖空价差,即卖出北京银行,买入交通银行;价差小于down的时候,买入价差,即买入交通银行,卖空北京银行。


>