楼主: 挖矿专家
2801 7

[源码分享] 【每日一策】Matlab量化交易策略之 WorldQuant 101 alpha#12 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

威望
0
论坛币
2016 个
通用积分
5.2622
学术水平
21 点
热心指数
21 点
信用等级
21 点
经验
6055 点
帖子
403
精华
0
在线时间
151 小时
注册时间
2017-2-8
最后登录
2017-6-27

相似文件 换一批

+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

回测曲线(由Auto-trader提供回测报告)

WorldQuant 101 alpha#12.png


策略源码:

  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
复制代码

更多免费策略源码下载请登录DigQuant社区-策略资源下载~



二维码

扫码加我 拉你入群

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

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


已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 66 + 66 精彩帖子

总评分: 经验 + 66  论坛币 + 66   查看全部评分

沙发
ghjktdf 发表于 2017-4-18 11:40:01 |只看作者 |坛友微信交流群
感谢分享

使用道具

藤椅
挖矿专家 发表于 2017-4-26 10:34:03 |只看作者 |坛友微信交流群
ghjktdf 发表于 2017-4-18 11:40
感谢分享
感谢支持

使用道具

板凳
ghjktdf 发表于 2017-6-12 10:07:39 |只看作者 |坛友微信交流群

使用道具

报纸
挖矿专家 发表于 2017-6-13 20:13:09 |只看作者 |坛友微信交流群
大家一起学习

使用道具

地板
玻璃晴朗 学生认证  发表于 2019-5-16 11:43:38 来自手机 |只看作者 |坛友微信交流群
挖矿专家 发表于 2017-4-12 15:21
在 2015 年 9 月份公布的《 WorldQuant Formulaic 101 Alphas 》研究报告中,对冲基金 WorldQuant给出了 10 ...

使用道具

7
玻璃晴朗 学生认证  发表于 2019-5-16 11:43:57 来自手机 |只看作者 |坛友微信交流群
挖矿专家 发表于 2017-4-12 15:21
在 2015 年 9 月份公布的《 WorldQuant Formulaic 101 Alphas 》研究报告中,对冲基金 WorldQuant给出了 10 ...
不过代码在哪呀

使用道具

8
_wallstreetcat_ 企业认证  发表于 2019-5-22 18:45:59 |只看作者 |坛友微信交流群
感谢楼主分享,感兴趣的朋友可以看下这篇《WorldQuant 101 Alpha因子构建及因子测试》,对因子进行了复现,大家可以一起交流学习。

使用道具

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

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

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

GMT+8, 2024-4-24 12:04