龙溟喜欢凌波吗:程序化交易

来源:百度文库 编辑:九乡新闻网 时间:2024/04/26 14:31:26
程序化交易(1)——跨期正向套利程序化预算跨期套利成本和预期收益,对很多同仁来说,可能是比较繁琐的事情,毕竟当中涉及到品种是不是要多收仓储费,标准仓单是不是要注销,合约保证金随仓位和时间的变动的浮动收取带来的资金成本等,都对现在市面上普遍使用的公式提出正确性质疑,这里,我给大家提供的程序,可以避免掉这些困扰。

程序主要分成以下几个部分:

跨期套利:对于同类品种不同月份之间的正向套利计算现有价差下的盈利可能性和预计收益率,以及风险VaR分析,例如铜0909与0912之间是不是有套利可行性。

程序运行结果如下:

[spread,totalcost,netreturn]=termarbitrage_shanghai(909,912,20090826,49630,49450,1);
输出结果:
————————————————————————————————————
————————————————————————————————————
你选择的对象为铜跨期套利

铜跨期套利 909,912

现在价差还离套利区间较远,耐心等待
*******************************************************************
*******************************************************************

如果我们将铜912价格换取成50000
[spread,totalcost,netreturn]=termarbitrage_shanghai(909,912,20090826,49630,50000,1);
输出结果:
————————————————————————————————————
————————————————————————————————————
你选择的对象为铜跨期套利

铜跨期套利 909,912

现在品种1所处的阶段为==: 4

现在品种1保证金率为==: 0.16

现在品种2所处的阶段为==: 1

现在品种2保证金率为==: 0.09

今天价差为==: 370

仓储费为==: 36.8

租金成本为==: 816.0979

预算总成本为==: 928.026

预算年化收益为==: -0.036936

*******************************************************************
*******************************************************************

说明//
这个程序现在只是例举了上海铜正向套利成本和收益预算功能,其他功能如其他所有过国内市场的预算,以及期现套利和跨市场套利都保留在程序功能内,作为一个期货公司或者投资公司,有这样的程序化计算过程,可能很轻松的计算历史价差变动和盈利点,并计算出盈利出击需要承担的风险等。 function [spread,totalcost,netreturn]=termarbitrage_shanghai(date1,date2,today,p1,p2,pinzhong)
% 商品跨期套利成本计算
% date1: 商品1日期代码,如cu0906,我们只取906
% date2: 商品2日期代码,如cu0909, 我们只取909
% today: 今天日期
% 品种: 1 铜, 2 铝 ,3 锌,4 橡胶, 5 燃料油,6 对线材和螺纹钢
% p1 ,p2 为品种期货最新价格
% remark: %这里的时间区间均采用了近似时间区间,代替了法定保证金交易日变更区间的界定。近似对计算结果影响不大。
% author :jemnbo@hotmail.com
%% example
%{
[spread,totalcost,netreturn]=termarbitrage(date1,date2,today,p1,p2,pinzhong)
[spread,totalcost,netreturn]=termarbitrage(909,911,20090619,15030,15170,4);
输出结果:
你选择的对象为橡胶跨期套利

橡胶跨期套利 909,911

现在品种1所处的阶段为==: 1

现在品种1保证金率为==: 0.09

现在品种2所处的阶段为==: 1

现在品种2保证金率为==: 0.09

今天价差为==: 140

预算总成本为==: 314.5947

预算年化收益为==: -0.042957
%}
%% 铜

year0=fix(today/10000); % 年
if mod(year0,4)==0
floatday=29;
else
floatday=28;
end
yuemo=[1,31;2,floatday;3,31;4,30;5,31;6,30;7,31;8,31;9,30;10,31;11,30;12,31];% 月末日期
spread=p2-p1;% 价差
switch pinzhong
case 1
disp('输出结果:')
disp('————————————————————————————————————')
disp('————————————————————————————————————')
disp('你选择的对象为铜跨期套利')
fprintf(1,['\n 铜跨期套利 ' num2str(date1) ',' num2str(date2) '\n\n'])
if spread<=0
disp('现在价差还离套利区间较远,耐心等待')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
else
% 铜

%%%%%%%% 固定费率
guohufei=6*2; %过户费(两次)
fenjianfei=5; % 分检费(1次)
shouxufei=(p1+p1)*0.00022/5; % 手续费(一次)
zhengzhisuilv=0.17/1.17; % 增值税率
cangcucostlv=0.4; % 仓储费率(天)
spread=p2-p1;% 价差
rent=0.0536; % 一年贷款利率

%%%%%
year1=2000+fix(date1/100); % 年
mon1=date1-fix(date1/100)*100;% 月
year2=2000+fix(date2/100); % 年
mon2=date2-fix(date2/100)*100;% 月
year0=fix(today/10000); % 年
mon0=fix((today-fix(today/10000)*10000)/100);% 月
day0=today-year0*10000-mon0*100; %日

%%%%% 今天的matlab时间
day0_mat=datenum(year0,mon0,day0); % 今日对应的matlab时间

% 时间结构~ 铜为六个层次 ,因为各个阶段的保证金比率各不相同。
%%%%%%%% date1结构
if (year1*12+mon1)-(year0*12+mon0)>12
disp('error,你研究的品种1还没有上市')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return;
end
if (year2*12+mon2)-(year0*12+mon0)>12
disp('error,你研究的品种2还没有上市')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return;
end

if mon1<=2
t11=[ year1-1,mon1,16; year1-1,12+mon1-2,15];% 从品种上市之日起开始计时段,到交割月前第二个月的第十个交易日,5%(7%+1%)
else
t11=[ year1-1,mon1,16; year1,mon1-2,15];% 注意月末数据的选择
end if mon1<=2
temp=find(yuemo==12+mon1-2);
t12=[ year1-1,12+mon1-2,16; year1-1,12+mon1-2,yuemo(temp,2)];
else
temp=find(yuemo==mon1-2);
t12=[ year1,mon1-2,16; year1,mon1-2,yuemo(temp,2)];% 注意月末数据的选择,8%
end

if mon1==1
t13=[ year1-1,12,1; year1-1,12,15]; % 11%
t14=[ year1-1,12,16; year1-1,12,31]; % 16%
else
t13=[ year1,mon1-1,1; year1,mon1-1,15];
temp=find(yuemo==mon1-1);
t14=[ year1,mon1-1,16; year1,mon1-1,yuemo(temp,2)];% 注意月末数据的选择
end
t15=[ year1,mon1,1; year1,mon1,10]; % 21%
t16=[ year1,mon1,11; year1,mon1,15]; % 31%

%%%% date2结构
if mon2<=2
t21=[ year2-1,mon2,16; year2-1,12+mon2-2,15];% 从品种上市之日起开始计时段,到交割月前第二个月的第十个交易日,5%(7%+1%)
else
t21=[ year2-1,mon2,16; year2,mon2-2,15];% 注意月末数据的选择
end

if mon2<=2
temp=find(yuemo==12+mon2-2);
t22=[ year2-1,12+mon2-2,16; year2-1,12+mon2-2,yuemo(temp,2)];
else
temp=find(yuemo==mon2-2);
t22=[ year2,mon2-2,16; year2,mon2-2,yuemo(temp,2)];% 注意月末数据的选择,8%
end

if mon2==1
t23=[ year2-1,12,1; year2-1,12,15]; % 11%
t24=[ year2-1,12,16; year2-1,12,31]; % 16%
else
t23=[ year2,mon2-1,1; year2,mon2-1,15];
temp=find(yuemo==mon2-1);
t24=[ year2,mon2-1,16; year2,mon2-1,yuemo(temp,2)];% 注意月末数据的选择
end
t25=[ year2,mon2,1; year2,mon2,10]; % 21%
t26=[ year2,mon2,11; year2,mon2,15]; % 31%

%%%%%%%%%% 合并转换时间格式
date1_ymd={t11;t12;t13;t14;t15;t16}; % 年月日cell合集
date2_ymd={t21;t22;t23;t24;t25;t26};
for i=1:6
date1_mat(i,1)=datenum(date1_ymd{i,1}(1,1),date1_ymd{i,1}(1,2),date1_ymd{i,1}(1,3)); % 起始
date1_mat(i,2)=datenum(date1_ymd{i,1}(2,1),date1_ymd{i,1}(2,2),date1_ymd{i,1}(2,3)); % 段止
date2_mat(i,1)=datenum(date2_ymd{i,1}(1,1),date2_ymd{i,1}(1,2),date2_ymd{i,1}(1,3)); % 起始
date2_mat(i,2)=datenum(date2_ymd{i,1}(2,1),date2_ymd{i,1}(2,2),date2_ymd{i,1}(2,3)); % 段止
end

%%%%% error check
if date1_mat(6,2)>= date2_mat(6,2)
disp('error,现在是正向套利,请排好合约对象位置,近1前 远2后')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
end

if date1_mat(6,2)disp('sorry, 你输入的近期合约1已经退市')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
end

