You are on page 1of 9

If 跨期套利模型一览

Sohca qq:137538616
效率曲线如下:手续费扣除300--

% % fetch_data_from_wind%模块用来从wind取数据,周期的话在m文件里面改
%
calc_wind_data%计算我盟需要用到的参数和时间序列,这里的套利过程我们默认服从arma过程
,最传统的套利方式

%
通过wind来获取5m的数据,第三列存储为两个合约的价差,套利本质上来说,就是在做价差交易
,这点很重要,一定要谨记
% clc
% clear
% close
% w=windmatlab;
% % 设定初始的时间
% begintimestr='2010.4.16 9:15:00:00';
% % 设定结束的时间
% endtimestr='2015.8.25 15:15:00';
% % 设定相关的fields
% fieldstr='open,high,low,close,volume';
%
% barsize_str='BarSize=5';
%
% %%获取主力合约和非主力合约的对应周期的数据
% [wsi_data_main,w_wsi_codes,w_wsi_fields,w_wsi_times,w_wsi_errorid,w_wsi_reqid]=
...
% return_wind_wsi('iF00.cfe',fieldstr,begintimestr,endtimestr,barsize_str);
% [wsi_data_cmp,w_wsi_codes,w_wsi_fields,w_wsi_times,w_wsi_errorid,w_wsi_reqid]=
...
% return_wind_wsi('iF01.cfe',fieldstr,begintimestr,endtimestr,barsize_str);
%
% % 把主力合约和非主力合约的数据进行合并
% my_all_data=[wsi_data_main,wsi_data_cmp];
% save my_all_data my_all_data
% test_abt_data(:,1)=my_all_data(:,1);
% test_abt_data(:,2)=my_all_data(:,2);
% test_abt_data(:,3)=my_all_data(:,13)-my_all_data(:,6);
% test_abt_data(:,4)=my_all_data(:,6);%%主力合约的close价格
% test_abt_data(:,5)=my_all_data(:,13);%%非主力合约的close价格
% save test_abt_data test_abt_data

% % 这里套利模式是布林线套利
clc
clear
close
load test_abt_data
%设定时间序列回归的周期
sma_length=20;
%设定时间序列的噪音阈值,也是我们交易的关键

std_mul=2;
gallon_mul=4;
stoploss_mul=6;

gallon_lots=1;

for cycledata=sma_length:1:size(test_abt_data,1)

tempvc=test_abt_data(cycledata-sma_length+1:1:cycledata,3);

test_abt_data(cycledata,6)=mean(tempvc);%计算价差均值
test_abt_data(cycledata,7)=std(tempvc);%计算标准差
test_abt_data(cycledata,8)=test_abt_data(cycledata,6)-
std_mul*test_abt_data(cycledata,7);%8标准差 下

test_abt_data(cycledata,9)=test_abt_data(cycledata,6)+std_mul*test_abt_data(cycleda
ta,7);%9标准差 上
test_abt_data(cycledata,10)=test_abt_data(cycledata,6)-
gallon_mul*test_abt_data(cycledata,7);%10标准差的补仓轨下

test_abt_data(cycledata,11)=test_abt_data(cycledata,6)+gallon_mul*test_abt_data(cyc
ledata,7);%11标准差的补仓轨上
test_abt_data(cycledata,12)=test_abt_data(cycledata,6)-
stoploss_mul*test_abt_data(cycledata,7);%12标准差的止损轨下

test_abt_data(cycledata,13)=test_abt_data(cycledata,6)+stoploss_mul*test_abt_data(c
ycledata,7);%13标准差的止损轨上
end;

o_struct=struct('avgentryprice',0 ,'thisposition',0,'currentlots',0,'thisprofit',0
...
,'entrydate1',0,'entrytime1',0,'entryprice1',0,'entryrownum1',0 ...
,'entrydate2',0,'entrytime2',0,'entryprice2',0,'entryrownum2',0 ...
,'currentOW',0 ...
,'exitdate',0,'exittime',0,'exitprice',0,'exitrownum',0);

cur_position=0;

max_stoplosspoint=40;

listrownum=1;
for trade_cursor=sma_length:1:size(test_abt_data,1)

