FAQ > 金融建模 > 建模及平台使用中遇到的问题 > 股票相关

Q:Alpha101因子的数据提取    

  • A:FAQ:2018-12-06-应用专题-数据提取专题07:101alpha因子值的快速提取
    说明:通过上面的专题说明文档用户可以了解到,天软目前提供两种方式得到101因子值。一种是通过函数的计算,另一种是提取天软已经计算好的因子值,我们叫快速提取的方式。
    其中,函数计算的方式是对101因子的封装实现,该类函数与证券,时间,证券组合(排名相关等),周期,复权等相关,用户在使用时可根据需求进行设置。
    而快速提取的方式是在固定的周期(日线)、证券组合(一定条件下过滤后的A股)、复权(指定日为基准向前复权)条件下(具体条件请参考专题文档中的5.1 入库规则),计算的证券组合中各个股票的各因子值,天软将这些因子值在每天收盘之后计算入库,用户通过快速提取的方式就可以直接从库中取到各个票的因子值。
    PS:1、用户请注意两种方式的区别,根据自己的需求进行选择。
        3、快速提取方式的数据更新具体请查看专题文档说明
        2、若需要对两种方式的结果进行对比,可参考范例3。

    异常因子值理解:
    1、    股票在指定日停牌时,因子值返回NAN
    2、    因子中涉及到相关系数的计算的,若在N日内股票存在停牌,则返回NAN
    3、    因子中价格在N日内排名每日都一样时,相关系数会返回NAN
    4、    其他侍补充
    范例1:快速提取因子值

    setsysparam(pn_stock(),'SZ000002');
    setsysparam(pn_date(),20190621T);
    SetSysParam(PN_Cycle(),cy_day());
    ID1:=1;
    ID2:=2;
    return nday(100,'date',datetostr(sp_time()),
                       'alpha'$ID1,Get101alphaByID(ID1),
                       'alpha'$ID2,Get101alphaByID(ID2));

    范例2:通过函数计算因子值-指定日沪深300中各个股票的因子值

        BkArr:=getbk('沪深300');
        Endt:=20190621T;
        setsysparam(pn_StockArr(),BkArr); //必须写    
        SetSysParam(PN_Cycle(),cy_day());
        SetSysParam(PN_Rate(),1);
        SetSysParam(PN_RateDay(),Endt);
        Setsysparam(pn_date(),Endt);//指定日
        r:=array();
        for i:=0 to length(BkArr)-1 do
        begin
           StockId:=BkArr[i];
           SetSysParam(PN_Stock(),StockId);
           r[i]['代码']:=StockId;
           r[i]['名称']:=StockName(StockId);
           r[i]['Alph002']:=OHO_Alpha_002();
           r[i]['Alph003']:=OHO_Alpha_003();
            //其他的模型类似的调用方法,如:OHO_Alpha_xxx,其中 xxx 为对应的序号
            //r[i]['Alph00N']:=OHO_Alpha_xxx();
        end
        return r;

    范例3:通过函数得到快速提取的因子值的计算结果

       d:=20190605T;
       alphaFuns:=1->5;
       alphaFuns ::= 'OHO_Alpha_' + FormatFloat('000', mcell);
       SetSysParam(PN_Cycle(),cy_day());
       SetSysParam(PN_Date(), d);
       SetSysParam(PN_Rate(),1);
       SetSysParam(PN_RateDay(),d);
          //样本股
       stocks:=GetAbkbydate("上证A股;深证A股;中小企业板;创业板",d);
       stocks:=Sselect thisrow
                   from stocks where
                      spec(istradeday(d)  and
                         StockGoMarketTradeDays()>240,thisrow)
                      end;
       SetSysParam(pn_StockArr(),stocks);
       r:=array();
       strd:=datetostr(d);
       for i:=0 to length(stocks)-1 do
       begin
          stockid:=stocks[i];
          SetSysParam(pn_stock(),stockid);
          r[i,"证券代码"]:=StockID;
          r[i,"证券名称"]:=stockname(stockid);
          r[i,"截止日"]:=strd;
          for j:=0 to length(alphaFuns)-1 do
          begin
             alphaFun := alphaFuns[j];
             r[i,alphaFun] := call(alphaFun);
          end
       end
       return r;

    范例3函数:
    附件:alpha101_YSToDB_Demo.fun