%%%% 其他可以实际交易计算的时段
% 找到今天在时段中所处的位置。
ind1=find(date1_mat(:,1)>day0_mat,1,'first');
ind2=find(date2_mat(:,1)>day0_mat,1,'first');

%%%%% 保证金结构
marginterm1=[0.09;0.09;0.11;0.16;0.21;0.31;1];
marginterm2=[0.09;0.09;0.11;0.16;0.21;0.31];


if isempty(ind1)
disp('现在品种1处于第六阶段')
fprintf(1,['现在品种1保证金率为==: ' num2str(marginterm1(6)) '\n\n']);
% 开始修改计算费用的周期
timelength1=date1_mat(:,2)-date1_mat(:,1)+1; % 别忘了加1
timelength1(1:5,1)=0;
timelength1(6,1)=date1_mat(6,2)-day0_mat+1;
timelength1(7,1)=date2_mat(6,2)-date1_mat(6,2)+1; % 100%保证金,现货持有,直至品种2到期
else
fprintf(1,['现在品种1所处的阶段为==: ' num2str(ind1-1) '\n\n']);
fprintf(1,['现在品种1保证金率为==: ' num2str(marginterm1(ind1-1)) '\n\n']);
% 开始修改计算费用的周期
timelength1=date1_mat(:,2)-date1_mat(:,1)+1; % 别忘了加1
if ind1-2==0
timelength1(1,1)=date1_mat(1,2)-day0_mat+1;
else
timelength1(1:ind1-2,1)=0;
timelength1(ind1-1,1)=date1_mat(ind1-1,2)-day0_mat+1;
end
timelength1(7,1)=date2_mat(6,2)-date1_mat(6,2)+1; % 100%保证金,现货持有
end

if isempty(ind2)
disp('现在品种2处于第六阶段')
fprintf(1,['现在品种2保证金率为==: ' num2str(marginterm2(6)) '\n\n']);
% 开始修改计算费用的周期
timelength2=date2_mat(:,2)-date2_mat(:,1)+1; % 别忘了加1
timelength2(1:5,1)=0;
timelength2(6,1)=date2_mat(6,2)-day0_mat+1;
else
fprintf(1,['现在品种2所处的阶段为==: ' num2str(ind2-1) '\n\n']);
fprintf(1,['现在品种2保证金率为==: ' num2str(marginterm2(ind2-1)) '\n\n']);
% 开始修改计算费用的周期
timelength2=date2_mat(:,2)-date2_mat(:,1)+1; % 别忘了加1
if ind2-2==0
timelength2(1,1)=date2_mat(1,2)-day0_mat+1;
else
timelength2(1:ind2-2,1)=0;
timelength2(ind2-1,1)=date2_mat(ind2-1,2)-day0_mat+1;
end
end
%%%%%% 计算费用

fixcost=guohufei+fenjianfei+shouxufei+spread*zhengzhisuilv;
cangculength=timelength1(7,1);
cangcucost=cangcucostlv*cangculength; % 仓储费

pinjunjia1=(p1*marginterm1)'*timelength1/sum(timelength1); % 平均价
rentcost1=(p1*marginterm1)'*timelength1*rent/360; % 借款利息
pinjunjia2=(p2*marginterm2)'*timelength2/sum(timelength2);
rentcost2=(p2*marginterm2)'*timelength2*rent/360;
rentcost=rentcost1+rentcost2;

totalcost=fixcost+cangcucost+rentcost; % 总成本
netreturn=(spread-totalcost)/(pinjunjia1+pinjunjia2)*360/(date2_mat(6,2)-day0_mat+1); % 年化收益

fprintf(1,['今天价差为==: ' num2str(spread) '\n\n']);
fprintf(1,['仓储费为==: ' num2str(cangcucost) '\n\n']);
fprintf(1,['租金成本为==: ' num2str(rentcost) '\n\n']);

fprintf(1,['预算总成本为==: ' num2str(totalcost) '\n\n']);
fprintf(1,['预算年化收益为==: ' num2str(netreturn) '\n\n']);
disp('*******************************************************************')
disp('*******************************************************************')
end

部分程序粘贴完毕/

提示:以上程序基于matlab 7.0a
市面上店铺都有卖。
为了获得有价值的东西,还是需要付出一些学习代价的。http://www.fiu.edu/~daiglerr/pdf/intraday_SIF_arbitrage.pdf

一点补充,可以阅读一下,作为理解本文的理论基础。程序化交易(2)——期现套利在前一篇文章中,我简要介绍了正向跨期套利,本篇跟大家聊聊期现套利。

期现套利,顾名思义,就是买便宜现货,空贵的期货,这里就涉及到你说要交的现货品种是不是能够交的上仓单这个残酷的问题,所以在程序中,我们会根据你所输入的品种的不同特性,给出风险提示!

程序的另一个功能是,预算你本次期现套利你可能获得的收益以及要承担的资金风险。

总体而言,期现套利是交易系统中,相对简单的程序,说要注意的就是仓单注册风险。

如果你是想进行套保,我会在以后的程序介绍中,给你介绍几种常见的套保方式,如最为简单的LS方法,协整方法,MS_GARCH等等,并针对不同的模型,提示你风险管理方法!好了,这些都是后话,下面进入主题:
function [spread,totalcost,netreturn]=casharbitrage(date1,date2,today,p1,p2,pinzhong)
% author: jemnbo@hotmail.com
% 商品跨期套利成本计算
% date1: 商品1日期代码,现货,我们用906作为品名
% date2: 商品2日期代码,如cu0909, 我们只取909
% today: 今天日期
% 品种: 1 铜(对线材和螺纹钢同样适用), 2 铝 ,3 锌
% p1 ,p2 为品种期货最新价格
year0=fix(today/10000); % 年
if mod(year0,4)==0
floatday=29;
else
floatday=28;
end
yuemo=[1,31;2,floatday;3,31;4,30;5,31;6,30;7,31;8,31;9,30;10,31;11,30;12,31];% 月末日期
spread=p2-p1;% 价差
switch pinzhong
case 1
disp('你选择的对象为铜期现套利')
fprintf(1,['\n 铜期现套利——现货,' num2str(date2) '\n\n'])
if spread<=0
disp('现在价差还离套利区间较远,耐心等待')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
else
% 铜

%%%%%%%% 固定费率
guohufei=6*2; % 过户费(两次)
fenjianfei=5; % 分检费(1次)
jinkufei=24; % 进库费
dabaofei=20; % 打包费
shouxufei=(p1+p1)*0.00022; % 手续费(一次)
zhengzhisuilv=0.17; % 增值税率
cangcufeilv=0.4; % 仓储费率(天)
spread=p2-p1;% 价差
rent=0.0536; % 一年贷款利率

%%%%%
year1=2000+fix(date1/100); % 年
mon1=date1-fix(date1/100)*100;% 月
year2=2000+fix(date2/100); % 年
mon2=date2-fix(date2/100)*100;% 月
year0=fix(today/10000); % 年
mon0=fix((today-fix(today/10000)*10000)/100);% 月
day0=today-year0*10000-mon0*100; %日%%%%% 今天的matlab时间
day0_mat=datenum(year0,mon0,day0); % 今日对应的matlab时间

% 时间结构~ 铜为六个层次 ,因为各个阶段的保证金比率各不相同。
%%%%%%%% date1结构
if year2>=year0 && mon2>=mon0+12
disp('error,你研究的品种还没有上市')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return;
end

%%%% date2结构
if mon2==2
t21=[ year2-1,mon2,16; year2-1,12,15];% 从品种上市之日起开始计时段,到交割月前第二个月的第十个交易日,5%(7%+1%)
else
t21=[ year2-1,mon2,16; year2,mon2-2,15];% 注意月末数据的选择
end

if mon2<=2
t22=[ year2-1,12,16; year2-1,12,31];
else
temp=find(yuemo==mon2-2);
t22=[ year2,mon2-2,16; year2,mon2-2,yuemo(temp,2)];% 注意月末数据的选择,8%
end

if mon2==1
t23=[ year2-1,12,1; year2-1,12,15]; % 11%
t24=[ year2-1,12,16; year2-1,12,31]; % 16%
else
t23=[ year2,mon2-1,1; year2,mon2-1,15];
temp=find(yuemo==mon2-1);
t24=[ year2,mon2-1,16; year2,mon2-1,yuemo(temp,2)];% 注意月末数据的选择
end
t25=[ year2,mon2,1; year2,mon2,10]; % 21%
t26=[ year2,mon2,11; year2,mon2,15]; % 31%

%%%%%%%%%% 合并转换时间格式
date2_ymd={t21;t22;t23;t24;t25;t26};
for i=1:6
date2_mat(i,1)=datenum(date2_ymd{i,1}(1,1),date2_ymd{i,1}(1,2),date2_ymd{i,1}(1,3)); % 起始
date2_mat(i,2)=datenum(date2_ymd{i,1}(2,1),date2_ymd{i,1}(2,2),date2_ymd{i,1}(2,3)); % 段止
end

