《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 2301|回复: 52
收起左侧

[源码] 经验模态分解在股指期货中的实现

[复制链接]

该用户从未签到

发表于 2016-10-21 10:46:11 | 显示全部楼层 |阅读模式
本帖最后由 Masque 于 2016-10-21 10:45 编辑

最近看到一篇广发证券的研报——“带反转的加强版EMDT交易策略”,我把它在MATLAB中实现了,效果还不错,分享给大家看看~

总权益及回撤:
微信截图_20161010123233.png
多头权益曲线:
微信截图_20161010123051.png
空头权益曲线:
微信截图_20161010123058.png
盈亏散点图:
微信截图_20161010123301.png

策略代码
  1. function EMDT2(Freq,ShareNum,len,mlen,k,k2)

  2. % ------------ Retrace Strategy-------------------%

  3. % Freq 为输入时间频率
  4. % len 最少bar数目
  5. % mlen 开始交易时间
  6. % k 止损点数
  7. % k2 反转交易模式阈值

  8. %---------------------策略初始化与是否日内平仓---------------%
  9.    
  10. targetList = traderGetTargetList();
  11. HandleList = traderGetHandleList();
  12. [marketposition,~,~]=traderGetAccountPosition(HandleList(1),targetList(1).Market,targetList(1).Code);

  13. %---------------------策略提取数据---------------%

  14. global s;
  15. n = length(targetList);
  16. for j = 1:n
  17.     [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(j).Market,targetList(j).Code,'min',Freq, 0-len, 0,false,'FWard'); % 读取分钟k线数据
  18.     if length(close)<len+1
  19.         return
  20.     end
  21.     dlen = 20;
  22.     [Dtime,Dopen,Dhigh,Dlow,Dclose,Dvolume,Dturnover,Dopeninterest] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-dlen, 0,false,'FWard'); % 读取日k线数据
  23.     if length(Dclose)<dlen+1
  24.         return
  25.     end
  26. %     [atr,~] = traderATR(10,targetList(1).Market,targetList(1).Code,'day',1,0-dlen,0,false,'FWard'); % 计算日ATR
  27.    
  28. %---------------------策略计算与基本逻辑---------------%
  29.    
  30.     t = datevec(time(end));
  31.     if floor(time(end))~=floor(time(end-1))
  32.         s(j).daynum = s(j).daynum+1;
  33.     end
  34.     Y = t(4)*100+t(5);
  35.     if Y==1445
  36.         traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','收盘平仓'); % 收盘平仓
  37.     end;
  38.    
  39.     if Y==915+mlen
  40.         r = close(end-mlen:end); % 取每个交易日前mlen分钟的数据
  41.         for i = 1:4
  42.             r = emdtvalue(r); % 迭代进行4次分解
  43.         end
  44.         R = log(std(close(end-mlen:end)-r)/std(r)); % 波动能量比
  45.         s(j).R = s(j).R+R;
  46.         Rmean = s(j).R/s(j).daynum; % 波动能量比平均值
  47.         s(j).trend = 0;
  48.         if R<=Rmean
  49.             s(j).trend = 1; % 当天进行趋势交易
  50.         elseif R>=Rmean*k2
  51.             s(j).trend = -1; % 当天进行反转交易
  52.         end
  53.         s(j).bh = 0;
  54.         s(j).br = 0;
  55.         s(j).sh = 0;
  56.         s(j).sr = 0;
  57.         s(j).tt = 0;
  58.         
  59.         if s(j).trend==1 && s(j).daynum>10
  60.             if close(end)>close(end-mlen) && close(end)>mean(Dclose(end-3:end)) % 当前价格高于昨日收盘价,且当前价格高于3日均线,则做多
  61.                 OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
  62.                 if OrderID~=0
  63.                     s(j).openprice=traderOrderFilledPrice(HandleList(1),OrderID);
  64.                 end
  65.             elseif close(end)<close(end-mlen) && close(end)<mean(Dclose(end-3:end)) % 当前价格低于昨日收盘价,且当前价格低于3日均线,则做空
  66.                 OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','sell');
  67.                 if OrderID~=0
  68.                     s(j).openprice=traderOrderFilledPrice(HandleList(1),OrderID);
  69.                 end
  70.             end
  71.         end
  72.     end
  73.    
  74.     if Y>915+mlen && Y<1445 && s(j).daynum>10 % 反转交易采用pivot point策略
  75.         if s(j).trend==-1
  76.             HH = Dhigh(end-1);
  77.             LL = Dlow(end-1);
  78.             CC = Dclose(end-1);
  79.             Pivot = (HH+LL+CC)/3;
  80.             r1 = 2*Pivot-LL;
  81.             s1 = 2*Pivot-HH;
  82.             r2 = Pivot+r1-s1;
  83.             s2 = Pivot+s1-r1;
  84.             rm2 = (r1+r2)/2;
  85.             sm2 = (s1+s2)/2;
  86.             if close(end)>r2
  87.                 s(j).bh = 1;
  88.             end
  89.             if close(end)<s2
  90.                 s(j).sh = 1;
  91.             end
  92.             if s(j).bh==1 && close(end)<rm2
  93.                 s(j).br = 1;
  94.             end
  95.             if s(j).sh==1 && close(end)>sm2
  96.                 s(j).sr = 1;
  97.             end
  98.             if marketposition==0 && Y<1430
  99.                 if s(j).sr==1 && s(j).tt==0
  100.                     OrderID=traderDirectBuy(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','buy');
  101.                     if OrderID~=0
  102.                         s(j).openprice=traderOrderFilledPrice(HandleList(1),OrderID);
  103.                         s(j).tt = s(j).tt+1;
  104.                     end
  105.                 elseif s(j).br==1 && s(j).tt==0
  106.                     OrderID=traderDirectSell(HandleList(1),targetList(j).Market,targetList(j).Code,ShareNum,0,'market','sell');
  107.                     if OrderID~=0
  108.                         s(j).openprice=traderOrderFilledPrice(HandleList(1),OrderID);
  109.                         s(j).tt = s(j).tt+1;
  110.                     end
  111.                 end
  112.             end
  113.         end
  114.         
  115.         % 百分之一止损
  116.         if marketposition>0
  117.             if close(end)<s(j).openprice*(1-0.01*k)
  118.                 traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
  119.             end
  120.         end
  121.         if marketposition<0
  122.             if close(end)>s(j).openprice*(1+0.01*k)
  123.                 traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
  124.             end
  125.         end
  126.     end        
  127. end
  128. end
  129. %----------------------自定义函数-------------------------------%

  130. function value=emdtvalue(r) % 经验模态分解的迭代函数
  131.     MaxIndex = find(diff(sign(diff(r)))==-2)+1;
  132.     MaxValue = r(MaxIndex);
  133.     MinIndex = find(diff(sign(diff(r)))==+2)+1;
  134.     MinValue = r(MinIndex);
  135.     PPupper = csape(MaxIndex,MaxValue,'variational');
  136.     PPlower = csape(MinIndex,MinValue,'variational');
  137.     x = 1:length(r);
  138.     value = r-0.5*(ppval(PPupper,x)+ppval(PPlower,x))';
  139. end
复制代码


执行代码
  1. targetList(1).Market = 'CFFEX';
  2. targetList(1).Code = 'IF0000';

  3. % 参数设置
  4. Freq = 1;
  5. ShareNum = 10;
  6. len = 100;
  7. mlen = 40;
  8. k = 1;
  9. k2 = 1;

  10. global s;
  11. for i = 1:length(targetList) % 初始化全局变量
  12.     s(i).openprice = 0;
  13.     s(i).daynum = 0;
  14.     s(i).R = 0;
  15.     s(i).bh = 0;
  16.     s(i).br = 0;
  17.     s(i).sh = 0;
  18.     s(i).sr = 0;
  19.     s(i).tt = 0;
  20.     s(i).trend = 0;
  21. end

  22. %回测
  23. AccountList(1) = {'FutureBackReplay'};
  24. traderRunBacktest('EMDT2BackTest',@EMDT2,{Freq,ShareNum,len,mlen,k,k2},AccountList,targetList,'min',Freq,20140101,20161020,'FWard');
复制代码



20141203-广发证券-另类交易策略系列之十九:带反转的加强版EMDT交易策略.pdf

1.01 MB, 下载次数: 77, 下载积分: 贝壳 -1

签到天数: 1 天

[LV.1]初来乍到

发表于 2017-3-7 00:56:57 | 显示全部楼层
谢谢分享!感觉非常好!虽然我是个半路出家的期货新手,零基础!爆仓破产,但就如这个说的life is like a box of chocolates,you never know which one you will get.
but i am sure if you were always there, you will finally get the chocolates you wanted!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-6-5 21:02:11 | 显示全部楼层
请问一下楼主和各路大神,请问楼主发出来的这几张图是用的matlab回测?我平时用的plot画的图跟这完全不同风格啊?如果是matlab加上其他的回测平台,麻烦告知一下,谢谢~
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-5-18 17:47:06 | 显示全部楼层
请问traderRunBacktest是您自己搭的一个回测框架么,请问愿不愿意分享您的逻辑?我自己也一直想做一个回测框架
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-10-21 12:37:32 | 显示全部楼层
回复求看代码!!策略效果太好了~~!!
回复 支持 反对

使用道具 举报

签到天数: 49 天

[LV.5]常住居民I

发表于 2016-10-21 16:52:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-10-22 00:43:24 | 显示全部楼层
BUCUOBUCUO
回复 支持 反对

使用道具 举报

签到天数: 1 天

[LV.1]初来乍到

发表于 2016-10-23 15:55:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-1 20:51:31 | 显示全部楼层
经验模态分解在股指期货中的实现 [修改] 谢谢老板
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-2 10:03:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-2 11:15:07 | 显示全部楼层
尝试着应用到大宗商品期货,看看效果如何,谢谢楼主的分享
回复 支持 反对

使用道具 举报

签到天数: 81 天

[LV.6]常住居民II

发表于 2016-11-12 18:15:19 | 显示全部楼层
谢谢楼主的无私分享
回复 支持 反对

使用道具 举报

签到天数: 65 天

[LV.6]常住居民II

发表于 2016-11-16 17:14:57 | 显示全部楼层
学习一下,谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 陕ICP备08102094号  

GMT+8, 2018-7-22 14:51 , Processed in 0.127055 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表