FAQ > 金融建模 > 数据提取 > 基本面数据

Q:财务数据提取时pn_ReportMode()与pn_date()对数据结果的影响    

  • A:在天软取财务数据的过程中,pn_ReportMode()与pn_date()发挥着重要作用。
      由于股票的定期报告数据存在调整的情况,所以产生了在不同的公布日记录着同一报告期的财务数据的情况。天软数据中,用截止日、数据报告期、公布日来分别记录着这些数据。
      一般而言,用户需要在不同的时间点提取截止到该时间点最新的财务数据进行相关指标的计算,则用pn_date()进行控制;
      而用户在提取整表财务数据时,若只需要调整前或调整后的数据时,则用pn_ReportMode()进行控制。

    两者具体的逻辑判定如下:
    1、天软财务数据有三个关键日期:
    截止日:表示该条数据代表的是具体哪个报告期的数据
    数据报告期:该条数据是在哪个公告文件中公布的,即数据采集自哪个报告
    公布日:该条数据是上市公司在哪一天公布的

    2、数据层上简单理解调整前与调整后:
    调整前:截止日=数据报告期,比如在2017年年报文件中公布了20171231的数据,则该条数据属于调整前
    调整后:截止日<数据报告期,比如,在2018年年报文件中重新调整了20171231的数据,则该条数据属于调整后
    特别说明:若公布日大于调整后的数据,记录的数据报告期也等于截止日,则也认为是调整后的数据,一般这类报告属于对历史已经过的报告进行重新更正。

    3、setsysparam(pn_date(),Endt):
    该种用法旨在取在Endt日能取到的数据

    4、setsysparam(pn_ReportMode(),rM):
    当存在调整情况时,是取调整前,还是调整后的,或者是所有的

    5、当pn_date()与setsysparam(pn_ReportMode(),rM)结合使用时:
    对取表格与字段的情景影响如下:
    其中,rM指pn_ReportMode()设置的值
      表格即取整个数据表格的记录,比如Infoarray/infotable
      字段,即取指定报告期的字段值,比如report/reportofall
    情景    rM    表格    字段

    全部数据
    -1所有公布过的财务数据(即,一个报告期可能多条记录)
    1、取公布日<=Endt的最新的数据
    2、若1无数据,则取调整前

    调整后
    0(默认值)
    满足条件(一个报告期一条记录):
    1、公布日<=Endt
    2、同一报告期同一报告期多条数据时,取公布日最大一条记录

    1、取公布日<=Endt的最新的数据
    2、若1无数据,则取调整前

    调整前
    1
    满足条件(一个报告期一条记录):
    1、符合调整前
    2、公布日<=Endt
    3、同一报告期多条数据时,取公布日最大一条记录

    按下列顺序优先获取:
    1、公布日<=Endt的本期数据取调整前中公布日最大的记录的值
    2、所有本期数据取调整前中公布日最大的记录的值
    3、0


    取数范例
    注:下例范例表格结果截图都是倒序的部分结果
    infoarray/infotable取表格数据
    注:infoarray与infotable的区别仅仅在于返回结果中infotable返回StockID与StockName,而infoarray不返回这两个字段。
    范例01:infoarray取全表的数据

         setsysparam(pn_reportmode(),-1); //取全表-与当前pn_date()设置无关
         setsysparam(pn_stock(),'SZ000002');
         return infoarray(44);

    返回结果:

    范例02:infotable取全表的数据

         setsysparam(pn_reportmode(),-1); //取全表-与当前pn_date()设置无关
         return select * from infotable 44 of 'SZ000002' end;

    返回结果:

    范例03:取调整前

     setsysparam(pn_reportmode(),0); //取调整前
     setsysparam(pn_date(),20150101T);//取2015年前已经公布了的记录
     return select * from infotable 44 of 'SZ000002' end;

    返回结果:


    report/reportofall财务指标的提取
    这里以浦发银行2011年年报数据为类,该期全部财务数据(44)表的结果如下:

    范例04:取指定日最新的归属母公司股东权益合计

    //pn_reportmode()不设置,则默认为0,即调整后(最新的值)
    setsysparam(pn_date(),20120401T);//取截止到2012-4-1日最新的数据
    setsysparam(pn_stock(),'SH600000');
    return report(44140,20111231);
    //返回调整前:148891235000
    //说明:在指定日之前只有调整前的有公布,所以就取它

    //将上面的指定日改为2013-4-1日,效果如下
    setsysparam(pn_date(),20130401T);//取截止到2013-4-1日最新的数据
    setsysparam(pn_stock(),'SH600000');
    return report(44140,20111231);
    //返回调整后:148890000000
    //说明:在指定日之前调整后的数据是最新的


    相关链接:
    FAQ:2012-04-08-模型更新-关于财务数据的调整及访问方法
    FAQ:2017-01-05-应用专题-数据提取专题01:天软财务数据提取专题.(更新版)
    FAQ:Q:财务数据的调整前与调整后的表格数据提取:pn_reportmode()