%%%%% error check
if day0_mat>= date2_mat(6,2)
disp('error,现在是正向套利,请排好合约对象位置,近1前 远2后')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
end

if date2_mat(6,2)disp('sorry, 你输入的近期合约1已经退市')
spread=spread;totalcost=NaN;netreturn=NaN;
disp('*******************************************************************')
disp('*******************************************************************')
return
end %%%% 其他可以实际交易计算的时段
% 找到今天在时段中所处的位置。
ind2=find(date2_mat(:,1)>day0_mat,1,'first');

%%%%% 保证金结构
marginterm1=[1];
marginterm2=[0.08;0.08;0.11;0.16;0.21;0.31];

disp('现在品种1处于库存状态')
timelength1(1,1)=date2_mat(6,2)-day0_mat+1; % 100%保证金,现货持有,直至品种2到期

if isempty(ind2)
disp('现在品种2处于第六阶段')
fprintf(1,['现在品种2保证金率为==: ' num2str(marginterm2(6)) '\n\n']);
% 开始修改计算费用的周期
timelength2=date2_mat(:,2)-date2_mat(:,1)+1; % 别忘了加1
timelength2(1:5,1)=0;
timelength2(6,1)=date2_mat(6,2)-day0_mat+1;
else
fprintf(1,['现在品种2所处的阶段为==: ' num2str(ind2-1) '\n\n']);
fprintf(1,['现在品种2保证金率为==: ' num2str(marginterm2(ind2-1)) '\n\n']);
% 开始修改计算费用的周期
timelength2=date2_mat(:,2)-date2_mat(:,1)+1; % 别忘了加1
if ind2-2==0
timelength2(1,1)=date2_mat(1,2)-day0_mat+1;
else
timelength2(1:ind2-2,1)=0;
timelength2(ind2-1,1)=date2_mat(ind2-1,2)-day0_mat+1;
end
end

%%%%%% 计算费用
%{
guohufei=6*2; %过户费(两次)
fenjianfei=5; % 分检费(1次)
jinkufei=24; % 进库费
dabaofei=20; % 打包费
shouxufei=6*2; % 手续费(一次)
zhengzhisuilv=0.17; % 增值税率
cangcufeilv=0.4; % 仓储费率(天)
spread=p2-p1;% 价差
rent=0.0536; % 一年贷款利率
%}
fixcost=guohufei+fenjianfei+shouxufei+spread*zhengzhisuilv+jinkufei+dabaofei;
cangculength=timelength1(1,1);
cangcucost=cangcufeilv*cangculength; % 仓储费

pinjunjia1=(p1*marginterm1)'*timelength1/sum(timelength1); % 平均价
rentcost1=(p1*marginterm1)'*timelength1*rent/360; % 借款利息
pinjunjia2=(p2*marginterm2)'*timelength2/sum(timelength2);
rentcost2=(p2*marginterm2)'*timelength2*rent/360;
rentcost=rentcost1+rentcost2;

totalcost=fixcost+cangcucost+rentcost; % 总成本
netreturn=(spread-totalcost)/(pinjunjia1+pinjunjia2)*360/(date2_mat(6,2)-day0_mat+1); % 年化收益

fprintf(1,['今天价差为==: ' num2str(spread) '\n\n']);
fprintf(1,['预算总成本为==: ' num2str(totalcost) '\n\n']);
fprintf(1,['预算年化收益为==: ' num2str(netreturn) '\n\n']);
disp('*******************************************************************')
disp('*******************************************************************')
end以上程序是针对上海的铜的期现套利。

值得说明的是, 现在很多网站给出了现货市场报价,你必须要了解到,这个价格是有时间性和平均性的!!

一笔真正成功的期现交易,你必须要真正的去了解现货,否则,风险不堪设想!!

例如, 你做螺纹钢的期现套利,你空了912的,现货上买的是8月产的,你觉得你能交的进去吗?ESSAYS ON THEORETICAL AND EMPIRICAL STUDIES OF COMMODITY FUTURES MARKETS

DISSERTATION
Presented in Partial Fulfillment of the Requirements for
the Degree Doctor of Philosophy in the
Graduate School of the Ohio State University
By
Haijiang Zhou, B.A. Agricultural Economics, M.A. Economics
*****
The Ohio State University
2005

博士论文的第二部分 让大家理解一下 本策略程序的理论基础程序化交易(3)——跨市场套利在前两篇文章中,我跟大家简要介绍了程序化交易给你分析工作上带来的一些便捷和分析上的直观性,很显然,我在这里肯定还是不断的和大家交流和探讨程序化交易上的一些不足,但是,现在还不是讨论不足的时候,不能一下子追求完美,微软也不是一下子就推出vista平台的,不是吗?

好了,废话少说, 这一篇我和大家交流一下跨市场套利。

跨市场套利对于国内还是非常热的,特别是做大豆和铜的朋友,中国的行情几乎就是外盘的跟屁虫,看看我们的k线,好多缺口啊,如果哪位大侠想用技术分析(特别是缺口理论),估计是亏的他妈妈都不认识他了,当然,技术分析也不是一无是处,MACD就是一个不错的指标,不过这里我还暂时不想套利技术指标,我会在以后的文章中和大家系统的分析技术指标的含义和优缺点,当然包括我自己编写的一些技术指标。现在还只是买个关子,希望大家能有耐心跟踪下去。

刚才有点扯的远了,还是收回来,做金属的朋友可能都知道, 今年跨市场套利的窗口开了很大,很久,如果你在开口的瞬间就进去了,可能你要转好几次仓,亏好多,我认识的一些现货商不可谓不财大气粗,但是,每吨亏个3000多,也不是那么好受,是不?至于江西铜业,是不是也犯了同样的错误,就不得而知了,人家财报上不告诉你,只是说我错了!

好了,既然跨市场套利这么重要,我们就把它拎出来,分析一下。
跨市场套利无非就是你交易的品种面临的一些门槛,如关税,增值税,仓储费,交易费,验货费,等等,最为重要的是你品种能不能交割。今年上海这边已经更改了外籍交易品种注册条件!!!风险也不是一般的大!!!切切!function [output]=crossmarketarbitrage_SHFELME(p1,p2,bc,ex,pinzhong)
% 跨市场套利(上海和LME市场)
% p1: LME三月价格
% P2: 上海价格(包含的信息和外盘研究的对象一一对应。如:研究上海市场的现货,则对应的也是lme的现货。上海的远期3月,对应的也是lme的三月)
% bc: 升贴水(以lme3月远期为基准)
% ex: 远期汇率

% pinzhong: 品种 1 铜 2 铝 3 锌
% 进口成本=(LME三月+对应月份升贴水+进口升贴水)*(1+增值税率)*汇率+杂费
if size(ex,1)~=size(bc,1) || size(bc,1)~=size(p2,1)
disp('error,升贴水结构和远期汇率结构不一致,或者和上海价格结构不一致。')
return
end

switch pinzhong
%% 铜
case 1
maoyibc=115; % 贸易升贴水(美元)
zhengzhisui=0.17; % 增值税
guansui=0;% 关税(美元)
zafei=100; % 杂费(人民币元)

for i=1:size(ex,1)
importcost(i,1)=(p1+bc(i,1)+maoyibc)*(1+zhengzhisui)*ex(i,1)*(1+guansui)+zafei;% 进口成本
importpl(i,1)=p2(i,1)-importcost(i,1);% 进口盈亏
ratio(i,1)=p2(i,1)/(p1+bc(i,1)); % 实际比值
balanceratio(i,1)=importcost(i,1)/(p1+bc(i,1)); % 进口均衡比值
end
yuefen=(0:size(ex,1)-1)'; % 月份
p_LME=p1+bc;

output=[yuefen,p_LME,bc,ex,importcost,p2,importpl,ratio,balanceratio]; % 合约月份,LME价格,升贴水,远期汇率,进口成本,沪铜价格,进口盈亏,实际比值,进口均衡比值

是不是比较简单呢?

这是我们计算套利空间的第一步,即使出现了套利空间,也要知道未来走势是不是还在上面停留很久!!
下面我们不妨给出一个例子 http://dyqh.info/ddimg/uploadimg/200908/083800139.jpg

这是大越期货给出的计算表,不够鲜明,不知道历史表现如何/

而迈科期货,大名鼎鼎了,那老板迈巴赫开的,就是有气势,你还不能嫉妒,拿砖头砸,你要知道,能买得起迈巴赫,就不在乎雇佣几个保镖!

http://www.maikefutures.com/chartsbook.asp?classid=57&bookid=893&name=SHFE/LME 铜比价

好了,图片贴好了,不知道能不能看到,看不到就到各个期货公司网站上看吧。

我要说的问题就是,知道肥肉在嘴边,也不是随便能吃的,要知道什么时候肉好吃还不烫嘴才最重要,即如何判断入场点!!

