FAQ > 金融建模 > 应用案例 > 指标或功能实现

Q:如何对一组股票因子值数据进行行业中性化与市值中性化处理?    

  • 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;

    返回结果: