FAQ > 金融建模 > 应用案例 > 数据提取

Q:在天软中如何提取一段时间内每日指标的值    

  • A:1、若取指标的对象是一个有行情的证券,则可直接使用Nday进行指标的提取,用法可参考:
    FAQ:NDay
    FAQ:Q:快速理解天软的Nday功能及用法
    要点说明:
    在Nday的调用中,若指标模型的指定日由参数传入,则需将该参数用sp_time()替代传入,即表示提取每一个当前日的指标的值。
    若指标模型的指定日依赖系统参数pn_date()来指定,则可直接调用。

    2、若指标的对象不是一个有行情的证券,则需要借助市场指数代码或通过提取市场交易日序列而后循环提取。

    下面分别对各种场景进行举例展示
    范例01:取有行情的证券的一段时间内的多个指标值,指标函数与当前时间有关

    //获取万科A在2022-5-1日到2022-5-26日期间每日的收盘价与成交量的数据
      begt:=20220501T; //开始时间
      endt:=20220526T; //截止时间
      setsysparam(Pn_stock(),'SZ000002');
      setsysparam(pn_cycle(),cy_day());//日期
      setsysparam(pn_date(),Endt);//设置endt为截止时间
      N:=Tradedays(begt,endt);//计算当前股票在时间区间内的交易日数
      return Nday(N,'时间',datetostr(sp_time()),
          '指标名称',close(), //指标函数或表达式
          '成交量',vol());//若有更多的指标,可以继续添加,用逗号分开


    返回结果:


    范例02:取有行情的证券的一段时间内的指标值,指标函数与当前时间无关,日期由参数指定

    //获取万科A在2022-5-1日到2022-5-26日期间每日的市盈率
      begt:=20220501T; //开始时间
      endt:=20220526T; //截止时间
      setsysparam(Pn_stock(),'SZ000002');
      setsysparam(pn_cycle(),cy_day());//日期
      setsysparam(pn_date(),Endt);//设置endt为截止时间
      N:=Tradedays(begt,endt);//计算当前股票在时间区间内的交易日数
      return Nday(N,'时间',datetostr(sp_time()),
       'PE',StockPE(sp_time(),1)
    //原函数为StockPE(EndT,DataType),其中参数Endt用sp_time()替换

             );

    返回结果:


    范例03:取有行情的证券的一段时间内的指标值,返回为一维数组序列
    可借助Nday的同类模型Nday3,功能与逻辑一致,具体用法可参考:FAQ:Nday,Nday3

    //同样实际范例2的需求,结果展示为一维数组,代码如下:
      begt:=20220501T; //开始时间
      endt:=20220526T; //截止时间
      setsysparam(Pn_stock(),'SZ000002');
      setsysparam(pn_cycle(),cy_day());//日期
      setsysparam(pn_date(),Endt);//设置endt为截止时间
      N:=Tradedays(begt,endt);//计算当前股票在时间区间内的交易日数
      return Nday3(N,StockPE(sp_time(),1));//仅将nday变更为nday3,其它一致

    返回结果:


    范例04:指标的对象不是一个有行情的证券,借助市场指数交易日
    实现如下:

    //取2022-5-1日到2022-5-25日期间内每日的沪股通的前十大净买入金额
    {注:取沪深港通道的数据需要通过指定通道代码,比如HG000001,HG000002等,
    而这些代码只是为了存储通道数据而构造,不是交易所的证券代码,故底下无行情,也就无交易时间序列。
    所以,需要借助其它有行情的证券代码,比如上证指数SH000001
    }
      begt:=20220501T; //开始时间
      endt:=20220525T; //截止时间
      setsysparam(Pn_stock(),'SH000001');//借助上证指数的交易日序列
      setsysparam(pn_cycle(),cy_day());//日期
      setsysparam(pn_date(),Endt);//设置endt为截止时间
      N:=Tradedays(begt,endt);//计算当前股票在时间区间内的交易日数
      return Nday(N,'时间',datetostr(sp_time()),
       '沪股通的前十大净买入金额',spec(BK_HSGActiveNetAmountNoN(10),'HG000002'));
    //在调用指标时,用临时指定证券代码的spec传递指标的取数代码



    返回结果:


    范例05:指标的对象不是一个有行情的证券,获取时间序列后循环计算-通用方式

    begt:=20220501T; //开始时间
      endt:=20220525T; //截止时间
      setsysparam(pn_cycle(),cy_day());//日期
      Tarr:=markettradedayqk(begt,endt);//获取市场交易日序列
      //循环指定日期计算指标的值
      ret:=array();
      setsysparam(pn_stock(),'HG000002');//设置取数代码
      for i:=0 to length(Tarr)-1 do
      begin
        setsysparam(pn_date(),Tarr[i]);
        ret[i,'日期']:=datetostr(Tarr[i]);
        ret[i,'沪股通的前十大净买入金额']:=BK_HSGActiveNetAmountNoN(10);
      end
      return ret;


    返回结果与范例04的结果一致。