FAQ > 金融建模 > 数据提取 > 行情数据

Q:日成交量为0的分钟线数据在什么时候过滤?    

  • A:对于分钟线数据,盘中有成交明细,就会实时生成分钟线。
    在盘后:
    1、盘后4点半会落地成数据文件,该数据过滤掉了当日成交量为0的分钟线数据。
    2、在下一个交易日开盘前会清掉最新的缓存,比如有夜盘时,当天晚上就会被清除。
    其中,用户提取会优先提取缓存中的数据,也就是说,用户需在第二天才会提取不到这个需过滤的数据。
    一般用户可以通过判断股票当天是否交易来避免取到这类数据。

    另外,当交易日当天成交量为0,有交易明细数据时,若需要也得到当天的分钟线的数据,该如何实现?

    方式一:通过当日明细及历史行情进行拟合几个主要的字段
    这里写了个实现案例,提供分钟线["OPEN"],["HIGH"],["CLOSE"],["LOW"],["AMOUNT"],["VOL"],["sectional_cjbs"]这些分钟线字段的合成,供需要用户参考:
    附件:TradeDataTo1MinData_20200603.fun
    函数定义:TradeDataTo1MinData(StockID:String,endt:TDate):Array
    功能说明:提取指定日指定合约的1分钟线行情数据
    参数说明:
     StockID:字符串,合约代码,一次只支持一个合约
     endt:日期,指定日
    返回:数组,1分钟线行情数据,只包括常用的几个字段(具体如上所述)
    调用方法:
    return TradeDataTo1MinData('OP10000039',20150310T);
    (注:2020-6-3日附件升级:支持期货,支持夜盘等的生成)

    升级:
    1、针对期货合约所在交易期间其主力合约也都不活跃导致衍生失败的情况进行升级,变更为推向更早的历史场景(即所对应的品种上市日为止)。
    若需要此功能的,可用该模型,模型使用与原模型是一致的:
    附件:TradeDataTo1MinData_II.fun

    方式2:通过仿真补充未成生日期的分钟线,全字段
    注:该种方式目前仅在测试版与下一代中支持,其它服务器暂时还未更新此功能
    一般用法如:
    setsysparam(pn_cycle(),cy_1m());
    setsysparam(pn_viewpoint(),20221202.16T);//设置仿真时点
    return select * from markettable datekey 20221202T to 20221202.16T of "OP10004553" end;


    封装提取区间分钟线等行情的模型:GetMinHQbyView(StockID,begt,Endt,cy)
    取数逻辑:提取区间完整行情-分钟级当日未生成的以仿真方式补充
    操作:复制下面脚本新增函数,或下载函数附件(附件:GetMinHQbyView.fun )导为用户函数后调用
    Function GetMinHQbyView(StockID,begt,Endt,cy);
    Begin
    {注:当日无明细的无法生成
    }
       ov:=BackupSystemParameters2();
       if ansipos("分钟线",cy)=0 then //其它周期-不通过仿真生成
       begin
        setsysparam(pn_cycle(),cy);
        return select * from markettable datekey begt to endt of stockid end;
       end
       else begin  //分钟级
        mData:=array();
        setsysparam(pn_cycle(),cy_day());
        setsysparam(pn_Stock(),StockID);
        Tarr:=StockTradeDayQk(begt,endt);
        begtRef:=specdate(ref(sp_time(),1),begt)?:begt-1;
        setsysparam(pn_cycle(),cy);
        for i,vEndt in Tarr do
        begin
          tbegt:=(i?Tarr[i-1]:begtRef)+18/24;
          tendt:=vEndt+18/24;
          Mm:=select * from markettable datekey tbegt to tendt of stockid end;
          if not istable(Mm) then
          begin
           setsysparam(pn_viewpoint(),tendt);
           Mm:=select * from markettable datekey tbegt to tendt of stockid end;
           setsysparam(pn_viewpoint(),nil);
          end;
          mData&=Mm;
        end;
       end;
       return select * from mData where ["date"]>=begt and ["date"]<=endt end;
    End;


    调用示例:取OP10004553在一段时间内的1分钟线。
    t:= GetMinHQbyView("OP10004553",20221126T,20221202.16T,cy_1m());
    return select *,datetimetostr(["date"]) as "date" from t end;

    若需要其它周期,将cy_1m()更改成对应的周期函数即可,如30分钟线为cy_30m()
    注:
    1、该种方式下,对于取分钟线区间行情上有一定的效率的消耗,一般像股票之类的无需此类方式。
    2、若当日无交易明细数据,则也是生成不了的。