3. 逐笔成交与委托流水解析
在盘口信号设计中,最容易出错的一步不是规则本身,而是把“成交明细”和“委托流水”混为一谈。这两类数据虽然都来自交易所逐笔推送,但描述的对象完全不同:成交明细记录的是已经发生的撮合结果,委托流水记录的是进入或离开订单簿的意图。前者回答“谁和谁在什么价格成交了多少”,后者回答“谁在什么价位挂单、撤单、改单”。如果方向标记建立在错误的数据源上,后续的主动买卖判断就会系统性偏移。
两类数据的字段特征与判别要点
逐笔成交(常见字段如成交编号、成交时间、成交价、成交量、买方委托号、卖方委托号、成交方向标记)的核心是“成交价 + 成交量 + 双方委托号”。其中买方委托号与卖方委托号是连接委托流水的关键外键,通过它们可以回溯每一笔成交对应的原始挂单。逐笔委托(常见字段如委托编号、委托时间、委托价格、委托数量、买卖方向、委托类型)的核心是“方向 + 价格 + 数量 + 类型”,类型字段通常区分市价单、限价单、本方最优等,撤单则表现为独立的撤单记录或委托状态变更。
判别时抓住三个差异:其一,成交明细一定有成对委托号,委托流水只有单一委托号;其二,成交明细的量是“已撮合量”,委托流水的量是“申报量”,后者可能部分成交后剩余继续挂单;其三,成交明细没有“撤”的概念,撤单只出现在委托流水侧。实战中常见错误是把委托流水里的“买入委托”直接当作“主动买入”,这混淆了“挂单意图”与“成交方向”,必须通过成交明细中的方向标记或委托号回溯来校正。
主动买卖方向标记的识别口径
方向标记有两种来源,必须明确采用哪一种并全文统一。第一种是交易所直接给出的方向字段(如“B/S”或“主动买/主动卖”),它由撮合系统在成交瞬间确定,可靠性最高。第二种是自行推算:以成交价与当时买卖一档价比较,成交价等于或高于卖方一价记为主动买,等于或低于买方一价记为主动卖,落在买卖价之间则记为中性。推算口径依赖逐笔快照的时点对齐,若快照与逐笔存在时间差,边界成交容易被误判,因此建议优先使用交易所方向字段,推算仅作为缺失时的补充。
需要特别强调参照约定:本文“主动买”指买方以卖方报价成交、消耗卖盘挂单;“主动卖”指卖方以买方报价成交、消耗买盘挂单。净额定义为主动买量减主动卖量,正值表示买方主动性占优。这一约定在后续所有规则与图示中保持一致,切换口径必须显式说明。
清洗与方向归类实战
下面以一段教学示例数据说明处理过程(数据为合理假设,非实测)。假设某时刻买一 10.51、卖一 10.52,收到三条记录:委托流水显示委托号 10023 买入限价 10.52 共 800 股;成交明细显示成交编号 90011,成交价 10.52、成交量 300,买方委托号 10023、卖方委托号 10008,方向标记 B;随后委托流水显示 10023 撤单 500 股。处理步骤如下:
- 去重:以成交编号为唯一键,防止推送重发导致重复累计;撤单记录以委托编号 + 撤单序号去重。
- 关联:用买方委托号、卖方委托号把成交挂回原始委托,确认该笔成交确实由 10023 触发,而非同价位其他挂单。
- 方向归类:读取方向标记 B,归为主动买 300 股;若标记缺失,则用成交价 10.52 ≥ 卖一 10.52 判定为主动买,两者一致。
- 剩余量处理:委托 10023 申报 800、成交 300、撤单 500,账目闭合,说明该委托已终结,不应再把剩余 500 计入未成交挂单。
- 累计净额:将本笔主动买 300 计入区间净额,若同区间另有主动卖 120,则净额为 +180,表示买方主动。
示例记录(教学假设)
委托: {id:10023, side:B, type:LIMIT, price:10.52, qty:800, status:PARTIAL}
成交: {tradeId:90011, price:10.52, qty:300, buyOrd:10023, sellOrd:10008, flag:B}
撤单: {ordId:10023, cancelQty:500}
归类结果
主动买 += 300
委托 10023 剩余挂单 = 800 - 300 - 500 = 0(已终结)
区间净额 = +300 - 120 = +180
完成上述处理后,输出应是一张按时间排序、每行含成交编号、成交价、成交量、主动方向、关联委托号的清洗表,以及按区间汇总的主动买量、主动卖量与净额。只有这张表干净且口径统一,后续的盘口触发规则才有可靠输入;否则规则越精细,偏差被放大的风险越大。