You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NBBO最优买卖报价表,如何用KDB生成对应订单流表?

用KDB从NBBO表生成订单流的实现方案

NBBO表结构与样例数据

假设你的NBBO表已加载到KDB环境中,其结构和样例数据如下:

datesymtimebidbsizeaskasize
2020.02.03AAPL0D04:00:00.020394647299.2911e+090
2020.02.03AAPL0D04:00:00.080067964299.2913291
2020.02.03AAPL0D04:00:00.080068172299.2913135
2020.02.03AAPL0D04:00:00.080132251299.9813135
2020.02.03AAPL0D04:00:00.08013245930013135

订单流生成规则

你需要遵循以下规则生成订单流:

  1. 若bid价格与前值相同且bsize增加,生成买入订单,订单量为 bsize - 前值bsize;
  2. 若bid价格与前值相同且bsize减少,生成卖出订单,订单量为 前值bsize - bsize;
  3. 若ask价格与前值相同且asize增加,生成卖出订单,订单量为 asize - 前值asize;
  4. 若ask价格与前值相同且asize减少,生成买入订单,订单量为 前值asize - asize;
  5. 若bid价格高于前值,生成买入订单,订单量为当前bsize;
  6. 若bid价格低于前值,生成卖出订单,订单量为前值bsize;
  7. 若ask价格高于前值,生成买入订单,订单量为前值asize;
  8. 若ask价格低于前值,生成卖出订单,订单量为当前asize;

KDB实现步骤

1. 确保数据时序有序

规则依赖相邻记录的状态对比,因此必须先按date、sym、time对NBBO表升序排序:

nbboSorted: `date`sym`time xasc nbbo;

2. 计算前序记录的参考值

通过by子句按date和sym分组,用prev函数获取每组中前一条记录的bid、bsize、ask、asize值:

nbboWithPrev: update 
    prevBid: prev bid, 
    prevBsize: prev bsize, 
    prevAsk: prev ask, 
    prevAsize: prev asize 
by date, sym from nbboSorted;

每组的第一条记录没有前序值,会被标记为0N(空值),后续过滤时需排除。

3. 批量应用规则生成订单流

使用KDB的向量条件运算符?批量判断每条记录的订单类型和数量,最后过滤无效订单:

orderFlow: select 
    date, sym, time,
    // 确定订单方向(BUY/SELL)
    side: ?[
        // Bid规则分支
        bid = prevBid; ?[bsize > prevBsize; `BUY; ?[bsize < prevBsize; `SELL; `NULL]];
        bid > prevBid; `BUY;
        bid < prevBid; `SELL;
        // Ask规则分支
        ask = prevAsk; ?[asize > prevAsize; `SELL; ?[asize < prevAsize; `BUY; `NULL]];
        ask > prevAsk; `BUY;
        ask < prevAsk; `SELL;
        // 默认无订单
        `NULL
    ],
    // 计算订单数量
    qty: ?[
        // Bid规则的数量计算
        bid = prevBid; ?[bsize > prevBsize; bsize - prevBsize; ?[bsize < prevBsize; prevBsize - bsize; 0]];
        bid > prevBid; bsize;
        bid < prevBid; prevBsize;
        // Ask规则的数量计算
        ask = prevAsk; ?[asize > prevAsize; asize - prevAsize; ?[asize < prevAsize; prevAsize - asize; 0]];
        ask > prevAsk; prevAsize;
        ask < prevAsk; asize;
        // 默认数量0
        0
    ]
from nbboWithPrev
// 过滤无订单记录和无前置的首条记录
where side != `NULL, not null prevBid;

4. 样例数据执行结果

针对提供的样例数据,生成的订单流如下:

datesymtimesideqty
2020.02.03AAPL0D04:00:00.080067964SELL1
2020.02.03AAPL0D04:00:00.080068172SELL5
2020.02.03AAPL0D04:00:00.080132251BUY1
2020.02.03AAPL0D04:00:00.080132459BUY1

结果说明:

  • 第二条记录:ask从1e+09降至329,触发规则8,生成卖出订单(量1)
  • 第三条记录:ask从329降至313,触发规则8,生成卖出订单(量5)
  • 第四条记录:bid从299.29升至299.98,触发规则5,生成买入订单(量1)
  • 第五条记录:bid从299.98升至300,触发规则5,生成买入订单(量1)

内容的提问来源于stack exchange,提问作者Reb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:45:21