FAQ > 金融建模 > 建模问题 > 基金相关

Q:ETF日内实时申购赎回数据    

  • A:目前,深交所ETF行情中有提供实时申赎数据,上交所没有。
    数据情况:
      ETF代码加了后缀ETF来做实时申赎的行情接收,提供了以下数据字段:
        bc1 -> 实时申购数量, bc2 -> 申购笔数
        sc1 -> 实时赎回数量, sc2 -> 赎回笔数
    【数据来源】深交所
    【数据开始时间】深交所大部分从2023年12底开始(最早在2023年12月11日)。
    【取数方式】交易明细表(Tradetable),无其它周期数据。
    【数据频率】交易明细表中更新频率3秒一个快照,由于只有数据变动时才记录,因此一般会低于这个频率。
    【取数代码】基金交易代码(二级市场代码)+"ETF",如"SZ159001ETF"
    【字段说明】实时申购赎回数量与笔数在交易明细表中都是累计量,即记录的是开盘到当前时间点的总量。

    【取数示例】
    示例01:取指定日指定ETF当日申赎数量与笔数的变动情况
    fundid:="SZ159001";
    endt:=20260109T;
    ssID:=fundid$"ETF";//在原有的基金交易代码上加ETF后缀
    return select ["StockID"],["StockName"],datetimetostr(["date"]) as "date",
       ["bc1"] as "申购数量",["bc2"] as "申购笔数",["sc1"] as "赎回数量",["sc2"] as "赎回笔数"
       from tradetable datekey endt to endt+16/24 of ssID end;

    返回结果:


    示例02:取指定ETF在指定时点的申赎数量与笔数
    fundid:="SZ159001";
    endt:=20260109.102450T;//指定具体时点
    setsysparam(pn_stock(),fundid$"ETF");//在原有的基金交易代码上加ETF后缀
    setsysparam(PN_Cycle(),cy_detail());//设置周期为交易明细
    setsysparam(pn_date(),endt);
    return array("申购数量":BuyVol1(),"申购笔数":BuyVol2(),"赎回数量":SaleVol1(),"赎回笔数":SaleVol2());

    返回结果:(下面图中左边数组为示例返回结果,右边为对应明细表中数据作为参考)


    示例03:取指定日深交所所有ETF在指定时点的截面情况
      endt:=20260109.102450T;//指定具体时点
      JYfunds:= getbkall("深证ETF");
      setsysparam(pn_cycle(),cy_day());
      JYfunds:= sselect thisrow from JYfunds where spec(istradeday(dateof(endt)),thisrow) end; //-去掉不交易的券
      t:=array();
      k:=0;
      setsysparam(PN_Cycle(),cy_detail());//设置周期为交易明细
      setsysparam(pn_date(),endt);
      for i,fundid in JYfunds do
      begin
        echo fundid;
        setsysparam(pn_stock(),fundid$"ETF");//在原有的基金交易代码上加ETF后缀
        try
         t[k++]:= array("StockID":fundid$"ETF","stockName":stockName(fundid),
               "申购数量":BuyVol1(),"申购笔数":BuyVol2(),"赎回数量":SaleVol1(),"赎回笔数":SaleVol2());
        except
         echo fundid,"无该数据";
        end;
      end
      return t;

    返回结果:
     
     
    交易明细表中源始数据示例: