A:
1、天软目前有提供对股票因子表达式进行【行业中性化】处理的模型
具体模型为:FAQ:
IndNeutralize
用法示例如:
SetSysParam(pn_stock(),"SH600519");
SetSysParam(Pn_date(),20231010T);
setsysparam(pn_StockArr(),getbkbydate("SH000300",20231010T));
return IndNeutralize(@StockPE3(0),1,"");
其中:
1、@StockPE3(0)即为因子表达式,也可以是用户的因子公式模型,写法为@functioname(p1,p2,...)
2、系统参数pn_StockArr()的设置则为指定样本池,即对指定池子中的样本按行业分组进行中性化处理。
3、第二个参数为1,表示按申万一级行业分类进行行业中性化处理。
4、第三个参数为字符串,功能为缓存标志,为空表示不做缓存处理。
缓存即为将样本池各股中性化后的中间结果进行缓存处理,在计算相同设置,多个股票中性化结果时可以提速,避免重复计算。
5、返回当前指定股票(SH600519)在指定日(20231010T)行业中性化后的因子结果4.46
返回沪深300每个成份股的行业中性化后的结果,实现方式如下:
Endt:=20231010T;
SetSysParam(Pn_date(),Endt);
stocks:=getbkbydate("SH000300",Endt);
setsysparam(pn_StockArr(),stocks);
ret:=array();
for i,stockid in stocks do
begin
SetSysParam(pn_stock(),stockid);
v:=IndNeutralize(@StockPE3(0),1,"SPE3_"$Endt);//使用缓存标志提速
ret[i]:=array("StockID":stockid,"V":v);
end
return ret;
2、对因子数据进行行业中性+市值中性处理
//样本因子数据示例
endt:=20250103T;
setsysparam(pn_date(),endt);
data := `array("代码":getbkbydate("SH000300",endt));
update data set ["市盈率"] = spec(StockPE3(0),['代码']) end;
update data set ["lnmv"]=spec(ln(StockMarketValue(endt)),['代码']) end;
update data set ["hy"]=spec(StockSWIndustryID1(),['代码']) end;
//行业+市值
a_ := data[:,'hy'];
ak := a_ union2 array();
ak := array(0,1,ak)->(length(ak)-1);
dd:=Zeros(length(data),length(ak));
for key, v in a_ do
dd[key, ak[v]] := 1;
r2 := dd;
r3 := data[:,'lnmv'];
y:=data[:,'市盈率'];
x:=r2|r3;
T:=length(y);
x0:=ones(T) | x;
Y0:=`y;
B := X0:\Y0;
u0:=Y0-X0:*B;
u:=u0[:][0]; //残差
return data[:,'代码']|u;
返回结果:
