FAQ > 金融建模 > 建模问题 > 股票相关

Q:怎么取股票复权因子    

  • A:天软行情数据中,提供了复权与不复权的行情数据,复权因子可以通过取复权与不复权之后的价格进行计算得到,也可以用分红送股与配股数据计算而来(但像万科A这类上市过于历史的票会有失真,数据不够完整导致,无法避免),本案例中,通过分红送股表与配股表确定除权日,再按交易所发送的除权后的昨收(系统昨收)与实际昨收计算复权比例进行累乘得到,具体如下:

    说明:以上市日为复权基准日,向后复权,得到指定日比例复权方式的复权因子值,即复权方式为1。

    操作:将下面附件下载后导为用户函数使用
    参考函数:附件:复权因子.tslfunc
    算法:
      其中:n为该票上市日到当前时间内发生的分红送股/配股的次数
         sysyClose:表示第i次发生变动时的系统昨收(交易所发送的除权后的昨收)
         yClose:表示第i次发生变动时的实际昨收
       若n=0,则返回1。

    调用该函数需注意设置当前股票和当前时间。
    范例:

    //取SH603117在20180701日的复权因子值
      setsysparam(PN_Stock(),'SH603117');
      setsysparam(pn_date(),20180701T);
      return AuthorityFactor();


    //取SH603117在20170701日到20180701日的复权因子值
      begt:=20170201T;
      endt:=20180701T;
      setsysparam(PN_Stock(),'SH603117');
      setsysparam(pn_date(),endt);
      N:=tradedays(begt,endt);
      return Nday(N,'date',datetostr(sp_time()),"复权因子",AuthorityFactor());


      //取多个票在指定日的复权因子值
      setsysparam(pn_date(),20180701T);
      stocks:=getbk("上证50");
      return select thisrow as 'StockID',
         spec(AuthorityFactor(),thisrow) as '复权因子'
         from stocks end;


    取多个票在一段时间内每日的复权因子值,可参考指标取数范例进行套用:FAQ:Q:取数Demo-取一段时间内多个股票的指标值

    复权因子应用范例:

    //SH603117在20191112日后复权后的价格。
      setsysparam(pn_stock(),'SH603117');
      setsysparam(pn_date(),20191112T);
      return close()/AuthorityFactor();
    //返回:5.31061971955029


    行情数据计算比例复权的后复权因子实现范例:
    特别的,若用户不想导入上面的函数包,也可以通过下面这种方式进行计算得到(完全依赖行情数据),不过效率相对而言会比较低一些,且必须从上市日开始计算,后复权的复权因子实现如下:


    //后复权因子
      stockid:="SH601058";
      setsysparam(pn_stock(),stockid);
      fd:= firstday(); //上市日
      endt:=20150101T;
      setsysparam(pn_date(),endt);
      N:=tradedays(fd,endt);
      t0:=array(("date":datetostr(fd),"单次复权":1)); //初值
      t1:= Nday(N-1,'date',datetostr(sp_time()),
             '单次复权', sys_prevclose()/ref(close(),1));
      t:= t0 union t1;
      return select *,Productof(['单次复权'],1,N) as '复权因子' from t end;


    返回(显示保留五位小数的结果):