%{
1,海龟的止损
有了止损并不意味着海龟总是让经纪人设置实际的止损指令。 因为海龟持有如此大量的头寸,所以,我们不想因为让经纪人设置止损指令而泄露我们的头寸或我们的交易策略。
相反,我们被鼓励设定某个价位,一旦达到该价位,我们就会使用限价指令或市价指令退出头寸。 2,离开市场
系统一离市对于多头头寸为10日最低价,对于空头头寸为10日最高价。如果价格波动与头寸背离至10日突破,头寸中的所有单位都会退出。 %}
newlip=[0, 0, 0, inf,0]; % 平仓记录,【盈利状况 多头水平 空头水平 开仓时间 平仓时间】 MarketValue=0; % 市值水平。
for i=1:Q
O=data(j,i*5-4);H=data(j,i*5-3);L=data(j,i*5-2);C=data(j,i*5-1); QuitL=min(DailyData(Today-Str1_out:Today-1,i*5-2)); QuitH=max(DailyData(Today-Str1_out:Today-1,i*5-3)); % HoldingPosition=zeros(4,5*Q); % 持仓,针对每一个品种,描述出其(开仓价格,持仓量,开仓方向,预设止损值,开仓时间) 4×(5×i)
if any(HoldingPosition(:,i*5-4)) % 表示有档位的持仓非空 ii=find(HoldingPosition(:,i*5-3)~=0); for k=1:ii
if HoldingPosition(k,i*5-2)==1 % 多头
if L<=HoldingPosition(k,i*5-1) % 止损触发 % LastPL=[0, 0, 0, 0, 1]; % 平仓记录,【盈利状况 多头水平 空头水平 开仓时间 平仓时间】 K*(5×i),k交易次数
% Balance=[Account ,0]; % 账户可用资金 账户交易资产现值 m*(2*i),m时间长度
newlip(1,1)=newlip(1,1)+(HoldingPosition(k,i*5-1)-HoldingPosition(k,i*5-4))*HoldingPosition(k,i*5-3); % 盈亏
newlip(1,2)=newlip(1,2)-HoldingPosition(k,i*5-3); % 多头减少量 newlip(1,3)=newlip(1,3)+0;
newlip(1,4)=min([newlip(1,4),HoldingPosition(k,i*5)]); newlip(1,5)=max([newlip(1,5),j]);
HoldingPosition(k,:)=zeros(1,5); % 还原仓位 PLI(1,i)=HoldingPosition(k,i*5-4);% 开仓价位 PLI(2,i)=1; % 方向
PLI(3,i)=-1; % 亏损与否 elseif L<=QuitL % 退出触发
newlip(1,1)=newlip(1,1)+(HoldingPosition(k,i*5-1)-QuitL)*HoldingPosition(k,i*5-3); % 盈亏 newlip(1,2)=newlip(1,2)-HoldingPosition(k,i*5-3); % 多头减少量 newlip(1,3)=newlip(1,3)+0;
newlip(1,4)=min([newlip(1,4),HoldingPosition(k,i*5)]); newlip(1,5)=max([newlip(1,5),j]);
HoldingPosition(k,:)=zeros(1,5); % 还原仓位
PLI(1,i)=HoldingPosition(k,i*5-4);% 开仓价位 PLI(2,i)=1; % 方向
if (HoldingPosition(k,i*5-1)-QuitL)*HoldingPosition(k,i*5-3)<0 PLI(3,i)=-1; % 亏损 else
PLI(3,i)=1; % 盈利 end else end
elseif HoldingPosition(k,i*5-2)==-1 %空头 if H>=HoldingPosition(k,i*5-1) % 止损触发 % LastPL=[0, 0, 0, 0, 1]; % 平仓记录,【盈利状况 多头水平 空头水平 开仓时间 平仓时间】 K*(5×i),k交易次数
% Balance=[Account ,0]; % 账户可用资金 账户交易资产现值 m*(2*i),m时间长度
newlip(1,1)=newlip(1,1)
-(HoldingPosition(k,i*5-1)-HoldingPosition(k,i*5-4))*HoldingPosition(k,i*5-3); % 盈亏 newlip(1,2)=newlip(1,2)+0;
newlip(1,3)=newlip(1,3)-HoldingPosition(k,i*5-3);% 空头减少量 newlip(1,4)=min([newlip(1,4),HoldingPosition(k,i*5)]); newlip(1,5)=max([newlip(1,5),j]);
HoldingPosition(k,:)=zeros(1,5); % 还原仓位 PLI(1,i)=HoldingPosition(k,i*5-4);% 开仓价位 PLI(2,i)=-1; % 方向 PLI(3,i)=-1; % 亏损与否 elseif H>=QuitH % 退出触发
newlip(1,1)=newlip(1,1) -(HoldingPosition(k,i*5-1)-QuitH)*HoldingPosition(k,i*5-3); % 盈亏 newlip(1,2)=newlip(1,2)+0;
newlip(1,3)=newlip(1,3)-HoldingPosition(k,i*5-3);% 空头减少量 newlip(1,4)=min([newlip(1,4),HoldingPosition(k,i*5)]); newlip(1,5)=max([newlip(1,5),j]);
HoldingPosition(k,:)=zeros(1,5); % 还原仓位
PLI(1,i)=HoldingPosition(k,i*5-4);% 开仓价位 PLI(2,i)=-1; % 方向
if -(HoldingPosition(k,i*5-1)-QuitH)*HoldingPosition(k,i*5-3)<0 PLI(3,i)=-1; % 亏损 else
PLI(3,i)=1; % 盈利 end else end else end end end end
% 更新平仓历史记录 if newlip(1,1)~=0
LastPL=[LastPL;newlip]; end
for i=1:Q
O=data(j,i*5-4);H=data(j,i*5-3);L=data(j,i*5-2);C=data(j,i*5-1); MarketValue=MarketValue+sum(HoldingPosition(:,i*5-3)*C); end
% 更新账户损益信息
Balance(j,:)=[Balance(j-1,1)+newlip(1,1), MarketValue]; %%
% 开仓信号产生和确认以及加仓信号的确认 %{
如果上次突破已导致赢利的交易,系统一的突破入市信号就会被忽视。注意:为了检验这个问题,上次突破被视为某种商品上最近一次的突破,
而不管对那次突破是否实际被接受,或者因这项法则而被忽略。如果有赢利的10日离市之前,突破日之后的价格与头寸方向相反波动了2N, 那么,这一突破就会被视为失败的突破。
上次突破的方向与这项法则无关。因此,亏损的多头突破或亏损的空头突破将使随后新的突破被视为有效的突破,而不管它的方向如何(即多头或空头)。
然而,如果系统一的入市突破由于以前的交易已经取得赢利而被忽略,还可以在55日突破时入市,以避免错过主要的波动。
这种55日突破被视为自动保险突破点(Failsafe Breakout point)。
多品种组合时,开仓顺序按照相对强弱指标排序进行对比。做多时,买强;做空时,卖弱。 %}
RSV_j=RSV(j,:);
[s sr]= sort(RSV_j,'descend'); % 获得从大到小排序。 [s2 sr2]= sort(RSV_j); % 获得从小到大排序。
% 率先对仓位和风险水平做一个核算。
% 风险水平,根据相关性水平进行那个核算。 % 首先要把价格序列转换成收益率。 MCorr=[0;0]; % 下相关和 上相关 for i=1:Q for k=i+1
Ci=data(j-CorrAdj:j,i*5-1); Ck=data(j-CorrAdj:j,k*5-1); ri=price2ret(Ci); rk=price2ret(Ck);
[corrxy] = exceedence_corr(ri,rk,0,0); % 均值左右的相关性<0 ;>0 MCorr=MCorr+corrxy; end end
MCorr=MCorr/(i*(i-1)/2);
% 做多风险控制,观察下跌相关性风险 if MCorr(1,1)<= CorrLev(1,1) CB=PosLim(1,4);
elseif MCorr(1,1)>= CorrLev(1,2) CB=PosLim(1,2); else
CB=PosLim(1,3); end
% 做空风险控制,观察上涨相关性风险 if MCorr(2,1)<= CorrLev(1,1) CS=PosLim(1,4);
elseif MCorr(2,1)>= CorrLev(1,2) CS=PosLim(1,2); else
CS=PosLim(1,3); end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 再统计现在剩余的盘口数 %{
最大头寸限制为:
级别 类型 最大单位 1 单一市场 4个单位 2 高度相关市场 6个单位 3 一般相关度市场 8个单位 4 低度相关市场 10个单位
5 单向交易—多头或空头 12个单位
如果止损风险容度为2N,对单向交易而言,一次性系统承担的最大风险为-24% %}
BQ=0; % 买单位数 buy quantity SQ=0; % 卖单位数 for i=1:Q for k=1:4
if HoldingPosition(k,i*5-3)~=0 && HoldingPosition(k,i*5-2)==1 BQ=BQ+1; end
if HoldingPosition(k,i*5-3)~=0 && HoldingPosition(k,i*5-2)==-1 SQ=SQ+1; end end end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 根据风险控制概念,现在还可以做多和做空的单位数分别为:
PB=min([CB+SQ-BQ PosLim(1,5)-BQ]) ; % permit buy,相关性风险下可以允许少部分对冲,但总单向持仓不能找过一个限度。
PS=min([CS+BQ-SQ PosLim(1,5)-SQ]) ; % permit sell
for ll=1:Q
if PB>0 % 有剩余头寸
i=sr(ll); % 首先从RSV最大的开始
O=data(j,i*5-4);H=data(j,i*5-3);L=data(j,i*5-2);
EnterL=min(DailyData(Today-Str1_in:Today-1,i*5-2)); EnterH=max(DailyData(Today-Str1_in:Today-1,i*5-3)); N= NMatrix(Today-1,i);
ValuePerPoint=N*Size(i)/Margin(i); % 一手波动全部损失所值价值 VN= fix(0.01*sum(Balance(j-1,:))/ValuePerPoint); % 每个标准风险单位 PriceVN_B=VN*H*Margin(i)*Size(i); % 做多每组所需资金 if H>=EnterH
if PLI(2,i)==-1 || PLI(3,i)==-1 || PLI(2,i)==1 && PLI(1,i)-EnterL>=2*N || H>= max(DailyData(Today-Str2_in:Today-1,i*5-3))
% 上次交易为做空 或上次交易亏损 或 上次交易也是做多,不过开仓位置与这一次最低点没有超过2N
if HoldingPosition(1,i*5-3)==0 % 虚位以待!
if Balance(j-1,1)>PriceVN_B
% % 持仓,针对每一个品种,描述出其(开仓价格,持仓量,开仓方向,预设止损值,,开仓时间)
% 4×(5×i)
HoldingPosition(1,i*5-4)=(EnterH);