%设置止损价格,止损价格的设置要和当前的噪音直接相关的
smavc=test_abt_data(trade_cursor-sma_length+1:1:trade_cursor,7);

extra_condition1=mean(smavc)>=1;
% extra_condition1=true;

%%入场
%%空头入场条件
short_entry_condition=cur_position==0 && ...
test_abt_data(trade_cursor-1,3)>=test_abt_data(trade_cursor-1,9) && ...
test_abt_data(trade_cursor,3)<=test_abt_data(trade_cursor,9) &&
extra_condition1 ...
&& test_abt_data(trade_cursor,3)>test_abt_data(trade_cursor,6);

if short_entry_condition==true

o_struct(listrownum).entrydate1=test_abt_data(trade_cursor,1);
o_struct(listrownum).entrytime1=test_abt_data(trade_cursor,2);
o_struct(listrownum).entryprice1=test_abt_data(trade_cursor,3);
o_struct(listrownum).entryrownum1=trade_cursor;

o_struct(listrownum).avgentryprice=o_struct(listrownum).entryprice1;
o_struct(listrownum).thisposition=-1;
o_struct(listrownum).currentlots=1;
o_struct(listrownum).currentOW=0;

cur_position=-1;

end;

%多头入场条件
long_entry_condition=cur_position==0 && ...
test_abt_data(trade_cursor-1,3)<=test_abt_data(trade_cursor-1,8) && ...
test_abt_data(trade_cursor,3)>=test_abt_data(trade_cursor,8) &&
extra_condition1 ...
&& test_abt_data(trade_cursor,3)<test_abt_data(trade_cursor,6);

if long_entry_condition==true

o_struct(listrownum).entrydate1=test_abt_data(trade_cursor,1);
o_struct(listrownum).entrytime1=test_abt_data(trade_cursor,2);
o_struct(listrownum).entryprice1=test_abt_data(trade_cursor,3);
o_struct(listrownum).entryrownum1=trade_cursor;

o_struct(listrownum).avgentryprice=o_struct(listrownum).entryprice1;
o_struct(listrownum).thisposition=1;
o_struct(listrownum).currentlots=1;
o_struct(listrownum).currentOW=0;

cur_position=1;
% disp('pause here')
% pause
end;
% 入场

%%出场
%%空头出场条件
short_exit_condition=cur_position==-1 && ...
test_abt_data(trade_cursor,3)<=test_abt_data(trade_cursor,6);

%%空头止损条件
% short_stoploss_condition=cur_position==-1 ...
% &&
test_abt_data(trade_cursor,3)>=test_abt_data(trade_cursor,13);%%止损轨道

short_stoploss_condition=cur_position==-1 ...
&&
test_abt_data(trade_cursor,3)>=o_struct(listrownum).avgentryprice+max_stoplosspoint
;%%%%止损最大值

if short_exit_condition==true || short_stoploss_condition==true
o_struct(listrownum).exitdate=test_abt_data(trade_cursor,1);%出场日期
o_struct(listrownum).exittime=test_abt_data(trade_cursor,2);%出场时间
o_struct(listrownum).exitprice=test_abt_data(trade_cursor,3);%出场的价差
o_struct(listrownum).thisprofit=(o_struct(listrownum).exitprice-
o_struct(listrownum).avgentryprice) ...
*o_struct(listrownum).thisposition*o_struct(listrownum).currentlots;
o_struct(listrownum).exitrownum=trade_cursor;

% plot_spread=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,3);
% plot(plot_spread,'b');
%
% plot_mean_spread=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,6);
% hold on
% plot(plot_mean_spread,'r');
%
% plot_high=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,8);
% hold on
% plot(plot_high,'g');
%
% plot_low=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,9);
% hold on
% plot(plot_low,'g');
% titlestr=['空头离场',num2str(o_struct(listrownum).thisprofit)];
% title(titlestr)
% hold off
%
% pause
listrownum=listrownum+1;
cur_position=0;
end;
%
%%多头出场条件
long_exit_condition=cur_position==1 && ...
test_abt_data(trade_cursor,3)>=test_abt_data(trade_cursor,6) ;
%%多头止损条件