这个问题在以后的标题中陆续给出答案。程序化交易(4)——实战价差套利(A)不要告诉我,你从来不关注价差!
更不要告诉我,你不知道什么叫价差。

如果你是一个新手,请先拿价差练练手

如果你是一个认为市场是有效的理论工作者,请拿价差赚钱

如果你是一个对冲基金,更应该关注一下价差套利,索罗斯也不是一篮子全部卖空或者做多,他也需要套头交易!

那么,价差套利就是我们本帖想要讨论的主题。

价差套利大致可以分为以下几种:
1)基本面价差套利,例如大豆收储,近期合约可能就被压的很紧,而远期则富有弹性,如何下手?

2)计量模型方法:如协整套利,标准差套利等等

3)技术分析方法:不是不可以,李宁不也说了吗,一切皆有可能!不过,技术分析想要用好,还是首先分析数据特征,不然,指标钝化等毛病会要了你的命!!

本篇,简要介绍一个铜价差套利方法,如果你有条件,实在是应该做一个套利交易系统,因为这个玩意实在是太好赚钱了!我说这话,肯定是有现实交易依据的。和铜有相同特征的还有燃料油,铝,锌,还有最新品种螺纹钢。

你还不相信,算了,你可以翻过这一页了。

价差可见也是一个复杂的玩意,毕竟你随便拿两个来一差,就要套利,也不是我一篇文章能够给你讲清楚的,所以,这只能为‘A’,后面还会有B,C,D,,, 金属期限结构是国内交易品种中最为稳定的品种。本策略报告试图在数量化分析统计中,寻找出价差走势规律,建立投资策略。
策略分为4个部分:
品种独立性质分析
品种相关性分析
价差性质分析
策略构建和策略表现。
首先,进行品种个体性质分析:(以铜906-907为例2009-03-16~2009-04-29)
5分钟频率数据分析:
铜906
mu =0.0133
Sigma=0.3981
Skewness=1.9484
Kurtosis=45.4295

铜907
Mu=0.0128
Sigma=0.397
Skewness=0.9597
Kurtosis=33.9207
很显然,尖峰厚尾性质非常明显, 另一方面,由于我们选择的数据时段中,907为主力,体现出的特性是数据峰度相对较低,偏度较小,意味着907交易更为平滑,且价格区间滑动相对平滑,而非主力品种成交跳跃相对较大,从而尽管均值几乎相等,但是体现出的波动性和偏度都会相对较大,而由于交易的弱性,峰度较高。从交易术语讲,由于交易不活跃,则需要在尽短的时间内,大步跳跃实现与主力品种价差之间的收敛。
而且,品种还显示出波动束特征,即大波动的后续行情跟随的依然是波动较大的行情。

一阶负相关是显著的,即均值回复性非常的明显。
验证的方法的一个直观的想法就是建立趋势策略,不管如何优化,都应该没有利润可赚。风险度量如下

既然均值回复性这么明显,我们就做最简单的策略。

Cu906907 十分钟数据:
策略1:
参数: M个K线。
开仓阈值:OC
平仓阈值:CC
止损阈值:SC
策略:
做空:最新价>M周期最高价HHV + OC
做多:最新价做空平仓:最新价做多平仓:最新价>M周期最高价HHV — SC
或者止损,如果触碰止损,以当周期收盘价平仓。
注意:当期内的开仓,不在当期内平仓。
首先观察一下策略开仓机会和平仓盈利空间分布:
很显然,相邻最高价之间的差值、以及最低价之间的差值在0附近形成峰值,几乎对称,那么我们设定OC为30,CC为30是相对合理的,由于这是最新价,按照最坏的打算,盘口价差与最新价差之间的差值为30的话,我们策略依然是能够执行的(实际上,设定为20已经足够)。

净利润:77955元~73365
平均每次操作净利润:318元
操作次数:237~221
成功率:~83%
最大利润回吐:-590
相比数据总长度才为686,操作了237次,资金利用率不可谓不高。

那么,5分钟的数据与10分钟的数据频率会不会相差甚远呢?
首先看看5分钟数据长得啥样。
很显然,看不出有什么大的差别,所以,我们所有的参数都不变,测试一下刚才的策略,会不会有较大的提高。
净利润:103800元~110660 元,收益提高了近50%
平均每次操作净利润:295元左右,相比10分钟少了15元左右,大概1~2个tick
操作次数:340~350 ,操作次数大概也提高了50%,从平均利润分析很自然得到这样的结论。
成功率:~89% ,成功率有所提高,这可能归功于5分钟数据的操作次数更多,可能同等的奇异点个数情况下,成果率提高就很自然了。
最大利润回吐:—1140~ —1230,绝对利润回吐数字有所放大,但占比总盈利并没有显著提高。
相比数据总长度才为1372,操作了340次,资金利用率还是相当高的。

我们何不再更深入的问一下,更为高频的数据是不是也会和5分钟数据那样,对收益大为改善呢?我也对此结果抱着极大的期待,那就看看吧。
2分钟频率数据:
收益又上新台阶!!
已经到了150000数量级别啦。在M=1/2/3依然鱼和熊掌兼得,真有这等好事吗?有点不敢相信。
M=1的操作结果:

净利润:130000元~159000 元,收益在5分钟的基础上又提高了近30%~40%,相比原10分钟的结果,已经翻番了。

平均每次操作净利润:295~235元左右,相比5分钟少了0~60元左右,大概3个tick左右,相差较大,主要方面我认为是由于2分钟数据的波幅还是相对压缩了不少。2分钟的高低波幅均值为73,而5分钟的为96,相差2个tick。

操作次数:400~600 ,操作次数又有提高了,从平均利润分析很自然得到这样的结论。

成功率:89%~93% ,成功率有所提高,这可能归功于2分钟数据的操作次数更多,可能同等的奇异点个数情况下,成果率提高就很自然了。
最大利润回吐:—570~ —1425,最大绝对利润回吐数字有所放大,但占比总盈利并没有显著提高,依然控制在1%以内。
相比数据总长度才为3390,操作了400~600次,资金利用率并没有显著降低。

金属其他品种的测试也已经完成,总体而言,铜的平均成功率最低。请见下表:
AL 906907:2009-04-01~2009-04-27
参数:OC=15 ;CC=15 ;SC=20; M=1
简单策略收益情况:(操作及数据分析不再图示)
10分钟:
净利润:11690 元
平均每次操作净利润:141.437元
操作次数:80
成功率:~97.5%
最大利润回吐:-112 元
数据长度:396

5分钟:
净利润:13489 元
平均每次操作净利润:127.56元
操作次数:103
成功率:~97.08%
最大利润回吐:-112 元
数据长度:792

2分钟:
净利润:15853 元
平均每次操作净利润:101.141元
操作次数:156
成功率:~99.359%
最大利润回吐:-112 元
数据长度:1962 很郁闷,不能贴入分析过程中的一些图形。

不过简要的思想还是说清楚了,大家可以拿出行情分析软件,对照我上面的方法,看看,是不是价差非常的稳定呢?

例如,铜的价差如果超过了200,眼睛一闭,空!低于-200,多!

有这样的操作空间,一年下来,理论上利润也会翻一翻!

其关键就在于你如果手动下单,记得要首先下波动性大的那一边,个人经验而已。不然单子飘着,很难受的!!

总体而言,这类品种价差特性,符合均值回复的特性,你随便做都可以赚钱的,重点是看好你的下单速度和成交速度,以及盘口价差,这会吃掉你一些利润的。

成功率,90%以上,还不高吗?

最大亏损?自己看吧。唉,热心的我也需要些鼓励,如果这样下去 ,我也没有交流的热情了。

看贴好歹也回一下啊。

预告一下,下一篇,我们讲一讲如何进行配对交易,配对交易有哪些方法和模型,以及优缺点。

由于价差交易相对较为复杂,毕竟涉及到两个品种,所以,这个系列的文章可能会较为冗长,有兴趣的可联系我,这里不再贴出程序,估计大家对于程序并不感冒,如果想要,可以联系我。

不看广告,看疗效!
速食主义者,想要有大进步,难! 补充一张直观的图片程序化交易(5)——技术分析MACD市场通用的MACD(Moving Average Convergence / Divergence,俗称快慢机)是1960年代Gerald Appel发明的(喜欢数学的朋友见链接出处),后来由Thomas Aspray在1986年加以提高的.这个方法在80年代,随着个人PC机的广泛使用,取得了非常大的成功,几乎人人都学而且百战百胜.

后来90年代由胜龙软件中携带在中国推广,深入民心.真正在中国如此广泛地推广数学知识的,让数学走下神坛成为工具的是股市.股民就是中国应用数学最好的人群.连我妈60岁的人,谈起MACD那是个口若悬河,天女散花,地涌金莲.

可是,MACD失效也是必然的:

其一,Gerald Appel选用构造快慢机的时期为12天和26天,而信号线的时期为9天.这都是用美国的数据试验的结果, 其实,这个时期在中国以及80年代以后的美国都不适用了.在中国我知道的是用30,60,15 来做比较有效,这也是金融试验室里的结果. 所以,刘ZY和ECONOMICS LETTER上那篇文章都说持有期不能超过三个月, 转势四个月才可以判定,都是有道理的.

其二,个人PC机和互联网的广泛使用,懂技术指标的人越来越多,每个个人都受技术指标的影响成为内生变量,技术指标就失效了(不显著了).

其三,MACD的前提是短期变化和长期变化最终重合(MACD是静态的随机漫步,STATIONARY)。这已经跟不上形势了,在2005-2007的上涨中,以及2007-2009的下跌中,所有的指标都是钝化加钝化,根本无法给你提供一个操作的建议。老技术派在这次大的浪潮中,几乎都死在海滩上了。

这就要求我们更新我们的经济学,统计学,金融学和数学的知识。

还用上世纪美国6070年代的方法来2010年的大中国来淘金,那是自己在找死,被市场洗得干净是应该的。

好,以上用MACD讲了一下技术指标的适用性,同样的讨论可以用在结构破裂上。

我要说明的是,结构破裂这个方法需要积累最少三个月的数据,才能判断大级别的结构破裂。

有些人认为这是个缺点,我个人认为这正是这个方法的优点。其实,从1996年股市正式成为国家级的调控工具后,很多股民就跟不上趟了。为什么这么说?原因就是,散户在金融信号下进退失据,频繁交易,人人争先,个个血勇,都以为可以凭借技术和力量以快打慢。导致2007年股市的印花税和佣金比上市公司的全部利润还高。中国股市彻底成为赌场。

但是,实际上中国文化的最高境界就是顺其自然,后发制人。

在我看来,这十几年的股市可以称为机会的无非是1999的多头, 2001年的空头,2005年的多头,2007年的空头,以及现在的多头。这中间的变化,根本不是三个月完成的。

如果,可以用三个月时间判断清楚未来两三年的趋势,牺牲这点微薄的利润来换取安全和长期的暴利,是值得的。比如说,2007年10-11月出现的结构性破裂,我们却是在2008年1-2月才用数据确认的。当时是5500点左右,全线抛空后跟着趋势线一直到年末1660-2000点才开始回补10元以下的中石油。

技术不可能告诉你2007年11月开会就是结构破裂,但是它会在2008年2月告诉你,2005年底开始的趋势完蛋了。

这时候,一切都还来得及,市场总会给准备好的人们一线生机。

狼群会让头羊带着他的信徒逃走。

注:本文借用我一位河友的笔记,我觉得说的非常的精辟,也没有必要另起炉灶写上一通了。
注释一下macd的公式含义:长短快慢线的差值,表示最近加速度是不是有所提升,再做一次差分,表示提升的速度是放慢还是加快。是不是很有点物理学含义?

期货公司中,对于MACD的研究很多,如东证期货的网页上提供的机械信号,就是这个改进版,效果? 谁用谁知道function [DIFF,DEA,MACD]=macd(data,s,l,m)
% author:jemnbo@hotmail.com
%{
Moving Average Convergence/Divergence (MACD).
note:data must be coloum
data = coloum vector
s = short exp moving average period
l = long exp moving average period
m = dif exp moving average period
% The MACD is calculated by subtracting the 26-period (7.5%) exponential
% moving average from the 12-period (15%) moving average. The 9-period
% (20%) exponential moving average of the MACD line is used as the
% "signal" line. For example, when the MACD and the 20% moving average
% line has just crossed and the MACD line becomes below the other line,
% it is time to sell.
%
% it will be assumed that the data is column-oriented (i.e. each
% column is a set of observations).
%}

% prepare
% if nargin is less, set as default
if nargin<4
s=12;
l=26;
m=9;
end

[vi,vj] = size(data);
if vi == 1
error(' inputed data must be coloum')

end
% Pre allocate vars

emal = moveaverage(data,l,3);
emas = moveaverage(data,s,3);

% Calculate the MACD line.
DIFF = emas - emal;

% Calculate the 9-period (20%) exp mov avg of the MACD line.
DEA = moveaverage(DIFF,m,0);
MACD=2*(DIFF-DEA); 程序化交易(5)——技术分析—均线交易数理经济学理论解释估计没有几个不看均线的,所谓的均线突破,均线支撑等等技术分析方法,做期货的不学习这些,估计会被拎出去活络一下的

Why Technical Trading Works
-A Simple Illustration



Notwithstanding its widespread use and well documented profitability, technical
analysis is still not accepted by the academia. This may be due to the fact that the
causes of this profitability are not yet well understood. This paper suggests a
rational for the application of technical trading rules. It is assumed that some of
the asset price fundamentals are observable only with a considerable lag or not
observable at all. Within this realistic informational environment a moving
average trading rule is able to detect possible regime shifts in the process of
currently unobservable fundamentals. Moving average trading rules can be
interpreted as a cheap proxy for Bayesian learning and complementary to the
standard forward looking approach of asset price expectations.


文章参考:SSRN-id3000079
注意我划线的地方,为稳态因子情况下的开仓条件,一般而言,长周期的长度不要超过短周期长度的两倍。 最后还得强调一下,这篇文章中也强调了均线系统上述条件判断的条件是有局限性的,如果有trend等情况,还需要进行调整的,不然风险可大了/

回想起我在系列(9)——因子分析方法中,给出了一个最优化的交易参数,也还是基于均线系统的,我选择的参数为(2,4)

好险!!差点违背了这个法则。程序化交易(6)——经济学是科学吗?经济学是科学吗?

很多人打破脑袋想弄明白经济学中那里理论是不是有用(所谓有用就是你能不能解释经济现象,预测未来),对于市场有效性的争论也太多了,眼睛比起来都能数出若干理论,争执不下。

但是,很显然我们大部分人是不相信市场是有效的,不然,你干吗还看这帖子,还提心吊胆的冲冲杀杀?

关于市场有效性的文献,我就不在这里推荐了,我所要说的是,我们现在有什么好的模型,能基本预测一下未来市场走势(仅限于宏观层次,你叫我告诉你明天买什么股,还不如拿块板砖给我)

看看以下几张图:
第一种方法:政治和经济周期(引用于河友虎大)

说明一下,
沪深300指数(蓝):3006 (当前点位)
上升轨道上轨(红):3006(重回轨道的标志)
5年政治周期线(紫):3541(基本上就是本轮高点了)
10年长经济周期线(黑):2498 (我希望能见到的进货点)

第二种方法,混沌力学
July 10, 2009:Chinese Equity Bubble Prediction

Our analysis of this main Chinese equity index shows clear signatures of a bubble build up and we go on to predict its most likely crash date: July 17-27, 2009



第三种方法:状态域划分法:
其原理就是把市场分成上升市场还是下降市场,各种概率到底有多大
当然了,还有若干券商会发表金融工程研究报告,如海通证券会发布行业涨跌预测报告,其思想就是基于我们上面的第三种方法。联合证券会发布择时交易系统,还有国信证券的6周涨跌判断法(高于六周前的就买,低了就卖)等等。

这些研究的基础也不外于利用数量化模型,或者数据挖掘方式,通过提前历史的表现,而寄希望未来能够重演。

世界会变!

有时间跟大家聊聊基本面分析,及一些基本面选股方法(当然,还是基于数量化模型)看看对冲基金在应用套利方法的表现吧,是不是真的有超人的业绩补充一下,对冲基金表现的具体统计数据程序化交易(7)--滤波交易系统(1)如果承认经济学也是科学,可以用历史的数据寻找规律,那么, 我们总会找到经济数据(我们所看到的)与真实的轨迹(我们所看不到的)之间的必然联系。正如马克思辩证唯物主义的观点:价值是价格的基础,价格总是围绕价值上下波动。那么,我们所看到的就是价格,看不到的就是价值。

在前面一篇文章中,我介绍了如何利用价差进行套利, 其思想也就是在扣除了carry cost 之后,你能不能赚钱,如果你能赚钱, 为什么不这么做呢?那么, 这里的真实价值就是carry cost, 而价差的波动就是围绕这个波动。至于怎么利用偏离定价,我已经在前面写了四篇文章进行了分析和数量化管理。这里,我想另辟一个分析工具,滤波/

滤波一般而言用在信号管理上, 经济学中也有用,但一般也局限于宏观,特别是RBC领域,在金融理论中用的比较少,因为在金融学中, 时间序列的频率相对较高, 更为重要的是, 不满足stationary 条件,即使放开到wavelet 和 trend component情况下,适用性依然不强。

但是, 也不是说,滤波器不能用, 毕竟, 滤波作为一个分析时间序列在震荡区间内的分析手段,还是能给我们的风险承受和判断带来一定的帮助的。

这里, 我首先介绍一些常见的滤波, Kalman滤波我决定单独开篇,因为我有一个比较成熟的Kalman滤波交易系统想和大家分享。

