FAQ > 金融建模 > 建模问题 > 语法相关

Q:快速理解天软的Nday功能及用法    

简述
一般天软的新用户在编写TSL程序中,对天软的nday功能与用法比较难以理解及正确地使用,这里,通过对nday与for循环的对比希望对有此疑问的开发者能有所帮助。
  • A:首先,我们看一下Nday的功能描述:
    “提取或计算当前日期往前N个历史交易日数据,提取或计算的数据与当前的股票代码、周期、时间等有关。”

    即其功能解析为:
    1、提取对象:提取有时间序列性质的数据或指标,最常见的比如行情数据及相关指标。
    2、提取时间区间:以当前时间为起点,向历史推移N个交易日,取这N个交易日的数据或计算这N个交易日的指标。
    3、返回结果:最近N个交易日的每个交易日的值,是一个二维数组。
    所以,标重点:这个数据或指标与交易日有关(可理解为需要一个日期参数),在需要取一段连续时间的该数据时,就可以用到nday了。

    通俗理解:就是对一段连续时间序列的一个循环取数或计算的操作。
    它等同于一个循环,不断地自动设置时间变量对多个指标进行计算,形如:

    setsysparam(pn_date(),endt);//截止时间
    for i:=0 to N-1 do
    begin
      t[i,'指标1']:=exp1();//与当前时间相关的指标
      t[i,'指标2']:=...
      ...
      setsysparam(pn_date(),ref(sp_time(),1));//当前时间调整为上一个交易日
    end
    return t;

    其功能与for循环对比实例如下:
    for循环:

      begt:=20210705T;//开始时间
      endt:=20210713T;//截止时间
      Tarr:=MarketTradeDayQk(begt,endt);//取开始到截止时间内的交易日序列
      setsysparam(pn_stock(),'SH600000');//设置当前证券代码:取SH600000的数据
      ret1:=array();//定义一个数组,将取到的数据保存在这个数组中
      for i:=0 to length(Tarr)-1 do//对时间序列进行循环
      begin
       setsysparam(pn_date(),Tarr[i]);//设置当前时间
       ret1[i,'时间']:=datetostr(Tarr[i]);//记录当前时间变量
       ret1[i,'close']:=StockClose(Tarr[i]);//取指定日收盘价-通过传参的方式
       ret1[i,'c']:=close();//取当前时间点的收盘价-系统参数的方式获取当前时间
      end
      return ret1;

    Nday实现:

      endt:=20210713T;
      N:=7;//或当已知的是begt时,可用N:=tradedays(begt,endt);来计算N
      setsysparam(pn_stock(),'SH600000');//设置当前证券代码:取SH600000的数据
      setsysparam(pn_date(),endt);//设置nday推移的截止日
      ret2:=nday(N,'时间1',datetimetostr(sp_time()),//当前时间-sp_time()
       //当指定日是参数时,用sp_time()替代,表示前当前时间
       'close1',stockclose(sp_time()),
       'c1',close());
      return ret2;

    结果对比(可以看出结果是一样的):


    在使用过程中for与nday的差异在于:
    1、for需要先得到时间序列,而nday只需要知道截止时间与周期数N
    2、for在计算指标前,需要不断地设置时间变量,而nday不需要
    特别地:
    1、nday的N日是与当前的证券相关的,取的是当前证券的交易日序列,用户注意个股有停牌则当日不是交易日。
    2、上面范例用的是默认的日线情景,nday也支持高频,比如分钟线,设置当前周期即可。
    3、Nday是天软系统函数,由底层开发,有缓存功能,所以对于某些计算效率会更高。
    4、Nday2与Nday3之类逻辑与Nday一样,只是参数入口与返回形式有些区别。

    以上就是对nday的一些简单的解析,希望能对理解nday有所帮助。
    更多Nday使用相关链接:
    FAQ:NDay
    FAQ:Nday,Nday3