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

daynum = daynum+1;

newday = 1;

end

if daynum

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)

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

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