应用滤波器,你的首先对你的研究对象做一个基础性的分析, 例如, 价差,可能满足平稳性,你用那些趋势交易系统,特别是海龟交易系统,可能会死的很惨,而如果你用均值回复系统, 或者用OU process交易系统, 肯能给你带来极大的收获。我们前面一片文章就是基于此。 至于如何分析你研究对象的性质, 这里我就不想多讲了,一般的time series 分析都有介绍/

现在, 我们假设你已经对你的时间序列做了一定的前提分析, 那么现在, 我要讲讲都有哪些滤波器分别适用不同的时间序列。/

1)stationary time series
比较常见的滤波器有Ideal Bandpass Filter
其原理就是,如果你分析的数据列是稳态的, 不存在不对称性和时变性,就可以很好的捕捉出上下摆荡空间。

我们技术分析中常用的一个指标——摆荡指标, 就是基于此,很显然,它的假设条件是不存在趋势的,也不存在不对称性的,更为严格的要求最好是满足正态性?

你想一想,金融数据真的满足这样严格的条件吗?
显然, 尖峰厚尾的特征就判了这个指标的死刑,所以, 所谓的超买超卖还是审慎的相信吧。

2) time trend
如果你的数据有一定的趋向性, 你用HP 滤波较为合适。

很多人知道这个滤波,但是都不知道所以然,hp滤波存在一个致命的缺陷,就是需要未来数据来平滑现在。 如果我都知道未来了, 还要平滑这玩意干什么?吃饱撑的?

预测准确才是我们的真正目地,你倒是学会‘抢答’了,这玩意,宏观经济学家最喜欢用了。

所以, 要宏观经学家干什么嗯? 应该把他们归到地震学家一类,‘养只蛤蟆搞预测’。

『值得说明的是, lambd在hp滤波中的含义是补偿平滑后的趋势损失,在满足cutoff frequency( the responce equal to 0.5)情形下, 等于1600,对应的周期长度为10年左右。』

3)非稳态的序列
这才是大家可能真正关心的, Butterworth filter
一种近似的平方波形滤波器,并可以用来去势。

这种滤波器较为适用于我们的单品种,或者有点趋势的价差,如豆菜油价差等等。程序化交易(8)——市场趋势判断与交易信号在本篇文章中,我要介绍给大家的是,如何预测市场大趋势及其转折,以及明日收盘价预测。

如何进行顺趋势操作,是大家非常关心的,现在很多均线交易策略或者海龟等,都是基于对趋势的预判,而且,每次预测的好坏直接关系到你的操作成功率和盈利能力。

很显然,没有一个系统能够完全学会学习数据,并且能够每一次预测成功,我们 追求的还是一种较为保守的,成功率能够达到一定程度的即可。

本文的交易信号分成四个部分:

1) 根据历史数据,自动分类上涨和下跌趋势,并进行曲线拟合(可选项),从而,可以得到较为稳健的长周期交易策略信号。

2)根据MS-AR方法,即根据markov switch and autoregression 方法构建的判断涨跌转移概率的方法,判断现在市场所处的状态空间。

3)根据Markovian switching方法,集合其他因素,构建的判断涨跌转移概率的方法,判断现在市场所处的位置。

4)根据最近相关性和最近距离方法,测得在历史中与现在行情最相似的若干条路径,回归后,作为预测明日走势的均值。


局部放大,如下图
说明/
在图上部分为铜0912品种的K线图
在图形中,我画出了趋势线(可以是曲线,可选项,判断原理请参考程序)
可以根据趋势进行高抛低吸,值得说明的是,这个结合布林带,可能会更佳。

下图为判断盘面所处的状态,是上涨区间还是下跌空间,结合这个技术,可以进行仓位调整,甚至空仓。

例如,上图表示上涨区间,而下面却给出下跌(绿线)的概率更大,则考虑减仓,趋势未改之前,不要做空!!
如果上图为上涨趋势,下面也为上涨概率大,则可以做一些低吸高抛动作。

千万要记住,不要逆势操作!

图二局部放大如下:
说明:如果上涨下跌趋势趋于判断混乱,此后的市场适合一小段波段操作,高卖低买。即所谓的横盘整理区域。如上涨下跌的概率转移判断均值在0.2附近则属于震荡市。

依然用刚才的说明:还是做做大势,不要反向做!
最后一张图,预测

预测是个难题,能够有50%就不错了,那么,我们何不在识别好的趋势上,把预测的值做一个参考呢/??

如果我预测明天上涨,且预测值都方向一致,大小误差不大,而且现在趋势还是上涨趋势,且概率上涨较大,那么 ,我何不做一把多头呢?或许,这更适合守株待兔者,一击必中。

不过,我目前为止,还是对飞刀交易比较谨慎,也不乐观。

局部放大图形如下:
其中,火柴头为真实的收盘价差
其他两根线为两种收盘价差预测方式,从图形上看,预测效果不是特别理想,也证明了在明显具有波浪形的走势中,想要从线性回归方式得到一步预测,是不明智的,也是行不通的,除非你允许放松周期周期长度。

%tradeguide
% author: jemnbo@gmail.com
%
%%plots the results of tradeguide
%%time series must be column-wise
%%C=Close; O=open;H=High;L=Low
%%stock_name is the stock's title in string form.
function tradeguide(C,O,H,L,V,stock_name)
%%
addpath('m_Files');
%%%%%%%%%%%%%%harikiri%%%%%%%%%%%%%%%%%%%%%%%%%%%
P=mean([C,O,H,L],2);
[buy,sell,tp,changemarker]=tradeidentify(C,O,H,L);
%%%%%%%%%%%%%%%%%%%%%%%%%%%adjust trade command%%
%tp=[tp;tp(end)];%add termination codon to signal end of time series
dtp=[diff(tp)];
ntp=find(abs(dtp)==1);
dtp=[dtp(ntp(1))*-1;dtp(1:end-1);dtp(ntp(end))*-1];
ntp=find(abs(dtp)==1);
%%%%%%%%%%%%%%%find trend lines%%%%%%%%%%%%%%%%%%
cb=1;cs=1;buys=[];sells=[];
for i=1:length(ntp)-1
xt=[ntp(i):ntp(i+1)]';
chx(i)=dtp(ntp(i));
if dtp(ntp(i))==1 %uptrend
[coef]=polyfit(xt,(L(xt)+C(xt))/2,1);
bx{cb}=xt;
buys{cb}=polyval(coef,xt);
cb=cb+1;
else %downtrend
[coef]=polyfit(xt,(H(xt)+C(xt))/2,1);
sx{cs}=xt;
sells{cs}=polyval(coef,xt);
cs=cs+1;
end
end
%%%%%%%%%%%%%%%plot stock%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1)
ax(1)=subplot(211);
cndl(O,H,L,C)
grid on
hold on
这里,还没有将VAR等风控值录入

还有,对各个预测方法的DR模型效率比较也没有录入。

预测的方法太多了,如果大家对这个有兴趣,建议看一两本时间序列的书,推荐的有TSay的时间序列分析,和John Compbell的金融市场中的计量方法等等看看上证综合指数的模型预测情况:更新日期20090905




程序化交易(9)——因子分析法套利交易同样的品种,在上海和LME都能交割,为什么会有不同的价格呢?

在扣除掉汇率/ 手续费 / 关税等等影响, 为什么同样的品种还不能定价一致呢?

这明显不符合购买力平价的概念嘛。

所以, 我们就要利用这种定价的超越,获取我们的无风险利润。

在前面的系列中,我曾经给出了进出口套利的程序化方法,现在,我介绍一下新的方法:

因子分析法


 1.因子分析(Factor Analysis)
  
  因子分析的基本目的就是用少数几个因子去描述许多指标或因素之间的联系,即将相关比较密切的几个变量归在同一类中,每一类变量就成为一个因子(之所以称其为因子,是因为它是不可观测的,即不是具体的变量),以较少的几个因子反映原资料的大部分信息。运用这种研究技术,我们可以方便地找出影响消费者购买、消费以及满意度的主要因素是哪些,以及它们的影响力(权重)运用这种研究技术,我们还可以为市场细分做前期分析。


因子分析法与其他一些多元统计方法的区别:
  2.主成分分析
  主成分分析主要是作为一种探索性的技术,在分析者进行多元数据分析之前,用主成分分析来分析数据,让自己对数据有一个大致的了解是非常重要的。主成分分析一般很少单独使用:a,了解数据。(screening the data),b,和cluster analysis一起使用,c,和判别分析一起使用,比如当变量很多,个案数不多,直接使用判别分析可能无解,这时候可以使用主成份发对变量简化。(reduce dimensionality)d,在多元回归中,主成分分析可以帮助判断是否存在共线性(条件指数),还可以用来处理共线性。
  1、因子分析中是把变量表示成各因子的线性组合,而主成分分析中则是把主成分表示成个变量的线性组合。
  2、主成分分析的重点在于解释个变量的总方差,而因子分析则把重点放在解释各变量之间的协方差。
  3、主成分分析中不需要有假设(assumptions),因子分析则需要一些假设。因子分析的假设包括:各个共同因子之间不相关,特殊因子(specific factor)之间也不相关,共同因子和特殊因子之间也不相关。
  4、主成分分析中,当给定的协方差矩阵或者相关矩阵的特征值是唯一的时候,的主成分一般是独特的;而因子分析中因子不是独特的,可以旋转得到不同的因子。
  5、在因子分析中,因子个数需要分析者指定(spss根据一定的条件自动设定,只要是特征值大于1的因子进入分析),而指定的因子数量不同而结果不同。在主成分分析中,成分的数量是一定的,一般有几个变量就有几个主成分。和主成分分析相比,由于因子分析可以使用旋转技术帮助解释因子,在解释方面更加有优势。大致说来,当需要寻找潜在的因子,并对这些因子进行解释的时候,更加倾向于使用因子分析,并且借助旋转技术帮助更好解释。而如果想把现有的变量变成少数几个新的变量(新的变量几乎带有原来所有变量的信息)来进入后续的分析,则可以使用主成分分析。当然,这中情况也可以使用因子得分做到。所以这中区分不是绝对的。
  总得来说,主成分分析主要是作为一种探索性的技术,在分析者进行多元数据分析之前,用主成分分析来分析数据,让自己对数据有一个大致的了解是非常重要的。主成分分析一般很少单独使用:a,了解数据。(screening the data),b,和cluster analysis一起使用,c,和判别分析一起使用,比如当变量很多,个案数不多,直接使用判别分析可能无解,这时候可以使用主成份发对变量简化。(reduce dimensionality)d,在多元回归中,主成分分析可以帮助判断是否存在共线性(条件指数),还可以用来处理共线性。
  在算法上,主成分分析和因子分析很类似,不过,在因子分析中所采用的协方差矩阵的对角元素不在是变量的方差,而是和变量对应的共同度(变量方差中被各因子所解释的部分)。
  3.聚类分析(Cluster Analysis)
  
  聚类分析是直接比较各事物之间的性质,将性质相近的归为一类,将性质差别较大的归入不同的类的分析技术 。
  在市场研究领域,聚类分析主要应用方面是帮助我们寻找目标消费群体,运用这项研究技术,我们可以划分出产品的细分市场,并且可以描述出各细分市场的人群特征,以便于客户可以有针对性的对目标消费群体施加影响,合理地开展工作。
  4.判别分析(Discriminatory Analysis)
  判别分析(Discriminatory Analysis)的任务是根据已掌握的1批分类明确的样品,建立较好的判别函数,使产生错判的事例最少,进而对给定的1个新样品,判断它来自哪个总体。根据资料的性质,分为定性资料的判别分析和定量资料的判别分析;采用不同的判别准则,又有费歇、贝叶斯、距离等判别方法。
  费歇(FISHER)判别思想是投影,使多维问题简化为一维问题来处理。选择一个适当的投影轴,使所有的样品点都投影到这个轴上得到一个投影值。对这个投影轴的方向的要求是:使每一类内的投影值所形成的类内离差尽可能小,而不同类间的投影值所形成的类间离差尽可能大。贝叶斯(BAYES)判别思想是根据先验概率求出后验概率,并依据后验概率分布作出统计推断。所谓先验概率,就是用概率来描述人们事先对所研究的对象的认识的程度;所谓后验概率,就是根据具体资料、先验概率、特定的判别规则所计算出来的概率。它是对先验概率修正后的结果。
  距离判别思想是根据各样品与各母体之间的距离远近作出判别。即根据资料建立关于各母体的距离判别函数式,将各样品数据逐一代入计算,得出各样品与各母体之间的距离值,判样品属于距离值最小的那个母体。
  5.对应分析(Correspondence Analysis)
  对应分析是一种用来研究变量与变量之间联系紧密程度的研究技术。
  运用这种研究技术,我们可以获取有关消费者对产品品牌定位方面的图形,从而帮助您及时调整营销策略,以便使产品品牌在消费者中能树立起正确的形象。
  这种研究技术还可以用于检验广告或市场推广活动的效果,我们可以通过对比广告播出前或市场推广活动前与广告播出后或市场推广活动后消费者对产品的不同认知图来看出广告或市场推广活动是否成功的向消费者传达了需要传达的信息。
  6.典型相关分析
  典型相关分析是分析两组随机变量间线性密切程度的统计方法,是两变量间线性相关分析的拓广。各组随机变量中既可有定量随机变量,也可有定性随机变量(分析时须F6说明为定性变量)。本法还可以用于分析高维列联表各边际变量的线性关系。
  注意:
  1.严格地说,一个典型相关系数描述的只是一对典型变量之间的相关,而不是两个变量组之间的相关。而各对典型变量之间构成的多维典型相关才共同揭示了两个观测变量组之间的相关形式。
  2.典型相关模型的基本假设和数据要求
  要求两组变量之间为线性关系,即每对典型变量之间为线性关系;
  每个典型变量与本组所有观测变量的关系也是线性关系。如果不是线性关系,可先线性化:如经济水平和收入水平与其他一些社会发展水之间并不是线性关系,可先取对数。即log经济水平,log收入水平。
  3.典型相关模型的基本假设和数据要求
  所有观测变量为定量数据。同时也可将定性数据按照一定形式设为虚拟变量后,再放入典型相关模型中进行分析。
  7.多维尺度分析(Multi-dimension Analysis)
  
  多维尺度分析(Multi-dimension Analysis) 是市场研究的一种有力手段,它可以通过低维空间(通常是二维空间)展示多个研究对象(比如品牌)之间的联系,利用平面距离来反映研究对象之间的相似程度。由于多维尺度分析法通常是基于研究对象之间的相似性(距离)的,只要获得了两个研究对象之间的距离矩阵,我们就可以通过相应统计软件做出他们的相似性知觉图。
  在实际应用中,距离矩阵的获得主要有两种方法:一种是采用直接的相似性评价,先所有评价对象进行两两组合,然后要求被访者所有的这些组合间进行直接相似性评价,这种方法我们称之为直接评价法;另一种为间接评价法,由研究人员根据事先经验,找出影响人们评价研究对象相似性的主要属性,然后对每个研究对象,让被访者对这些属性进行逐一评价,最后将所有属性作为多维空间的坐标,通过距离变换计算对象之间的距离。
  多维尺度分析的主要思路是利用对被访者对研究对象的分组,来反映被访者对研究对象相似性的感知,这种方法具有一定直观合理性。同时该方法实施方便,调查中被访者负担较小,很容易得到理解接受。当然,该方法的不足之处是牺牲了个体距离矩阵,由于每个被访者个体的距离矩阵只包含1与0两种取值,相对较为粗糙,个体距离矩阵的分析显得比较勉强。但这一点是完全可以接受的,因为对大多数研究而言,我们并不需要知道每一个体的空间知觉图。
  多元统计分析是统计学中内容十分丰富、应用范围极为广泛的一个分支。在自然科学和社会科学的许多学科中,研究者都有可能需要分析处理有多个变量的数据的问题。能否从表面上看起来杂乱无章的数据中发现和提炼出规律性的结论,不仅对所研究的专业领域要有很好的训练,而且要掌握必要的统计分析工具。对实际领域中的研究者和高等院校的研究生来说,要学习掌握多元统计分析的各种模型和方法,手头有一本好的、有长久价值的参考书是非常必要的。这样一本书应该满足以下条件:首先,它应该是“浅入深出”的,也就是说,既可供初学者入门,又能使有较深基础的人受益。其次,它应该是既侧重于应用,又兼顾必要的推理论证,使学习者既能学到“如何”做,而且在一定程度上了解“为什么”这样做。最后,它应该是内涵丰富、全面的,不仅要基本包括各种在实际中常用的多元统计分析方法,而且还要对现代统计学的最新思想和进展有所介绍、交代。

