基于NBBO最优买卖报价表,如何用KDB生成对应订单流表?
用KDB从NBBO表生成订单流的实现方案
NBBO表结构与样例数据
假设你的NBBO表已加载到KDB环境中,其结构和样例数据如下:
| date | sym | time | bid | bsize | ask | asize |
|---|---|---|---|---|---|---|
| 2020.02.03 | AAPL | 0D04:00:00.020394647 | 299.29 | 1 | 1e+09 | 0 |
| 2020.02.03 | AAPL | 0D04:00:00.080067964 | 299.29 | 1 | 329 | 1 |
| 2020.02.03 | AAPL | 0D04:00:00.080068172 | 299.29 | 1 | 313 | 5 |
| 2020.02.03 | AAPL | 0D04:00:00.080132251 | 299.98 | 1 | 313 | 5 |
| 2020.02.03 | AAPL | 0D04:00:00.080132459 | 300 | 1 | 313 | 5 |
订单流生成规则
你需要遵循以下规则生成订单流:
- 若bid价格与前值相同且bsize增加,生成买入订单,订单量为
bsize - 前值bsize; - 若bid价格与前值相同且bsize减少,生成卖出订单,订单量为
前值bsize - bsize; - 若ask价格与前值相同且asize增加,生成卖出订单,订单量为
asize - 前值asize; - 若ask价格与前值相同且asize减少,生成买入订单,订单量为
前值asize - asize; - 若bid价格高于前值,生成买入订单,订单量为当前bsize;
- 若bid价格低于前值,生成卖出订单,订单量为前值bsize;
- 若ask价格高于前值,生成买入订单,订单量为前值asize;
- 若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. 样例数据执行结果
针对提供的样例数据,生成的订单流如下:
| date | sym | time | side | qty |
|---|---|---|---|---|
| 2020.02.03 | AAPL | 0D04:00:00.080067964 | SELL | 1 |
| 2020.02.03 | AAPL | 0D04:00:00.080068172 | SELL | 5 |
| 2020.02.03 | AAPL | 0D04:00:00.080132251 | BUY | 1 |
| 2020.02.03 | AAPL | 0D04:00:00.080132459 | BUY | 1 |
结果说明:
- 第二条记录: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
相关产品推荐
相关产品推荐

