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

Q:在多因子框架中如何传递自定义变量给因子公式模型    

  • A:
     在获取指定日期指标值(多因子)模型TSMF_GetValueByEndT中存在spc_参数可以传递指定变量给因子公式。
     以spc_:=array('变量名':值)的形式传入,
     比如:spc_:=array('a':100),则因子公式可以为zbgs := 'stockzf4(EndT)/a'。
     通过重写多因子模型的CalCulateFactorValueByEndT方法,修改TSMF_GetValueByEndT模型的spc_参数传递变量给因子公式。

    范例:在多因子模型中传递指数代码给因子公式
    执行代码:

      obj:=CreateObject('MyFactorclass');
      obj.FBegT:= 20121212T;
      obj.FEndT:= Today()-1;
      obj.FIndexId:='SH000016';
      obj.FCycle:=cy_month();
      obj.FFactorArr:=array(("因子名称":"my_pe","因子公式":"1/stockpe(EndT)","因子方向":1,"因子比例(%)":50),
                 ("因子名称":"my_zf","因子公式":"my_stockzf(incmonth(endt,-1)+1,endt,index)","因子方向":1,"因子比例(%)":50));
      //初始化传参变量
      obj.Fspc_:=array();

      FGridComputing:=true; //网格计算
      FGridNo:=3;      //网格数
      obj.BackTest();
      return array(
             '调仓日':obj.GetTimeSeries(),
             '所有调仓日因子值及分组':obj.GetGroupFactorValue(),
             '-----收益率-----':'-----------',
             '日累计收益率(%)':obj.GetGroupReturn(1,cy_day()),
             '日累计超额收益率(%)':obj.GetGroupReturn(3,cy_day()),
             '月度收益率(%)':obj.GetGroupReturn(0,cy_month()),
             '月度超额收益率(%)':obj.GetGroupReturn(2,cy_month()),
             '多空月度收益率(%)':obj.GetGroupReturn(4,cy_month()),
             '-----因子检验-----':'-----------',
             '因子收益率检验':obj.GetTrailingReturn(cy_month()),
             '因子显著性检验':obj.GetSignificanceStatistics(cy_month()),
             '因子区分度检验':obj.GetLongShortStatistics(cy_month()),
             '因子延续性检验':obj.GetInformationCoefficient(),
            );

    继承重写类方法:

    Type MyFactorclass=class(TSMultiFactor)
      Fspc_;//传参变量
     
      Function GetSamples(EndT);override;
      begin
       //动态传参
    //若与日期相关,可以在这里传递,若与日期无关,也可以在赋初值那里传递。
       Fspc_&=array("index":FIndexId);


       r:= GetBKByDate(FIndexId,EndT);
       return r;
      end;

      function CalCulateFactorValueByEndT(Stocks,Factors,EndT);virtual;
      begin
       cal_option := array('not_rdate':config_Get('not_rdate'));
       If FGridComputing Then
       Begin
         gridNo := FGridNo;        //网格个数,0:表示只使用本地服务器
         func := 'TSMF_GetValueByEndT';  //网格函数
         parms := array(Stcks[:,'代码'],Factors,EndT,FConStr,FIsTradeDay,nil,Fspc_,cal_option);

         parmstype := array(1, 0, 0, 0, 0, 0);
         sysparam := Array(pn_Stockarr():Stcks[:,'代码']);

         Data := unit(MultiProc_unit).fastmap(gridNo,func,parms,parmstype,sysparam,nil,2); //主网格不参与计算
       End
       Else Data:=TSMF_GetValueByEndT(Stocks[:,'代码'],Factors,EndT,FConStr,FIsTradeDay,nil,Fspc_,cal_option);

       Return Data;
      end
    End


    因子公式模型:

    Function my_stockzf(begt,endt,index);
    Begin
    {
      说明:区间涨幅:个股涨幅-指数涨幅
      begt:Tdatetime 开始日
      endt:Tdatetime 截止日
    }

      return StockZf(begt,endt)-spec(stockzf(begt,endt),index);
    End;

    返回结果: