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

Q:如何获取股票.机构持股表数据在指定日的最新数据报告期    

  • A:由于天软的股票.机构持股(27)表数据是天软后期衍生,而非公告实时采集的,所以没有具体公布日。
    而若需要知道在指定日,用户实际能获取到的最新的报告期数据是哪个,则需要根据数据公布情况进行估计。
    其衍生的具体数据来源于:
    “根据股票十大股东、十大流通股东及基金持股明细进行统计。该表数据是在所有股票及基金定期报告数据采集完成再衍生”
    具体衍生时间:
    “每季定期报告披露完毕的 15 个工作日内更新完成”
    其中,根据国家规定的财务报表发布频率:
      股票:
        一季报: 4 月公布
        中报: 7、 8 月公布
        三季报: 10 月公布
        年报:次年 1 月到 4 月公布
      基金:
        季报: 报告期结束的 15 个工作日内公布
        中报:报告期结束的 60 个自然日内公布
        年报: 报告期结束的 90 个自然日内公布

    根据以上数据情况,我们可以大致估算该数据的最后衍生日期,具体实现可参考:
    封装函数:T27Rate(endt:TDatetime):Array
    函数说明:根据指定日,获取表27的最早数据报告期。
      由于当年一季报与去年年报的数据几乎是同一时间衍生。
    所以,当最新取到一季报时,同时也会返回上年年报,模型返回值设计是一个数组,而非一个报告期,且结果是倒序排列。
    具体实现:

    function T27Rate(endt);//根据选股日,获取表27的最早数据报告期
    begin
      year:=yearof(endt);
      Month:=Monthof(endt);
      RdateArr:= RDateListQK(Endt-365,Endt,0);
      RdateArr:=select thisrow as 'RDate',ReportDateType(thisrow) as 'RType' from RdateArr end;
      Lb:=Function(Rt,year)
      begin
        if Rt=1 then
         R:=inttodate(year*10000+0430);
        else if Rt=2 then
         R:=inttodate(year*10000+0831);
        else if Rt=3 then
         R:=inttodate(year*10000+1031);
        else if Rt=4 then
         R:=inttodate((year+1)*10000+0430);
         
        return StockEndTAfterNDay(R,15);
      end
      RdateArr:=select *,Lb.do(['RType'],['RDate'] div 10000) as '衍生日' from RdateArr order by ['Rdate'] desc end;
      YSR:= vselect ['衍生日'] from RdateArr where ['衍生日']<=endt order by ['衍生日'] desc end;
      return sselect ['RDate'] from RdateArr where ['衍生日']=YSR end;
    end;

    调用实例及结果展示:
    场景一:最新衍生的为一季报及去年年报

    return T27Rate(20220526T);


    场景二:最新衍生的为三季报

    return T27Rate(20220316T);