FAQ > 金融建模 > 建模问题 > 交易日相关

Q:获取交易日推移的几种方式(包括已公布假期日历的未来交易日)    

  • A:已有相关公用函数(支持未来交易日,依据SH000001的753表数据):
    StockEndTAfterNDay:指定日期向后推N个交易日期,函数说明:FAQ:StockEndTAfterNDay
    注:
    1、为负数则向历史推,为正数则向未来推
    2、该函数适用于,当指定日为交易日时,则当指定日为当前时间
      当指定日为非交易日时,则指定下个交易日为当前时间
    3、当需要取到未来交易日时,只适用于日线,否则返回0。


    StockTradeDaysQkAfterN:指定日期向后推N个交易日期,函数说明:FAQ:StockTradeDaysQkAfterN
    注:
    1、为负数则向历史推,为正数则向未来推
    2、该函数适用于,当指定日为交易日时,则当指定日为当前时间
      当指定日为非交易日时,则指定上个交易日为当前时间
      注意这里与StockEndTAfterNDay的区别

    3、当需要取到未来交易日时,只适用于日线,否则返回结果按日线处理。
    调用范例:
    //执行程序时间:2021-1-13日,得到在2021-01-12日的后第二个交易日
      return StockEndTAfterNDay(20210112T,2); //20210112T是交易日:返回2021-1-14
      return StockTradeDaysQkAfterN(20210112T,2); //20210112T是交易日:返回2021-1-14

      return StockEndTAfterNDay(20210109T,2); //20210109T是非交易日:返回2021-01-13 (以20210111日为当前时间)
      return StockTradeDaysQkAfterN(20210109T,2);//20210109T是非交易日:返回2021-01-12 (以20210108日为当前时间)



    历史解决方法:用户封装实现模型
     天软已提供未来交易日数据,可查看证券数据专家-》表格数据-》指数.市场交易日历。目前提供的是本年的交易日数据,在每年的节假日安排出来后,天软数据组人员会即时更新。
    提取数据范例(模型提供附件):
    1、提取开始日到截止日之间的交易日序列(开始日和截止日都可以是未来的日期):
    Function FutureTradedayQK(BegT,EndT);
    Begin
      begt_:=datetoint(begt);
      endt_:=datetoint(endt);
      dayArr:=sselect inttodate(['截止日']) from infotable 753 of 'SH000001'
            where ['截止日']>=begt_
               and ['截止日']<=endt_
               and ['是否交易日']=1
               order by ['截止日'] end;
      if not istable(dayArr) then endt1:=endt;
      else endt1:=dayArr[0];
      hisArr:=MarketTradeDayQk(begt,endt1);
      return hisArr union2 dayArr;
    End;

    2、指定日是否交易日(可判断未来日期):
    Function IfTradeDay1(EndT);
    Begin
      if EndT<today() then
       return istradeday(endt);
      else
      begin
       EndT_:=datetoint(EndT);
       r:=sselect ['截止日'] from infotable 753 of 'SH000001'
            where ['是否交易日']=1 end;
       if EndT_ in r then return 1;
       else return 0;
      end;
    End;

    3、取指定日后N个的交易日:
    Function DateAfterNDays(EndT,Days);
    Begin
       oV:=BackUpSystemParameters2();
       SetSysParam(PN_Date(),EndT);
       setsysparam(pn_cycle(),cy_day());
       //未来N日
       if days=0 and endt>=today() then
       begin
         endt_:=datetoint(endt);
         d:=vSelect drange(0 to 0) ['截止日'] from infoTable 753 of 'SH000001'
               where ['截止日']<=endt_ order by ['截止日'] desc end;
         return inttodate(d);
       end
       else if days>=0 then
       begin
         DateAfter:=ref(sp_time(),-Days);
         if DateAfter=0 then
         begin
          if endt>=today() then
          begin
            day_:=datetoint(EndT);
            days2:=days;
          end
          else
          begin
            day_:=datetoint(today());
            days2:=days-tradedays(endt,today());
          end;
          t:=Select drange(0 to Days-1) ['截止日'] from infoTable 753 of 'SH000001'
               where ['截止日']>day_ order by ['截止日'] end;

          if isTable(t) then
          begin
            if Days2-1>length(t)-1 then return 0;
            return IntToDate(t[Days2-1]['截止日']);
          end
         end
         else
         return DateAfter;
       end
       else
       begin
         if EndT>=today() then
         begin
          //begt_:=datetoint(today());
          endt_:=datetoint(endt);
          t:=Select drange(-days to -Days) ['截止日'] from infoTable 753 of 'SH000001'
               where ['截止日']<=endt_ order by ['截止日'] desc end;

          len:=length(t);
          if len>=-days then
          begin
            return IntToDate(t[-Days-1]['截止日']);
          end
          else
          begin
            days1:=(-days)-len+1;
            return ref(sp_time(),Days1);
          end
         end
         else
          return ref(sp_time(),-Days);
       end
    End;
    [关键字]:未来交易日、未来、是否交易日、交易日序列