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;

    返回结果: