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;
返回结果: