FAQ > 金融建模 > 应用案例 > 多因子

Q:多因子中如何重写缺失值处理方式?    

简述
在多因子框架中,对于因子的缺失,已经提供一些常用的处理方式,如:
缺失值:-1 不处理  0 剔除 1 均值填充  2 中位数填充
除这些外,用户若还想其它处理方式,如最小值替代等,则需要重写FillMissData
  • A:下面主要展示如何实现对缺失值进行用最小值的处理,主供参考实现方法:
     obj := CreateObject('TMyMultiFactor');

       //回测开始日&截止日&基准
      obj.FBegT := 20240101T;
      obj.FEndT := 20240830T;
      obj.FIndexId := 'SH000905';
      obj.FCycle:=cy_month();
     obj.FFactorArr := array(
    ("因子名称":"my因子","因子公式":"myFactor_nil2(Rdate)","因子方向":0,"因子比例(%)":40),
    ("因子名称":"每股收益","因子公式":"Last12MData(RDate,9900000)","因子方向":1,"因子比例(%)":60));

     obj.BackTest();

      //得到因子值和分组数据 --只返回分组的部分
     return obj.GetGroupFactorValue();


    Type TMyMultiFactor=class(TSMultiFactor)

       //得到调仓日T的初始样本
      Function GetSamples(vEndT);override;
      begin
       r:=GetABKByDate('上证A股',vEndT);
       return r;
      end;
    //重写缺失值处理接口FillMissData
      function FillMissData(Data,Factors,index);override;
      begin
       //index记录处理后的结果在源data中的行标位置-此方式中未做踢除处理,所以保持原数组下标不变
       index := mrows(data,1);
       //用最小值替代缺失值
       minv:= MinValue(data,0);
       ret:=data;
       ret::=ifnumber(mcell)?mcell:minv[mcol];
       return ret;
      end;
    end

    返回的因子值及分组情况如下,可以看出,"my因子"为nil时,缺失处理后用最小值进行了替代。