中国海龟——在实盘大赛中获奖的NEWS系统解密
文章来源:点宽量化社区
文章传送门:中国海龟——在实盘大赛中获奖的NEWS系统解密
本系列由点宽DigQuant量化人才俱乐部独家发布
未经允许,不得转载
本节提要
提及趋势跟踪, 我们不得不涉及在该领域有至高地位的海龟交易法则。
与原版的海龟交易法则不同, 这里更重视的是动态风险的管理。
与其臆测市场未来的波动性水平,不如援引动态参数。
1.背景
提及趋势跟踪, 我们不得不涉及在该领域有至高地位的海龟交易法则, 在趋势跟踪领域, 它的地位可能不亚于《圣经》之于耶稣教。 1971年,海龟交易法则创始人理查德·丹尼斯以600美金入市, 至1987年在剔除众多的该基金捐赠之后, 本金仍升逾2亿美金。 简单地说, 海龟交易法则就是上涨突破20周期或55周期的最高价后做多, 下跌突破20周期或55周期的最低价做空。 然后, 以2/N为单位进行三次加仓(N是该品种的平均周期波动性水平)。
曾经在美国期货市场上大获成功的海龟交易法则是否同样适用于中国期货市场呢?带着这样的疑问, 2007年, 将海龟交易法则略做修改后, 将其命名为NEWS交易系统模型, 并且以完全按照系统信号的机械化交易模式报名参加了第七届中期杯实盘交易大赛。 在不到半年(2007年5~10月)的参赛时间里面,取得了百分之105的收益率回报。
2.中国版海龟思维
在常态市场的应用中, 贯穿过程中的 “ 停、 走 ” 概念, 可以有效地回避该系统可能带来的巨幅资金回撤, 换句话说, 该系统并非持续在市, 当然,如果将 “ 停、 走” 引申为一种头寸调整的方法, 也可以让它持续在市。 何时获利了结中断系统的运行?何时增、 减仓?与原版的海龟交易法则不同, 我更重视的是动态风险的管理。 所谓动态风险, 就是当前交易信号的反向位置可能带来的最大损失(没有考虑到隔夜直接以反向涨、 跌停板跳空的情形)。
每一笔交易,最多愿意承受多大的损失?所有的交易,假如集体失败,最多面临多大的损失合计?这就是动态风险管理的基础。 值得提醒的是,这种考量在日线级别下, 是基于每天的收盘价, 而非该笔交易的初始建仓成本。以NEWS系统为例, 我们不难得到反向交易系统信号的位置, 以及对应头寸可 能带来的亏损金额, 与我们预设的风险水平核对, 我们就不难形成头寸增减的交易决策。这样操作的意义在于每一笔交易、 每一天的交易,我们始终承受着同样水平的风险。
传统的观点认为, 如果市场始终维持一个足够高水平的波动性, 那么,趋势系统永远都不会失效。 对于这个观点, 我有一点补充:趋势系统的参数必须与市场的波动性水平相吻合。 否则, 仍然有可能无法盈利。 1987年, 海龟交易法则的惨败:1991年, 理查德·丹尼斯改用调大参数后的海龟交易法则 重出江湖, 都印证着这个道理。
“惶恐滩前说惶恐, 零丁洋里叹零丁“,与其臆测市场未来的波动性水平, 不如援引动态参数, 根据市场实际波动性的水平, 自动调整趋势系统的参数。
3.加入了动态调整系统参数的NEWS系统交易模型思路
EF=(HHV(C,N1)-LLV(C,N1))/SUM(ABS(C-REF(C,N1)),N1);
EF10=EMA(EF, N2);
CLOSE>>REF (HHV (HIGH, INTPART (10-(EF10-0.5)×10)), 1), BPK;
CLOSE<<REF (LLV (LOW, INTPART (10-(EF10-0.5)×10)), 1), SPK;
4.策略代码分享
4.1策略文件
➢ 回测软件:Auto-Trader Pro(AT 量能策略研究终端 以 MATLAB 研究平台为依托,甚至可以把交易思路延生到机器学习,神经网络,舆情分析等更复杂的领域。依托 Matlab 强大的数理研究及强大的金融工具箱,策略师不再需要依赖程序员的编程能力,而将研究成果直接转化为程序化策略。)
function chinatt(Int,Begin,cellPar)
%UNTITLED2 此处显示有关此函数的摘要
global idexK
global Tlen
global TimeDT
global TimeKT
N1=cellPar{1};
N2=cellPar{2};
if Int
traderSetParalMode(false);
idexK=traderRegKData('day',1);
Tlen=length(idexK(:,1));
TimeDT=zeros(Tlen,1);
TimeKT=zeros(Tlen,1);
else
%提取数据
[mp,~,~] = traderGetAccountPositionV2(1,(1:Tlen));
[~,HandListCap,~,~,~]=traderGetAccountInfoV2(1);
iddexK = traderGetRegKData(idexK, 100, false);
[Multiple, ~, ~, ~, ~, ~, ~] = traderGetFutureInfoV2(1:Tlen);
for i=1:Tlen
idddexK=iddexK(1+8*(i-1):8*i,:);
time=idddexK(1,:);
high=idddexK(3,:);
low=idddexK(4,:);
close=idddexK(5,:);
sharenum=floor(HandListCap*0.8/close(end)/Multiple(i)/Tlen);
%指标计算
diff=close(N1+1:end)-close(1:end-N1);
EF=(max(close(end-N1+1:end))-min(close(end-N2+1:end)))/sum(abs(diff(end-N1+1:end)));
EF10=EMA(EF,N2);
t=floor(10-(EF10-0.5)*10);
if isnan(t)
continue;
end
conbuy=close(end)>max(high(end-t:end-1));
consell=close(end)<min(low(end-t:end-1));
%开平仓动作
if mp(i)==0
if conbuy
traderBuyV2(1,i,sharenum,0,'market','buy');
elseif consell
traderSellShortV2(1,i,sharenum,0,'market','sell');
end
elseif mp(i)>0
if consell
traderPositionToV2(1,i,0,0,'market','stop');
end
elseif mp(i)<0
if conbuy
traderPositionToV2(1,i,0,0,'market','stop');
end
end
end
end
end
function EMAValue=EMA(Price,Length)
EMAValue=zeros(length(Price),1);
K=2/(Length+1);
for i=1:length(Price)
if i==1
EMAValue(i)=Price(i);
else
EMAValue(i)=Price(i)*K+EMAValue(i-1)*(1-K);
end
end
end
4.2执行文件
targetList1 = traderGetCodeList('dce000');
targetList2 =traderGetCodeList('czce000');
targetList3 = traderGetCodeList('shfe000');
targetList=[targetList1,targetList2,targetList3];
targetList=targetList([ 5 7 8 12 14 16 33 40 43 44 ]);
traderSetBacktest(100000000,0.0025,0.02,0,1,0,0);
AccountList(1) = {'FutureBackReplay'};
N1=9;
N2=11;
traderRunBacktestV2('chinatt',@chinatt,{N1,N2},AccountList(1),targetList,'day',1,20110101,20170820,'FWard');
5.回测表现
随机挑选出10种不同类型同时成交量活跃的商品期货
自2010年至2017年进行回测
文章传送门:中国海龟——在实盘大赛中获奖的NEWS系统解密