逐笔成交的双向委托引用 (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 股订单流研究的第一步都应该是: 先验证主动方判定在所用数据源上的覆盖率, 再谈因子。

实操建议

  1. 跨所代码抽象一层 aggressor_side(trade, orders), 屏蔽 BuyNo/BidApplSeqNum 的命名差异。
  2. 报告主动方覆盖率 (能查到委托号的比例) 作为数据质量指标, 不要默认它接近 100%。
  3. 深市 BidApplSeqNum/OfferApplSeqNum 为 0 表示无对应委托, 沪市文档未定义对应值 —— 不要把沪市的 0 当成有效委托号。
  4. 沪市优先用 StockTick 的 Type 区分记录, 别把 A 类 (新增委托) 与 T 类 (成交) 混在一个流里排序。
  5. 需要队列级信息 (谁挂在买一、谁挂在卖一) 时, 只能靠快照的 ORDERQTY_B1/BidOrders[50], 不能靠逐笔流重建——见 Level-2 档位与委托队列 (L2 Depth and Order Queue)。

与本 wiki 其他概念的连接

引用

  • 上交所《历史数据接口说明书》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