因子分析的核心问题有两个:一是如何构造因子变量;二是如何对因子变量进行命名解释。因此,因子分析的基本步骤和解决思路就是围绕这两个核心问题展开的。
  (i)因子分析常常有以下四个基本步骤:
  (1)确认待分析的原变量是否适合作因子分析。
  (2)构造因子变量。
  (3)利用旋转方法使因子变量更具有可解释性。
  (4)计算因子变量得分。
  (ii)因子分析的计算过程:
  (1)将原始数据标准化,以消除变量间在数量级和量纲上的不同。
  (2)求标准化数据的相关矩阵;
  (3)求相关矩阵的特征值和特征向量;
  (4)计算方差贡献率与累积方差贡献率;
  (5)确定因子:
  设F1,F2,…, Fp为p个因子,其中前m个因子包含的数据信息总量(即其累积贡献率)不低于80%时,可取前m个因子来反映原评价指标;
  (6)因子旋转:
  若所得的m个因子无法确定或其实际意义不是很明显,这时需将因子进行旋转以获得较为明显的实际含义。
  (7)用原指标的线性组合来求各因子得分:
  采用回归估计法,Bartlett估计法或Thomson估计法计算因子得分。
  (8)综合得分
  以各因子的方差贡献率为权,由各因子的线性组合得到综合评价指标函数。
  F = (w1F1+w2F2+…+wmFm)/(w1+w2+…+wm )
  此处wi为旋转前或旋转后因子的方差贡献率。
  (9)得分排序:利用综合得分可以得到得分名次。
  在采用多元统计分析技术进行数据处理、建立宏观或微观系统模型时,需要研究以下几个方面的问题:
  · 简化系统结构,探讨系统内核。可采用主成分分析、因子分析、对应分析等方法,在众多因素中找出各个变量最佳的子集合,从子集合所包含的信息描述多变量的系统结果及各个因子对系统的影响。“从树木看森林”,抓住主要矛盾,把握主要矛盾的主要方面,舍弃次要因素,以简化系统的结构,认识系统的内核。
  · 构造预测模型,进行预报控制。在自然和社会科学领域的科研与生产中,探索多变量系统运动的客观规律及其与外部环境的关系,进行预测预报,以实现对系统的最优控制,是应用多元统计分析技术的主要目的。在多元分析中,用于预报控制的模型有两大类。一类是预测预报模型,通常采用多元线性回归或逐步回归分析、判别分析、双重筛选逐步回归分析等建模技术。另一类是描述性模型,通常采用聚类分析的建模技术。
  · 进行数值分类,构造分类模式。在多变量系统的分析中,往往需要将系统性质相似的事物或现象归为一类。以便找出它们之间的联系和内在规律性。过去许多研究多是按单因素进行定性处理,以致处理结果反映不出系统的总的特征。进行数值分类,构造分类模式一般采用聚类分析和判别分析技术。
  如何选择适当的方法来解决实际问题,需要对问题进行综合考虑。对一个问题可以综合运用多种统计方法进行分析。例如一个预报模型的建立,可先根据有关生物学、生态学原理,确定理论模型和试验设计;根据试验结果,收集试验资料;对资料进行初步提炼;然后应用统计分析方法(如相关分析、逐步回归分析、主成分分析等)研究各个变量之间的相关性,选择最佳的变量子集合;在此基础上构造预报模型,最后对模型进行诊断和优化处理,并应用于生产实际。
析:
很显然,非正态性比较明显 现在, 我们取得上海市场关于铜的所有信息,如价格信息,持仓信息,成交信息,库存信息,以及汇率,船运费率,lme市场的价格/库存/成交/持仓信息,以及周基金持仓信息和月度进出口信息

进行因子分析的一般化方法后,得到几个比较重要的因子,正交旋转后,进行回归,得到我们预测的价格与实际价格之间的对比图:



图中,从1月份,上海的预测值比实际价格要低,而外盘刚好相反,说明,我们要进行买国内,卖LME操作能够稳定获得定价误差收益。如果我们根据预测值和实际值,做一些交易策略,最为简单的就是将现实价差和模拟价差做一个均值回复交易,以模拟的为标准,实际的为噪音,高了就卖空组合,低了就买入组合。看看交易结果如何:

上图画出的是上海铜走势图, 策略累计收益为58950元(每吨)
中间的图表示策略方向,1为做多,-1 为做空 (不存在空仓,可以改良)
最下面的图形部分表示,累计收益走势图,sharper比值为2.86 来一张更为直观的风险分布图,因为刚才我说用的是均线系统能进行测试,均线大家当然都知道是什么玩意了,不多讲了, 那么,如何选择最好的均线做交易系统估计是大家比较头疼的,那么,matlab给出了一个比较好的直观图示:应用方法不外乎做一个循环,将均线两两配对,对同样的策略系统跑一边,计算出sharper值,越高越好了,意思就是,同样的风险承担下,你获得的收益越高,或者说,你上下电梯的过程中,不要上下做,要往一个方向坐就对了,我们追求的是位移,不是路程!!




说明一下, 你会发现在某些区域内,热度比较集中,这就是你要追求的组合型策略,即不要单纯做一个均线系统,因为这个均线系统可能被你过度优化了,我们选择那一块的均线组合做成均线系统,分担了风险,也获得较为稳定的收益。


% function dailyforecast
% author: jemnbo@gmail.com
%% load raw data
clear all
clc
load cuprices
load CuPosition
rawprice=CuPrices;
rawposition=CuPosition;
CuPosition(1:2,:)=[];
%% date assign
%{
% 由于两个市场交易时间不一致,我们这里主要研究的市场是国内shufe。需要将时间调整到以上海为准。
% 以lme的昨日收盘价和涨跌幅作为今日开仓价和收盘价的参考。同时,利用收集到主力持仓量变化作为辅助。
% 如果可能,我们会将LME仓单量(周数据或日数据也引入进来)
% prices: 日期 开高低收(上海) 开高低收(lme)
%}
% 规则: 国内市场在交易的,如果国外同时也在交易,双方保留; 如果国内交易,国外休市,则国外重新复制一份昨日收盘即可;
% 如果国内休市国外交易,则只保留国外这段时间内交易的 开盘0 high(max) low(min) close(t)
[c1 r1]=size(CuPrices);
Prices=sum(~isnan(CuPrices(:,2)));
Prices=zeros(Prices,9);
j=0;
for i=1:c1
if ~isnan(CuPrices(i,2)) && ~isnan(CuPrices(i,6))
j=j+1;
Prices(j,:)=CuPrices(i,:);
elseif isnan(CuPrices(i,2)) && ~isnan(CuPrices(i,6))
CuPrices(i-1,6:9)=[CuPrices(i-1,6),max(CuPrices(i-1,7),CuPrices(i,7)),min(CuPrices(i-1,8),CuPrices(i,8)),CuPrices(i,9)];
elseif ~isnan(CuPrices(i,2)) && isnan(CuPrices(i,6))
j=j+1;
CuPrices(i,6:9)=CuPrices(i-1,6:9);
Prices(j,:)=CuPrices(i,:);
end
end
e1=juzheng(Prices,CuPosition,1);
e2=juzheng(CuPosition,Prices,1);
data=[e1,e2(:,2:4)];
% 日期1 2:5上海 6:9lme 10成交量 11买持 12卖持

%% pre analysis
%% 收益率统计
% 收益率 r=ln(1+R)
% 单周期简单收益率
Simrets=100*(data(2:end,5)./data(1:end-1,5)-1);
% 复合收益率
Logrets=100*(log(data(2:end,5)./data(1:end-1,5)));
Simretsstat.Simrets=Simrets;
Simretsstat.mu=mean(Simrets);
Simretsstat.sigma=std(Simrets);
Simretsstat.skewness=skewness(Simrets);%~ N(0,6/T)
Simretsstat.kurtosis=kurtosis(Simrets); %~N(0,24/T)
Logretsstat.min=min(Logrets);
Logretsstat.max=max(Logrets);
Logretsstat.Logrets=Logrets;
Logretsstat.mu=mean(Logrets);
Logretsstat.sigma=std(Logrets);
Logretsstat.skewness=skewness(Logrets);%~ N(0,6/T)
Logretsstat.kurtosis=kurtosis(Logrets); %~N(0,24/T)
Logretsstat.min=min(Logrets);
Logretsstat.max=max(Logrets);
figcount=1;
figure(figcount);
figcount=1+figcount;
subplot(221)
plot(Simrets)
title('Simrets')
subplot(223)
plot(Simrets)
title('Logrets')
subplot(222)
normplot(Logrets)
title('Simrets')
subplot(224)
normplot(Logrets)
title('Logrets')
% normpdf normcdf
pdf_Simrets = normpdf(Simretsstat.Simrets,Simretsstat.mu,Simretsstat.sigma);
cdf_Simrets= normcdf(Simretsstat.Simrets,Simretsstat.mu,Simretsstat.sigma);

%% 自相关研究
% 线性时间序列分析:研究变量与其过去值的相关系数为其重点:平稳性、动态相依性、自相关系数、建模和预测。AR,MA,ARMA,season...
% 平稳性:严平稳很难用经验验证,一般我们用的是弱平稳序列,即均值和协方差(Rt Rt-1)是不随时间变化的。
% 自相关函数(ACF)

%% PCA
%
idata=[data(2:end,[2:5,11:12]),data(1:end-1,6:9)]; % 抽取上海当日的交易情况和lme的昨日情况,以及上海昨日的持仓情况
%
data1=zscore(idata);
figure(figcount);
figcount=1+figcount;
waterfall(data1)
%
[T,n] = size(idata);
ddata = idata(2:T,:)-idata(1:T-1,:);
mm = mean(ddata);
[pcs,comp,vars,t2] = princomp(ddata);
disp(' variances % var.')
disp([vars 100*vars/sum(vars)])
% correlation graph 基础知识,看看张尧庭的《多元统计分析》,呵呵,应该不是很难,顺便还能学习一下SAS的用法