跨期套利-协整套利及程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
跨期套利-协整套利及程序设计
套利是股指期货投资方式中常见的一种。相比之下,投机的风险比较大,套期保值的出发点是为了规避现货市场的损失,根本上就是一个零和博弈,无法获得最大收益。而套利的收益则是独立于市场的,它无需关心市场的涨跌便能获得稳定的收益,而且波动性相对较小,这使得套利逐渐成为被关注的重要投资方式。
由于期现套利涉及到现货头寸的构建,实施起来较为复杂,所以本文主要集中研究跨期套利的时机和概率。总体上而言,无论是跨期套利还是期现套利,它们的思想无外乎是利用差价的波动构建资产组合得以规避单一资产的过大风险,从而制定相应的买卖策略,最终获得稳定的收益。
传统的跨期套利中投资者需要预期价差(spread)的走势来建立套利头寸,在主观性的影响下这种方法局限性很大。所以我们尝试用统计套利(Statistical Arbitrage)的方法发现价差的稳定性以及变量间的长期均衡关系,用实际的价格与数量模型所预测的价值进行对比,制定统计方法下相对客观的跨期套利策略。本文选取广泛应用的协整统计方法。
一、协整方法介绍
由期指定价模型而知,不同合约的走势都是基于对未来标的指数的预期产生的,除了持有成本带来的合约价差外还有一些非合理的因素,从长期来看同一标的的各合约价格之间存在着这样一种平稳关系。协整概念便是处理非平稳时间序列的较好统计方法,如果一个时间序列经过平稳性检验发现是非平稳性的,那么对其进行差分消除非平稳的因素使得其成为平稳序列,这个过程就是时间序列的单整过程。
协整关系反映变量之间的长期均衡关系,变量间存在协整关系是建立在单整过程基础上的,即变量序列本身是非平稳的,而且变量之间具有相同的单整阶数。其中涉及的时间序列的平稳性检验,可以通过ADF单位根检验来实现,协整关系可以用EG检验或Johansen协整检验进行。当确定协整关系之后便可以对价差序列进行统计分析来确定适宜的交易策略。
总结
本报告介绍了同传统的股指期货跨期套利思想完全不同的一种套利新思路,那便是利用协整关系从统计套利的角度构建不同合约之间的长期均衡关系。协整方法使得价差序列的分析更加客观化,从而制定相对稳健的交易策略。跨期套利最大的特点就是无需对市场的情况进行判断就可以获得收益,并且主要对价差序列的数据进行深度分析,根本上是利用价差序列在短期内的资产定价偏离的修正过程而产生的对冲交易。
此外仍有一些值得思考的地方。我们选取的是样本内数据建立的数量模型,在数据发生变化下无法及时反映变量之间的关系,所以需要及时更新高频数据。本文选取的是1小时数据,也可选择5分钟数据进行跨期套利策略效果的对比。该高频率的套利策略实施需要程序化交易来协助进行,对于程序化交易的发展仍需进一步研究。另外,文中提到的影响套利效果的几个因素,例如:选取不同的标准差倍数、频繁的套利交易带来的交易成本大小、指数期货合约的保证金规模等都对跨期套利组合的收益大小起到了至关重要的作用。对于即将正式登陆市场的沪深300指数期货,上市初期各合约定价偏差较大,本文的研究对于套利机会的挖掘和分析有一定的指导作用,上面指出的影响协整方法下的跨期套利效果的因素,需要在进一步探讨的过程中加以研究和改进。
Matlab 程序设计
% backtest example to look for a pairs trade.
load Portfolio_Data.mat
[r1 r2]=size(P);
rsample=floor(r1/2);
[a]=corrcoef(P(1:rsample,:));
b=find(a==1);
a(b)=0;
c=min(min(a));
[d,e]=find(a==c,1,'last');
X = P(:,d);
Y= P(:,e);
N=25:25:500;
M=5:5:50;
sh=zeros(length(N),length(M));
for i=1:length(N)
for j=1:length(M)
sh(i,j)=cointStrat(X,Y,N(i),M(j));
end
N(i);
end
figure
imagesc(M,N,sh); colorbar
[I,J]=find(sh==max(max(sh)));
[shbest,pnl,pos]=cointStrat(X,Y,N(I),M(J));
figure
plot(cumsum(pnl)), title(['Best sh = ',num2str(shbest),' N=',num2str(N(I)),', M=',num2str(M(J))]);
function [sh,pnl,pos] = cointStrat(X,Y,N,M)
% cointegration routine
% use N days of history and rebalance every M days
lX=length(X);
I = ones(N,1);
pos = zeros(lX,2);
for i=1:lX-N-1
xwind = X(i:N+i-1);
ywind = Y(i:N+i-1);
if rem(i,M)==1
% do the regression
beta = [I,xwind]\ywind;
% test for cointegration
end
% form the residuals
res = ywind - [I,xwind]*beta;
H= dfARTest(res);
% if the coint test is true, then use positions
if H
stdres = std(res(1:end-1));
% check the spread is large