% long_stoploss_condition=cur_position==1 ...
% &&
test_abt_data(trade_cursor,3)<=test_abt_data(trade_cursor,12);%%止损轨道
long_stoploss_condition=cur_position==1 ...
&& test_abt_data(trade_cursor,3)<=o_struct(listrownum).avgentryprice-
max_stoplosspoint;%%止损最大值

if long_exit_condition==true || long_stoploss_condition==true
o_struct(listrownum).exitdate=test_abt_data(trade_cursor,1);%出场日期
o_struct(listrownum).exittime=test_abt_data(trade_cursor,2);%出场时间
o_struct(listrownum).exitprice=test_abt_data(trade_cursor,3);%出场的价差
o_struct(listrownum).thisprofit=(o_struct(listrownum).exitprice-
o_struct(listrownum).avgentryprice) ...
*o_struct(listrownum).thisposition*o_struct(listrownum).currentlots;
o_struct(listrownum).exitrownum=trade_cursor;

% plot_spread=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,3);
% plot(plot_spread,'b');
%
% plot_mean_spread=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,6);
% hold on
% plot(plot_mean_spread,'r');
%
% plot_high=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,8);
% hold on
% plot(plot_high,'g');
%
% plot_low=test_abt_data(o_struct(listrownum).entryrownum1-
1:o_struct(listrownum).exitrownum,9);
% hold on
% plot(plot_low,'g');
% titlestr=['多头离场',num2str(o_struct(listrownum).thisprofit)];
% title(titlestr)
% hold off
% pause
listrownum=listrownum+1;
cur_position=0;
%
plotdata=test_abt_data(o_struct(listrownum).entryrownum1:o_struct(listrownum).exitr
ownum,3);
% plot(plotdata);
% title('多头离场')
% pause
end;
%出场

%%补仓条件
short_gallon_condition=cur_position==-1 && ...

test_abt_data(trade_cursor,3)>=o_struct(listrownum).avgentryprice+0.5*max_stoplossp
oint ...
&& o_struct(listrownum).currentOW==0;%补仓上轨

if short_gallon_condition
o_struct(listrownum).entrydate2=test_abt_data(trade_cursor,1);
o_struct(listrownum).entrytime2=test_abt_data(trade_cursor,2);
o_struct(listrownum).entryprice2=test_abt_data(trade_cursor,3);
o_struct(listrownum).currentOW=1;
o_struct(listrownum).avgentryprice= ...

o_struct(listrownum).entryprice2*gallon_lots/(1+gallon_lots)+o_struct(listrownum).e
ntryprice1/(1+gallon_lots);

o_struct(listrownum).currentlots=o_struct(listrownum).currentlots*(1+gallon_lots);
o_struct(listrownum).entryrownum2=trade_cursor;
end;

long_gallon_condition=cur_position==1 && ...


test_abt_data(trade_cursor,3)<=o_struct(listrownum).avgentryprice-
0.5*max_stoplosspoint ...
&& o_struct(listrownum).currentOW==0;%补仓下轨

if long_gallon_condition
o_struct(listrownum).entrydate2=test_abt_data(trade_cursor,1);
o_struct(listrownum).entrytime2=test_abt_data(trade_cursor,2);
o_struct(listrownum).entryprice2=test_abt_data(trade_cursor,3);
o_struct(listrownum).currentOW=1;
o_struct(listrownum).avgentryprice= ...

o_struct(listrownum).entryprice2*gallon_lots/(1+gallon_lots)+o_struct(listrownum).e
ntryprice1/(1+gallon_lots);

o_struct(listrownum).currentlots=o_struct(listrownum).currentlots*(1+gallon_lots);
o_struct(listrownum).entryrownum2=trade_cursor;
end;
%%补仓条件

end;

listprofit=[];
for cycle_os=1:1:size(o_struct,2)-1
listprofit(size(listprofit,1)+1,1)=(o_struct(cycle_os).exitprice-
o_struct(cycle_os).avgentryprice) ...
*o_struct(cycle_os).thisposition*o_struct(cycle_os).currentlots;
end;
listprofit=listprofit;

commistion_point=1;

listprofit=listprofit-commistion_point;

capital_curve=cumsum(listprofit);
plot(capital_curve,'r-')
titlestr=['来回手续费按照:',num2str(commistion_point*300),'
来算的手续费的资金曲线']
title(titlestr)

You might also like