楼主: yang-cy13
6188 8

[源码分享] 【源码分享】WorldQuant 101 alpha#12的matlab实现 [推广有奖]

  • 0关注
  • 6粉丝

初中生

71%

还不是VIP/贵宾

-

威望
0
论坛币
57 个
通用积分
1.0019
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
501 点
帖子
12
精华
0
在线时间
15 小时
注册时间
2016-10-9
最后登录
2019-1-6

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在 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

在atrader上回测,权益曲线如下:
123.jpg

策略代码如下:
  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');
复制代码




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:matlab实现 MATLAB atlab quant Alpha 研究报告 阿尔法 对冲基金 matlab volume

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
fantuanxiaot + 33 + 33 精彩帖子

总评分: 经验 + 133  论坛币 + 33  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
3862161 在职认证  发表于 2016-11-11 17:33:12 |只看作者 |坛友微信交流群

使用道具

藤椅
seven_eleven77 发表于 2016-11-11 17:34:37 |只看作者 |坛友微信交流群
厉害!!好复杂的策略!!

使用道具

板凳
Crsky7 发表于 2016-11-11 17:42:00 |只看作者 |坛友微信交流群
策略不复杂,然而确实屌

使用道具

报纸
yang-cy13 发表于 2016-11-11 17:47:48 |只看作者 |坛友微信交流群
seven_eleven77 发表于 2016-11-11 17:34
厉害!!好复杂的策略!!
只是实现了一些已有的研究成果,大家一起交流学习{:2_31:}

使用道具

地板
wolfgang_1983 发表于 2017-1-20 15:56:25 |只看作者 |坛友微信交流群
楼主,求101全套,求分享,开个价哈,论坛币。

使用道具

7
seanlee91 发表于 2017-5-9 15:24:14 |只看作者 |坛友微信交流群
感谢楼主分享

使用道具

8
ghjktdf 发表于 2017-5-18 16:17:50 |只看作者 |坛友微信交流群
厉害了

使用道具

9
donggua107 发表于 2018-8-7 10:23:57 |只看作者 |坛友微信交流群
想问一下楼主,60之后的alpha中经常出现小数天数,请问应该如何理解呢?

使用道具

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

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 22:54