(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提供回测报告)
策略源码:
- function Alpha12(len,len1,len2,num)
- % alpha#12
- % num 选股数量
- targetList = traderGetTargetList();
- HandleList = traderGetHandleList();
- global s;
- global daynum;
- n = length(targetList);
- [BarNumber,~,~,~,~,~,~,~,~] = traderGetCurrentBar(targetList(1).Market,targetList(1).Code);
- if(BarNumber==1)
- daynum = 1;
- end
- [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 1-BarNumber, 0,true,'FWard');
- newday = 0;
- if daynum<length(Dclose)
- daynum = daynum+1;
- newday = 1;
-
-
- end
- if daynum<len+1
- return
- end
- if newday==1 && mod(daynum,len1)==0 % 调仓日的第一根bar
- % 读取数据
- for j = 1:n-1
- [~,open,high,low,close,volume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-len, 0,true,'FWard');
- if length(close)<len+1
- s(j).alpha = -1000;
- end
- if length(close)==len+1
- temp = volume(end-1)-volume(end-2);
- if temp>=0
- s(j).alpha = close(end-2)-close(end-1);
- end
- if temp<0
- s(j).alpha = close(end-1)-close(end-2);
- end
- end
- if volume(end)==0
- s(j).alpha = -1000;
- end
- [s(j).position,~,~] = traderGetAccountPosition(HandleList(1),targetList(j).Market,targetList(j).Code); % 仓位
- end
- [~,MarketCap,~,~,~] = traderGetAccountInfo(HandleList);
- [~,~,Multiple,~,~,~,~,~,~] = traderGetFutureInfo(targetList(n).Market,targetList(n).Code);
- Stock_flow = ((MarketCap)*0.4)/num; % 每只股票分配的资金
-
- % 选股
- X = zeros(n-1,1);
- for i = 1:n-1
- X(i) = -s(i).alpha;
- end
- [~,I] = sort(X);
- SelectedID = I(1:num); % 选出alpha最大的一组股票
-
- % 初始开仓
- if daynum==11
- for j = 1:n-1
- if ismember(j,SelectedID)==1
- [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
- if Dvolume(end)~=0
- shareNum = 100*floor((Stock_flow/Dclose(end))/100);
- OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
- if OrderID~=0
- s(j).openprice = Dclose(end);
- s(j).entryday = daynum;
- else
- % daynum
- % disp(['error:Code=',targetList(j).Code]);
- end
- end
- end
- end
- % 期货对冲开仓
- [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 0-1, 0,true,'FWard');
- shareNum = floor((Stock_flow*num)/Multiple/Dclose(end));
- traderPositionTo(HandleList(2),targetList(n).Market,targetList(n).Code,-shareNum,0,'market','close');
- end
-
- %大调仓
- if mod(daynum,len2)==0
- % 股票调仓,先出后入
- success = 0; % 成功卖出的笔数
- for j = 1:n-1
- if s(j).position>0
- if ismember(j,SelectedID)==0
- OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,0,0,'market','close');
- if OrderID~=0
- s(j).openprice = 0;
- s(j).entryday = 0;
- success = success+1;
- end
- end
- if ismember(j,SelectedID)==1
- [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
- if Dvolume(end)~=0
- shareNum = 100*floor((Stock_flow/Dclose(end))/100);
- OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
- if OrderID~=0
- s(j).openprice = Dclose(end);
- s(j).entryday = daynum;
- else
- % daynum
- % disp(['error:Code=',targetList(j).Code]);
- end
- end
- end
- end
- end
- for j = 1:n-1
- if s(j).position==0 && success>0
- if ismember(j,SelectedID)==1
- [~,~,~,~,Dclose,Dvolume,~,~] = traderGetKData(targetList(j).Market,targetList(j).Code,'day',1, 0-1, 0,true,'FWard');
- if Dvolume(end)~=0
- shareNum = 100*floor((Stock_flow/Dclose(end))/100);
- OrderID=traderPositionTo(HandleList(1),targetList(j).Market,targetList(j).Code,shareNum,0,'market','close');
- if OrderID~=0
- s(j).openprice = Dclose(end);
- success = success-1;
- s(j).entryday = daynum;
- else
- % daynum
- % disp(['error:Code=',targetList(j).Code]);
- end
- end
- end
- end
- end
- % 期货对冲调仓
- [~,~,~,~,Dclose,~,~,~] = traderGetKData(targetList(n).Market,targetList(n).Code,'day',1, 0-1, 0,true,'FWard');
- shareNum = floor((Stock_flow*num)/Multiple/Dclose(end));
- traderPositionTo(HandleList(2),targetList(n).Market,targetList(n).Code,-shareNum,0,'market','close');
- end
- end
更多免费策略源码下载请登录DigQuant社区-策略资源下载~