4. 买卖方向字段与主动成交判定
逐笔成交数据里,买卖方向字段看起来只是一个字符或一个数字,但它决定了后续所有"主动买/主动卖"统计的正确性。如果方向字段读错,成交量分布、大单净流入、资金流向等指标会整体反向。本节围绕三件事展开:方向字段的编码规则、主动成交的判定逻辑,以及如何用逐笔委托数据做交叉验证。
一、方向字段的常见编码规则
不同数据源对买卖方向的编码并不统一,常见的有三类:
- 字母型:
B表示买方主动(Buy),S表示卖方主动(Sell),部分数据源用N表示未知或中性。 - 数字型:
1表示买入,2表示卖出;也有数据源用0表示买、1表示卖,或49/50(ASCII 码)表示 B/S。 - 带符号型:
+1/-1,或成交量本身带正负号,正为主动买、负为主动卖。
整理代码字典时,第一步就是把原始字段的取值域完整枚举出来,而不是凭经验假设"1 就是买"。建议在字典中为每个方向字段记录:字段名、原始取值、含义、是否含未知值、以及该取值在样本中出现的频次。频次统计能快速暴露异常——例如某天数据中出现了字典里没有的 3,说明数据源升级或字段含义变化,必须回查。
二、主动成交的判定逻辑
逐笔成交记录的是"某一笔撮合",方向字段描述的是哪一方主动发起。判定逻辑的本质是比较成交价与当时盘口的买一价、卖一价:
- 成交价等于或高于卖一价(成交在卖方挂单价上),买方主动吃掉卖盘,记为主动买入。
- 成交价等于或低于买一价(成交在买方挂单价上),卖方主动砸向买盘,记为主动卖出。
- 成交价介于买一与卖一之间(如市价单在价差内成交),需要结合逐笔委托的到达顺序判断,不能仅凭价格。
很多数据源已经在方向字段中直接给出了判定结果,此时我们做的是"信任但校验":用价格与盘口的关系反推方向,与字段值比对,统计一致率。若一致率低于预期(例如低于 95%),说明字段含义与我们的理解不符,或数据存在错位。
下面这张图展示了从逐笔成交记录到主动方向判定的完整信号链,以及用逐笔委托做验证的回路:
三、与逐笔委托的关联验证
逐笔成交只告诉我们"成交了",逐笔委托才告诉我们"谁先挂的单、谁后到的单"。验证的基本思路是:对每一笔成交,找到成交时刻之前最近到达、且价格匹配的委托,看这笔委托是买还是卖。如果成交由买方主动发起,那么成交前最后到达的应该是买方委托(价格不低于卖一),反之亦然。
实际操作中,交易所的逐笔数据通常带有撮合序号或成交编号,可以直接把成交与委托配对。以常见的配对逻辑为例:
# 伪代码:用委托方向校验成交方向
for trade in trades:
# 找到成交编号对应的主动方委托
order = orders_by_trade_id.get(trade.trade_id)
if order is None:
unmatched += 1
continue
expected = 'B' if order.side == '买' else 'S'
if trade.direction == expected:
matched += 1
else:
mismatch.append((trade, order))
consistency = matched / (matched + len(mismatch))
示例中若某日样本共 50 万笔成交,配对成功 49.2 万笔,其中方向一致 48.6 万笔,则一致率约为 98.8%,属于正常范围;若一致率只有 70% 左右,常见原因是方向字段的 1/2 含义被弄反,或成交与委托的配对键用错(例如用了委托号而非成交编号)。
四、整理成字典时的落地要点
把上述内容沉淀到代码字典中,建议每个方向相关字段至少包含以下条目:原始字段名、数据类型、取值枚举及含义、未知值处理方式、判定依据(价格比较还是委托配对)、以及验证一致率的参考阈值。对于同时存在"方向字段"和"主动方标识"两个字段的数据源,要明确二者是否冗余、以哪个为准,避免下游重复计算或相互矛盾。
方向字段虽小,却是逐笔数据链条上最容易出错的一环。把编码规则枚举清楚、把判定逻辑写明白、把委托验证跑通,后续的成交量分布、资金流向等衍生指标才有可靠的地基。