【研报复现】天风证券——商品期货CTA专题报告(三)策略的趋势过滤
发布时间:2019/07/18 14:41:30 1782 1
##前言 **品种趋势的强弱是趋势策略盈利的关键因素** 品种趋势性越强,回测效果越好。如果我们观察各品种连续主力合约K线,可以发现螺纹钢、焦炭等品种都经历过非常明显的趋势行情。从策略收益的统计来看,趋势性强的品种相比于缺乏趋势的品种其胜率未必有优势,但是盈亏比有明显优势。这一点从侧面映证了趋势策略“亏小钱赚大钱”的理念,而趋势的强弱则是能否赚到“大钱”的关键因素。 **控制多品种组合中弱趋势性品种上的亏损** 趋势性弱的品种由于难赚“大钱”,所以赚的钱不能填上“小亏”出来的“坑”,一直与趋势策略效果不佳。对于一个多品种的交易系统而言,不可能指望每个品种都盈利。只要弱趋势的品种上的亏损在可控范围内,不要砸出一个填不上的“坑”,那么依靠有行情的品种的大幅盈利,整个系统仍能保持盈利。 **更谨慎的建仓来应对品种的弱趋势性** 单个策略最终的收益取决于三点:胜率、盈亏比、交易次数。胜率越高、盈亏比越大的同时交易次数越多,策略收益就会越高,但是这三点互相之间或多或少存在冲突。在一个趋势弱的行情中,相对于提高盈亏比,降低交易次数可能是更明智的对策。趋势性很强的品种在增加过滤条件后虽然能降低净值波动性,但是由于交易次数大幅减少使得总体收益下降;趋势性一般的品种在增加过滤条件后可能会对参数更为敏感,交易次数减少,收益波动性有一定程度下降,收益变化不大;趋势性弱的品种在增加过滤条件后不论是回撤还是手一抖有明显的改善。 ##不过滤趋势 在这篇报告中,我们在螺纹钢、橡胶、沪铜、棉花这四个最具代表性的品种上对最常见的几个策略(均线、MACD、ATR、Bolling)进行了测试,测算的步骤结果初步验证了趋势类策略“多品种、多周期、多策略”理念的有效性。 首先在一些成交额较大的品种上测试简单均线的效果,设定如下: - 收盘价上穿N日均线做多 - 收盘价下穿N日均线做空 - 单笔交易亏损b%平仓止损 - 交易成本以开平仓各2.5滑点计 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/d1ca5854c33bef48cf37c4d0022698e2.png) ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/7e869475dbdfb2862f007afb64f1decf.png) ##过滤趋势 从以上的测算我们发现趋势策略能否盈利很大程度依赖于所交易品种行情的趋势性,如果我们的交易系统具有预测品种趋势性的能力,那毫无疑问该系统会获得巨大成功。但遗憾的是似乎没有证据表明仅仅根据量价数据就能预测品种的趋势性。 那么,我们退而求其次,尝试根据市场当前状态来过滤交易信号。 ####均线排列 本着使用常见指标并且尽可能减少参数的原则,我们采用均线排列的方式对趋势状态进行划分。我们的计算方式如下: $$sig = sum{[Ma(i)-Ma(i+1)]/abs[Ma(i)-Ma(i+1)]})$$ *(i = 1、2、3...N)* 简单来说我们对比相邻两根均线的大小,比如5天均线比6天均线,如果前者大则+1,反之-1。取N对相邻均线取值之和为均线排列值。如果该值大于0我们认定当前处于上涨趋势,反之认定当前处于下跌趋势。 我们根据这一判断对上述均线策略进行调整: - M日均线排列值大于0,收盘价上穿N日均线,做多 - M日均线排列值小于0,收盘价下穿N日均线,做空 - 收盘价反向穿过N日均线或均线排列值与当前持仓方向相反平仓 - 不设固定止损线,保持两个参数 我们调整后的策略仍然保持两个参数,一个均线周期N,一多头排列数量M。 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/96825c31eecba9ed068cf9da295c57cf.jpg) ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/2f2c226087644e3a6aa1c696d2e1f43f.jpg) **我们对以下品种进行回测,并将两种结果进行对比。** ###1、黑色系 黑色系是近年来趋势性最强的大类商品,其中最具代表性的品种就是螺纹钢、铁矿石、焦炭。 ####螺纹钢(RB0000) 螺纹钢是趋势性很强的品种,使用简单的均线回测就有很高的收益,如下图。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/6d3dc9cc18a6e33da6b4f54e3fbdf1ff.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/76cbfbeea33007c357a1862a4a24c4ac.jpg) 由图片可以看出,无论是采用过滤或是不过滤趋势策略,螺纹钢的收益均呈现较好的上涨趋势。其中不过滤趋势的曲线较为平滑。 ####铁矿石(I0000) 如下图所示,简单的均线策略在铁矿石上能获得较高的收益,但是其效果以及稳定性不如在螺纹钢上使用均线策略。由不过滤趋势与过滤趋势的曲线对比看来,前者的曲线稳定性较好,总体上呈上升趋势。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/300340581af46be801b55ddf043e6a79.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/cc4857d97ae70eec7158aab9ab06402c.jpg) ####焦炭(J0000) 焦炭是所测试过的品种当中趋势最强的品种,简单的均线策略也能获得较高的收益。由图片可以看出,无论是采用过滤或是不过滤趋势策略,焦炭的收益均呈现较好的上涨趋势。其中不过滤趋势的曲线较为平滑。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/334fd1a36f49abd041a9bb7ddf6510e9.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/c15f455a8cd8544b8bf2cef5f2f3246b.jpg) ###2、有色系 有色系各品种近年来趋势性不如黑色系强,我们选取了两个成交额较大的品种,铝和锌。 ####沪铝(AL0000) 由图片可以看出,无论是采用过滤或是不过滤趋势策略,铝的收益均呈现较好的上涨趋势。其中过滤趋势的曲线较为平滑。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/9c4d696f89ece44fc355bbbf9ab19dfd.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/42b23d1b5ba5020a83def1c348fb6db1.jpg) ####沪锌(ZN0000) 由图片可以看出,由于15、16年锌的行情较好,收益呈上涨趋势,其他年份收益均绩效平平。其中不过滤趋势的曲线较为平滑。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/f0fbd62fe7c881369024d7cd848be030.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/5203382e0b79e7d236b78b9932aa3539.jpg) ###3、农产品 农产品中,我们选用了棉花和豆粕两个具有代表性同时成交额也较高的品种。 ####棉花(CF000) 由图片可以看出,棉花多数年份的收益为负,简单均线策略在其效果较差。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/00df1d60310daeb7dc8f524dadc372e3.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/1c4654996c5113ef23dccdd34a6d51f3.jpg) ####豆粕(M0000) 由图片可以看出,豆粕多数年份的收益为负,简单均线策略在其效果较差。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/38b495290166f1382221a99d102e8d90.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/77c5c44163b5cdc193fe0ec5143fc941.jpg) ###4、化工品 我们选择比较有代表性的橡胶和聚丙烯。 ####橡胶(RU0000) 由图片可以看出,在过滤趋势中,橡胶多数年份的收益为负,简单均线策略在其效果较差。但是在不过滤趋势中,总体的收益趋势呈现上升状态,该策略在不过滤趋势中表现较好。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/254222cb34b8f614abc4e10bd06e9def.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/f0a53de6ed4c1fd293f6148bcb6853d0.jpg) ####聚丙烯(PP0000) 由图片可以看出,在不过滤趋势中,聚丙烯的收益表现平平,说明该策略表现较差。但是在过滤趋势中,聚丙烯的收益表现总体呈现上升状态,表现较好。 图1、不过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/dc80f68a9d958d6b552ae9d339aa6c2b.png) 图2、过滤趋势 ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/forum/1150546e3b56c74beec6a77f429c3a12.jpg) ##执行代码(不过滤趋势) ###策略函数 ```javascript function tendency3(bInit,bDayBegin,cellPar) global g_idxKDay; global g_idxKMin; global entryP; global key; global cap; N=cellPar{1}; b=cellPar{2}; if bInit traderSetParalMode(false); g_idxKDay = traderRegKData('day',1); g_idxKMin = traderRegKData('min',60); else targetList = traderGetTargetList(); n=length(targetList); dataDay = traderGetRegKData(g_idxKDay,30,false); dataMin = traderGetRegKData(g_idxKMin,1,false); if isempty(entryP)||isempty(key)||isempty(cap) entryP = zeros(1,n); key = zeros(1,n); [v,~,~,~] = traderGetAccountInfoV2(1); cap = v; end for i = 1:n [mp,~,~] = traderGetAccountPositionV2(1,1:n); if isempty(dataDay)||isempty(dataMin)||dataDay(5,end)==0||dataMin(5,end)==0 continue; end [Multiple,~,~,~,~,~,~] = traderGetFutureInfoV2(i); sharenum = floor(cap/n/dataMin(5,end)/Multiple); m1 = mean(dataDay(5,end-N+1:end)); con1 = dataMin(5,end)>m1; con2 = dataMin(5,end)<m1; if mp(i)==0 if con1 order1 = traderDirectBuyV2(1,i,sharenum,0,'market','buy'); if order1 ~= 0 key(i) = key(i)+1; entryP(i) = dataMin(5,end); end elseif con2 order2 = traderDirectSellV2(1,i,sharenum,0,'market','sell'); if order2 ~= 0 key(i) = key(i)+1; entryP(i) = dataMin(5,end); end end elseif mp(i)>0 if dataMin(5,end)>(1+3*b)*entryP(i)||dataMin(5,end)<(1-b)*entryP(i) traderPositionToV2(1,i,0,0,'market','stop'); end else if dataMin(5,end)<(1-3*b)*entryP(i)||dataMin(5,end)>(1+b)*entryP(i) traderPositionToV2(1,i,0,0,'market','stop'); end end end end end ``` ###回测函数 ```javascript clear all; % SHFE 上海期货交易所 Code(1).code = { 'AL0000', 'RB0000','RU0000', 'ZN0000'}; % DCE 大连商品交易所 Code(2).code = {'I0000', 'J0000', 'M0000', 'PP0000'}; % 'CZCE' 郑州商品交易所 Code(3).code = {'CF000'}; m=1; for i = 1:length(Code(1).code) targetList(m).Market = 'SHFE'; targetList(m).Code = cell2mat(Code(1).code(i)); m = m+1; end for i = 1:length(Code(2).code) targetList(m).Market = 'DCE'; targetList(m).Code = cell2mat(Code(2).code(i)); m = m+1; end for i = 1:length(Code(3).code) targetList(m).Market = 'CZCE'; targetList(m).Code = cell2mat(Code(3).code(i)); m = m+1; end N=20; b=0.05; traderSetBacktest(100000000,0.000026,0.02,0,1,0,0); AccountList(1) = {'FutureBackReplay'}; traderRunBacktestV2('tendency3',@tendency3,{N,b},AccountList,targetList,'min',60,20110101,20170101,'FWard');%回测 ``` **本策略详情请看:[https://www.digquant.com.cn/stra.php?mod=model&pid=269](https://www.digquant.com.cn/stra.php?mod=model&pid=269)** ##执行代码(过滤趋势) ###策略函数 ```javascript function tendencyplus(bInit,bDayBegin,cellPar) global g_idxKDay; global g_idxKMin; global entryP; global key; global cap; N=cellPar{1}; M=cellPar{2}; if bInit traderSetParalMode(false); g_idxKDay=traderRegKData('day',1); g_idxKMin=traderRegKData('min',60); else targetList=traderGetTargetList(); TLen=length(targetList); [mp,~,~]=traderGetAccountPositionV2(1,1:TLen); dataMin=traderGetRegKData(g_idxKMin,60,false); dataDay=traderGetRegKData(g_idxKDay,60,false); if isempty(entryP)||isempty(key)||isempty(cap) entryP=zeros(1,TLen); key=zeros(1,TLen); [V,~,~,~] = traderGetAccountInfoV2(1); cap = V; end for i= 1:TLen if isempty(dataDay)||isempty(dataMin)||dataDay(5,end)==0||dataMin(5,end)==0 continue; end [Multiple,~,~,~,~,~,~] = traderGetFutureInfoV2(i); sharenum = floor(cap/length(targetList)/dataMin(5,end)/Multiple); for k = 1:M a = mean(dataDay(5,end-k+1:end)); b = mean(dataDay(5,end-k,end)); sig = sum((a-b)/abs(a-b)); end if mp(i)==0 if sig>0&&dataMin(5,end)>mean(dataDay(5,end-N+1:end)) order=traderDirectBuyV2 (1,i,sharenum,0,'market','buy'); if order~=0 key(i)=key(i)+1; entryP(i)=dataMin(5,end); end elseif sig<0&&dataMin(5,end)<mean(dataDay(5,end-N+1:end)) order=traderDirectSellV2 (1,i,sharenum,0,'market','Sell'); if order~=0 key(i)=key(i)+1; entryP(i)=dataMin(5,end); end end elseif mp(i)>0 if dataMin(5,end)<mean(dataDay(5,end-N+1:end))||sig/mp(i)<0 traderPositionToV2(1,i,0,0,'market','stop'); end else if dataMin(5,end)>mean(dataDay(5,end-N+1:end))||sig/mp(i)<0 traderPositionToV2(1,i,0,0,'market','stop'); end end end end end ``` ###回测函数 ```javascript % SHFE 上海期货交易所 Code(1).code = { 'AL0000', 'RB0000','RU0000', 'ZN0000'}; % DCE 大连商品交易所 Code(2).code = {'I0000', 'J0000', 'M0000', 'PP0000'}; % 'CZCE' 郑州商品交易所 Code(3).code = {'CF000'}; m=1; for i = 1:length(Code(1).code) targetList(m).Market = 'SHFE'; targetList(m).Code = cell2mat(Code(1).code(i)); m = m+1; end for i = 1:length(Code(2).code) targetList(m).Market = 'DCE'; targetList(m).Code = cell2mat(Code(2).code(i)); m = m+1; end for i = 1:length(Code(3).code) targetList(m).Market = 'CZCE'; targetList(m).Code = cell2mat(Code(3).code(i)); m = m+1; end N=20; M=10; traderSetBacktest(100000000,0.000026,0.02,2.5,1,0,0); AccountList(1) = {'FutureBackReplay'}; traderRunBacktestV2('tendencyplus',@tendencyplus,{N,M},AccountList,targetList,'min',60,20110101,20170115,'FWard');%回测 ``` **本策略详情请看:[https://www.digquant.com.cn/stra.php?mod=model&pid=270](https://www.digquant.com.cn/stra.php?mod=model&pid=270)** ### End
1个赞 收藏
发表评论
0条评论
contact@digquant.com.cn

联系

邮箱

0755-8695-2080

联系

电话

关注

微信

关注

QQ

回到

顶部