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

Q:关于系统昨收函数SectionPrevClose()的效率说明    

  • A:SectionPrevClose()在取系统昨收数据时,特别是在设置高频行情的情况下,执行效率相对于close()等常见指标表现会比较慢。
    原因:天软的日线行情数据表格中实际没有存储该字段(sectional_yclose)数据,该数据实际存储在交易明细表中,在提取日线的该字段数据时,是从交易明细数据表中进行查找,所以用户取其它周期行情时也能返回该字段数据。

    实际上,对于系统昨收,该数据一天只有一个值。但由于存储在交易明细中,数据量超大,导致大量提取时表现较慢。
    优化现状:考虑到该字段数据的重要性,天软对于日线下的该指标的提取进行了效率优化,取数效率与close()等差不多。而高频周期下还保留着历史用法。
    注意事项及解决办法:
    1、用户需要避免在设置高频周期时对该字段进行大量调用。
    2、实际中高频下取该字段意义并不大,结果等同于日线下的该值,所以用户可以将之转换成日线,或在需求合理的情况下考虑用sys_preclose()等方式替代。

    优化效率的展示:
    示例01:日线下效率的对比
    stocks:=getbk("创业板");
      setsysparam(pn_cycle(),cy_day());//cy_15m()
      Tarr:=MarketTradeDayQk(20220201T,20220220T);
      for j:=0 to length(Tarr)-1 do
      begin
        setsysparam(pn_date(),Tarr[j]);
        for i:=0 to length(stocks)-1 do
        begin
         setsysparam(pn_stock(),stocks[i]);
         s:=SectionPrevClose();
         c:=close();
         c2:=sys_prevclose();
        end
      end
      return 1;

    时间消耗:

    由运行的时间可以看出,SectionPrevClose()与close、sys_prevclose()花费的时间差不多,效率非常高。说明SectionPrevClose()在日线情况下是不存在效率问题的。
    示例02:高频周期下效率的对比
    优化前:取15分钟线下创业板的昨收
      stocks:=getbk("创业板");
      setsysparam(pn_cycle(),cy_15m());//15分钟线
      Tarr:=MarketTradeDayQk(20220201T,20220210T);
      for j:=0 to length(Tarr)-1 do
      begin
        setsysparam(pn_date(),Tarr[j]);
        for i:=0 to length(stocks)-1 do
        begin
         setsysparam(pn_stock(),stocks[i]);
         s:=SectionPrevClose();
         c:=close();
         c2:=sys_prevclose();
        end
      end
      return 1;

    时间消耗:

    相对于close()的0.04秒,SectionPrevClose()需要48秒才完成,效率非常低。
    优化后:
      stocks:=getbk("创业板");
      setsysparam(pn_cycle(),cy_15m());//15分钟线
      Tarr:=MarketTradeDayQk(20220201T,20220210T);
      for j:=0 to length(Tarr)-1 do
      begin
        setsysparam(pn_date(),Tarr[j]);
        for i:=0 to length(stocks)-1 do
        begin
         setsysparam(pn_stock(),stocks[i]);
    //设置为日线后提取昨收
         s:=Specall(SectionPrevClose(),array(pn_cycle():cy_day()));
         c:=close();
         c2:=sys_prevclose();
        end
      end
      return 1;

    时间消耗:

    结论:在优化前后,调用次数相同,且close()等函数所消耗的时间都差不多,都在0.04秒左右的情况下,
    而SectionPrevClose()消耗的时间由48秒缩减为0.01秒,效率得到了大大的优化。
    即,在高频环境下,临时设置为日线后提取昨收,可以很好地提高SectionPrevClose()的取数效率。