2. 报撤单数据基础
报撤单频率异常统计的全部结论,最终都建立在一条条原始订单与撤单记录之上。如果字段口径不统一、时间戳精度不足、账户与产品维度缺失,后续无论用多复杂的指标和模型,得到的"高频报撤"都可能只是数据缺陷造成的假象。本节围绕四件事展开:一条记录应该长什么样、时间戳要精确到什么程度、账户与产品维度如何组织、数据从哪里来以及要满足哪些质量要求。
一、订单与撤单的字段结构
交易所行情与委托回报中,订单和撤单通常以"事件"形式出现,而不是以"订单最终状态"出现。一条订单事件至少应包含以下核心字段:报单编号(交易所或柜台生成的唯一标识,用于把订单与其后续撤单关联起来)、账户标识、产品/合约代码、买卖方向、委托价格、委托数量、事件类型(报单、撤单、成交、废单等)、事件时间、交易市场与交易时段。撤单事件则必须携带被撤订单的报单编号,否则无法计算"一笔订单存活了多久"。
实践中常见的字段陷阱有三类。第一类是报单编号复用或缺失:部分柜台在日终或跨市场时编号规则不同,若直接以编号做关联,会把不同订单误判为同一笔。第二类是撤单数量与撤单类型混淆:全额撤单与部分撤单在频率统计中含义不同,部分撤单可能对应同一订单的多次撤单事件,若不区分,撤单次数会被系统性高估。第三类是废单与拒单未单独标记:被交易所拒绝的报单往往在极短时间内"报—废",若与正常撤单混在一起,会人为制造出大量"瞬时撤单"。
因此,建议在入库时就把事件类型标准化为有限枚举,例如:NEW(报单)、CANCEL(撤单)、FILL(成交)、REJECT(废单/拒单)、AMEND(改单)。改单在多数交易所表现为"撤旧单+报新单",需要明确是否拆成两条事件处理,并在统计口径中保持一致。
二、时间戳精度:频率统计的分母与分子
报撤单频率本质上是"单位时间内的报撤次数",时间戳精度直接决定频率的可计算性。若时间戳只精确到秒,那么在同一秒内完成的"报单—撤单"会被压缩为同一时刻,无法区分先后,也无法计算订单存活时长。对于高频报撤场景,建议至少保留毫秒级时间戳,条件允许时保留微秒或纳秒级,并明确时间基准(交易所撮合时间、柜台时间还是本地采集时间)。
不同来源的时间戳不能直接混用。交易所回报时间、柜台落库时间、本地接收时间三者之间存在网络与处理延迟,若用本地时间计算订单存活时长,会把链路延迟计入"存活时间",导致撤单速度被低估或高估。规范做法是:以交易所事件时间为统计基准,本地时间仅用于链路监控与延迟分析,并在数据表中同时保留两类时间字段,标注清楚来源。
三、账户与产品维度
频率异常统计通常不是在全市场层面做,而是按"账户—产品—市场"的组合维度展开。账户维度用于识别同一交易主体的行为模式,产品维度用于区分不同合约的流动性与报撤特征,市场维度用于隔离不同交易所的规则差异。三者应作为联合主键的一部分,避免把不同产品的报撤次数简单相加。
账户维度还需注意账户与交易单元、席位的关系:同一实际控制人可能通过多个账户报单,若只按账户统计,会低估整体报撤强度;反之,若把不同主体的账户错误合并,又会造成误判。产品维度则要区分合约代码与产品代码,同一产品在不同月份合约上的报撤行为可能差异很大,统计粒度应与监管或风控关注的对象一致。
四、数据采集来源与质量要求
报撤单数据通常来自四个渠道:交易所委托回报、券商柜台委托流水、行情逐笔委托与快照、以及本地交易网关日志。四者的完整性与时效性不同:交易所回报最权威但可能不含账户信息;柜台流水含账户但存在落库延迟;行情逐笔适合做市场层面的报撤分析;网关日志适合排查链路问题。实际统计中应以一个主源为准,其余作为校验与补全,并明确记录每条数据的来源字段。
质量要求可以落到几条可执行的规则上。其一是唯一性:同一报单编号在同一市场同一交易日内只应出现一次报单事件,重复记录需去重并记录重复率。其二是完整性:每条撤单事件都应能关联到一条报单事件,无法关联的"孤儿撤单"应单独隔离而不是直接丢弃。其三是时序性:撤单时间必须不早于报单时间,出现负存活时长的记录说明时间基准或关联关系有误,需回溯。其四是一致性:事件类型、方向、市场等枚举字段必须落在预定义集合内,未知取值应进入异常池人工确认。
下面是一段可直接参考的入库校验伪代码,用于在统计前拦截典型脏数据:
-- 示例:报撤单事件入库前校验(伪SQL)
SELECT
order_id,
account_id,
product_code,
event_type,
event_time,
CASE
WHEN event_type NOT IN ('NEW','CANCEL','FILL','REJECT','AMEND')
THEN '未知事件类型'
WHEN event_type = 'CANCEL'
AND order_id NOT IN (SELECT order_id FROM events WHERE event_type = 'NEW')
THEN '孤儿撤单'
WHEN event_type = 'CANCEL'
AND event_time < (SELECT MIN(event_time) FROM events e2
WHERE e2.order_id = events.order_id AND e2.event_type = 'NEW')
THEN '时序异常'
ELSE '通过'
END AS check_result
FROM events;
需要强调的是,上述规则只是起点。真实数据中还会遇到跨日订单、盘后撤单、批量撤单等边界情形,统计口径必须在文档中写清楚:跨日订单按报单日归属还是按撤单日归属、批量撤单算一次还是按笔数计、废单是否计入报单次数。这些口径一旦确定,就应在字段说明和统计脚本中保持一致,避免同一指标在不同报表中给出不同数值。
把以上四部分串起来看,报撤单数据基础的核心不是"字段越多越好",而是关键字段齐全、时间基准统一、维度组合清晰、质量规则可执行。只有在这一层把口径固定下来,后续的报撤单频率计算、异常阈值设定和账户行为画像才有可靠的地基。