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;
返回(显示保留五位小数的结果):