逐笔成交的双向委托引用 (Bid-Offer Order Reference)
Definition. 沪深两所的逐笔成交记录都带两个委托号字段,分别指向这笔成交的买方委托和 卖方委托。因为同一时刻的一笔挂单不能既主动买又主动卖,所以先出现的那一侧就是主动方。 这是 A 股逐笔数据里判定买卖方向唯一可靠的依据——委托流本身不带主动/被动标志, 而且委托流往往缺主动方申报行。
两所的字段名
| 沪市 (SSE) | 深市 (SZSE) | |
|---|---|---|
| 逐笔委托主键 | OrderNo (委托订单号) |
ApplSeqNum (委托索引, 从 1 计数) |
| 成交里的买方引用 | BuyNo |
BidApplSeqNum |
| 成交里的卖方引用 | SellNo |
OfferApplSeqNum |
| 无对应委托的表示 | — (文档未定义) | 0 |
| 方向标志 | TickBSFlag (B 外盘 / S 内盘 / N 未知) |
无 |
沪市 Tick.csv 与 StockTick.csv 的 Type=T 记录给 TickBSFlag 三值
(B 主动买、S 主动卖、N 未知),但这依赖交易所自己的判定;委托流 Entrust.csv 只有
OrderBSFlag 两值 (B 买单 / S 卖单),不带主动性。深市连成交表都没有方向字段,
只能靠两个委托索引比较。
判定规则
成交 t 记录 (BuyNo=b, SellNo=s):
若 buy_time(b) < sell_time(s) → 买方先到 → 主动买 (taker = buy)
若 sell_time(s) < buy_time(b) → 卖方先到 → 主动卖 (taker = sell)
若 只有一侧能查到 → 那一侧是被动方 (maker), 另一侧是主动方
若 两侧都查不到 → 无法判定 (沪市实测中未出现, 见下)
符号化订单流 (signed volume):
V_t^{\text{signed}} = +Q_t \cdot \mathbb{1}[\text{主动买}] - Q_t \cdot \mathbb{1}[\text{主动卖}]
为什么委托流不能直接拿来判方向
三重的结构性问题:
1. 两所委托流都不带主动/被动字段
沪市 Entrust.csv 是 OrderBSFlag (B/S 两个值, 只表示买卖方向) + OrdType
(A 新增 / D 撤单)。深市 hq_order 是 Side (1 买 2 卖) + OrderType
(1 市价 / 2 限价 / U 本方最优)。两个交易所都不告诉你这笔委托是主动去吃单还是被动挂单。
用委托类型反推不可靠: 沪市有市价/本方最优这类必然主动的委托, 但占比小; 深市主力是限价委托, 限价单既可能主动也可能被动。
2. 委托流缺主动方申报行 (ghost 订单)
实测 (供应商 dataho 样例包, 600519 @ 20150105): 委托 33,384 行 (新增 24,788 + 撤单),
成交 27,209 行。成交里的 BuyNo/SellNo 有 85.8% 不在委托流中,即约 14.2% 配对缺失。
关键在于缺失的形态是单侧的: 要么缺买方委托号, 要么缺卖方委托号, 没有两侧都缺、没有零号。这个形态说明丢的不是「随机丢行」, 而是整条主动方申报行 没进委托流——挂单等着被吃的那一侧在流里有, 主动去吃单的那一侧不在。
后果: 该源的沪市委托流不能用于按委托流重放订单簿, 逐笔委托还原出的是残缺的一侧。 这一现象与 sybar 项目记录的 Wind 源沪市 ghost 订单同机制——缺的都是主动方申报行。
3. 沪市的干净双流窗口只有三年多
沪市官方 Entrust.csv 2021-04-26 才启用, 2024-07-08 就被停掉、合并进 StockTick.csv。
所以「委托流 + 成交流分离」的干净样本只有 2021-04-26 – 2024-07-08。
供应商能回补出 2015 年起的沪市委托, 但多出来的年份恰恰是主动方申报行缺失最严重的段。
反过来: 主动方识别决定了订单流研究的上限
订单流分解 (Order Flow Decomposition) 的核心做法是按「主动方是否 HFQ」拆订单流, 发现非 HFQ 订单的不平衡因子预测力最强。但这个分解的前提是能正确识别哪一侧是主动方—— 识别错了,「非 HFQ」这个子集里就混进了主动方订单, 分解结论直接失效。
沪市 TickBSFlag 有 N (未知) 这个第三值, 说明交易所自己也无法对全部成交判定内外盘;
深市连这个字段都没有。所以任何 A 股订单流研究的第一步都应该是:
先验证主动方判定在所用数据源上的覆盖率, 再谈因子。
实操建议
- 跨所代码抽象一层
aggressor_side(trade, orders), 屏蔽BuyNo/BidApplSeqNum的命名差异。 - 报告主动方覆盖率 (能查到委托号的比例) 作为数据质量指标, 不要默认它接近 100%。
- 深市
BidApplSeqNum/OfferApplSeqNum为0表示无对应委托, 沪市文档未定义对应值 —— 不要把沪市的0当成有效委托号。 - 沪市优先用
StockTick的Type区分记录, 别把 A 类 (新增委托) 与 T 类 (成交) 混在一个流里排序。 - 需要队列级信息 (谁挂在买一、谁挂在卖一) 时, 只能靠快照的
ORDERQTY_B1/BidOrders[50], 不能靠逐笔流重建——见 Level-2 档位与委托队列 (L2 Depth and Order Queue)。
与本 wiki 其他概念的连接
- 沪市逐笔文件演化 (SSE Tick File Evolution) · 深市高频表结构演化 (SZSE Feed Schema Evolution) — 字段级来源
- 订单流分解 (Order Flow Decomposition) — 依赖主动方识别的下游研究
- Level-2 档位与委托队列 (L2 Depth and Order Queue) — 委托流不可靠时的替代队列来源
- HFQ 高频报价识别 (Lifespan Threshold) — 报单到撤单的生命周期, 判定 HFQ 的另一条轴
引用
- 上交所《历史数据接口说明书》v1.1.5 表 3-9 / 表 3-11 / 表 3-13
- 深交所《数据中心五版行情数据结构 v3.0》
hq_order/hq_trade表 - 供应商样例包《文档对应时间范围区间》xls + README (600519 @ 20150105 实测)
- 中文摘要: summaries/202610-vendor-l2-sample-pack/202610-vendor-l2-sample-pack