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

MATLAB技术论坛

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

[源码] WorldQuant 101 alpha#12的matlab实现

[复制链接]

该用户从未签到

发表于 2016-11-11 17:15:40 | 显示全部楼层 |阅读模式
本帖最后由 Masque 于 2016-11-11 17:17 编辑

在 2015 年 9 月份公布的《 WorldQuant Formulaic 101 Alphas 》研究报告中,对冲基金 WorldQuant给出了 101 个阿尔法表达式,其中80%仍然在实盘中使用。alpha#12的表达式如下:
(sign(delta(volume, 1)) * (-1 * delta(close, 1)))
这是一个混合型策略,分析可得:
若今日交易量大于昨日交易量,alpha等于昨日收盘价减今日收盘价,此时alpha#12为均值回归型策略
若今日交易量小于昨日交易量,alpha等于今日收盘价减昨日收盘价,此时alpha#12为趋势跟踪型策略

策略框架如下:
1、        用日线的量价信息算出沪深300中每一个股票在每一个交易日对应的alpha值
2、        每个交易日,选取alpha最大的10%股票作为当日的股票池
3、        每只股票在投资组合的权重按等额分配,并用IF0000等市值对冲
4、        时间区间为2015/01/01到2016/09/20

权益曲线:
123.jpg

在atrader上回测,策略代码如下:
  1. function Alpha12(len,len1,len2,num)

  2. % alpha#12
  3. % num 选股数量


  4. targetList = traderGetTargetList();
  5. HandleList = traderGetHandleList();

  6. global s;
  7. global daynum;
  8. n = length(targetList);

  9. [BarNumber,~,~,~,~,~,~,~,~] = traderGetCurrentBar(targetList(1).Market,targetList(1).Code);
  10. if(BarNumber==1)
  11.     daynum = 1;
  12. end

  13. [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 1-BarNumber, 0,true,'FWard');
  14. newday = 0;
  15. if daynum<length(Dclose)  
  16.     daynum = daynum+1;
  17.     newday = 1;
  18.    
  19.    
  20. end
  21. if daynum<len+1
  22.     return
  23. end

  24. if newday==1 && mod(daynum,len1)==0 % 调仓日的第一根bar
  25.     % 读取数据
  26.     for j = 1:n-1
  27.         [~,open,high,low,close,volume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-len, 0,true,'FWard');
  28.         if length(close)<len+1
  29.             s(j).alpha = -1000;
  30.         end
  31.         if length(close)==len+1
  32.             temp = volume(end-1)-volume(end-2);
  33.             if temp>=0
  34.                 s(j).alpha = close(end-2)-close(end-1);
  35.             end
  36.             if temp<0
  37.                 s(j).alpha = close(end-1)-close(end-2);
  38.             end
  39.         end
  40.         if volume(end)==0
  41.             s(j).alpha = -1000;
  42.         end
  43.         [s(j).position,~,~] = traderGetAccountPosition(HandleList(1),targetList(j).Market,targetList(j).Code); % 仓位
  44.     end
  45.     [~,MarketCap,~,~,~] = traderGetAccountInfo(HandleList);
  46.     [~,~,Multiple,~,~,~,~,~,~] = traderGetFutureInfo(targetList(n).Market,targetList(n).Code);
  47.     Stock_flow = ((MarketCap)*0.4)/num; % 每只股票分配的资金
  48.    
  49.     % 选股
  50.     X = zeros(n-1,1);
  51.     for i = 1:n-1
  52.         X(i) = -s(i).alpha;
  53.     end
  54.     [~,I] = sort(X);
  55.     SelectedID = I(1:num); % 选出alpha最大的一组股票
  56.    
  57.     % 初始开仓
  58.     if daynum==11
  59.         for j = 1:n-1
  60.             if ismember(j,SelectedID)==1
  61.                 [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
  62.                 if Dvolume(end)~=0
  63.                 shareNum = 100*floor((Stock_flow/Dclose(end))/100);
  64.                 OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
  65.                 if OrderID~=0
  66.                     s(j).openprice = Dclose(end);
  67.                     s(j).entryday = daynum;
  68.                 else
  69. %                     daynum
  70. %                     disp(['error:Code=',targetList(j).Code]);
  71.                 end
  72.                 end
  73.             end
  74.         end
  75.         % 期货对冲开仓
  76.         [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 0-1, 0,true,'FWard');
  77.         shareNum = floor((Stock_flow*num)/Multiple/Dclose(end));
  78.         traderPositionTo(HandleList(2),targetList(n).Market,targetList(n).Code,-shareNum,0,'market','close');
  79.     end
  80.         
  81.     %大调仓
  82.     if mod(daynum,len2)==0
  83.         % 股票调仓,先出后入
  84.         success = 0; % 成功卖出的笔数
  85.         for j = 1:n-1
  86.             if s(j).position>0
  87.                 if ismember(j,SelectedID)==0
  88.                     OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
  89.                     if OrderID~=0
  90.                         s(j).openprice = 0;
  91.                         s(j).entryday = 0;
  92.                         success = success+1;
  93.                     end
  94.                 end
  95.                 if ismember(j,SelectedID)==1
  96.                     [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
  97.                     if Dvolume(end)~=0
  98.                     shareNum = 100*floor((Stock_flow/Dclose(end))/100);
  99.                     OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
  100.                     if OrderID~=0
  101.                         s(j).openprice = Dclose(end);
  102.                         s(j).entryday = daynum;
  103.                     else
  104. %                         daynum
  105. %                         disp(['error:Code=',targetList(j).Code]);
  106.                     end
  107.                     end
  108.                 end
  109.             end
  110.         end
  111.         for j = 1:n-1
  112.             if s(j).position==0 && success>0
  113.                 if ismember(j,SelectedID)==1
  114.                     [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
  115.                     if Dvolume(end)~=0
  116.                     shareNum = 100*floor((Stock_flow/Dclose(end))/100);
  117.                     OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
  118.                     if OrderID~=0
  119.                         s(j).openprice = Dclose(end);
  120.                         success = success-1;
  121.                         s(j).entryday = daynum;
  122.                     else
  123. %                         daynum
  124. %                         disp(['error:Code=',targetList(j).Code]);
  125.                     end
  126.                     end
  127.                 end
  128.             end
  129.         end
  130.         % 期货对冲调仓
  131.         [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 0-1, 0,true,'FWard');
  132.         shareNum = floor((Stock_flow*num)/Multiple/Dclose(end));
  133.         traderPositionTo(HandleList(2),targetList(n).Market,targetList(n).Code,-shareNum,0,'market','close');
  134.     end
  135. end
复制代码

执行代码如下:
  1. clc;
  2. clear all;
  3. targetList01 = traderGetCodeList('HS300');
  4. n = length(targetList1);

  5. for i = 1:n
  6.     targetList(i).Market = targetList1(i).Market;
  7.     targetList(i).Code = targetList1(i).Code;
  8. end
  9. targetList(n+1).Market = 'CFFEX';
  10. targetList(n+1).Code = 'IF0000';

  11. Freq = 60;
  12. len = 10;
  13. len1 = 1;
  14. len2 = 1;
  15. k = 1;
  16. num = 30;

  17. AccountList(1) = {'StockBackReplay'};
  18. AccountList(2) = {'FutureBackReplay'};
  19. traderRunBacktest('Alpha12BackTest',@Alpha12,{len,len1,len2,num},AccountList,targetList,'min',Freq,20150101,20160920,'FWard');
复制代码



该用户从未签到

发表于 2017-11-30 20:04:41 | 显示全部楼层
hgsahdasda ooo  gooda
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-4-11 09:07:41 | 显示全部楼层
在atrader上回测,策略代码如下:
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-8-2 14:01:46 | 显示全部楼层
谢谢楼主了,真的太需要这个了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-11 17:21:35 | 显示全部楼层
厉害了,这个策略~~
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-11-12 13:34:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

签到天数: 1 天

[LV.1]初来乍到

发表于 2016-11-12 16:06:48 | 显示全部楼层
厉害了,这个策略
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-12-8 09:44:37 | 显示全部楼层
学习学习再学习
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2016-12-10 21:01:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-1-4 19:55:52 | 显示全部楼层
策略看起来不错
回复 支持 反对

使用道具 举报

签到天数: 1 天

[LV.1]初来乍到

发表于 2017-1-7 16:25:17 | 显示全部楼层
看一看,谢谢~
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2017-2-19 11:02:11 | 显示全部楼层
谢谢分享,学习学习
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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