2. 订单生命周期与撤单类型
要判断一笔撤单是“异常”还是“正常调仓”,前提是先把订单从生到死的完整链路看清楚。订单生命周期可以概括为:委托提交 → 风控/合规校验 → 报入交易所 → 撮合等待 → 部分成交或全部成交 → 撤单请求 → 撤单确认 → 终态归档。在这条链路上,撤单并不是一个孤立动作,而是订单在“未完全成交”状态下被主动或被动终止的过程。理解撤单发生在链路的哪个位置、由谁发起、剩余数量是多少,是后续特征对照的基础。
从状态机角度看,一笔订单通常经历“已提交(Pending)—已报(Submitted)—部分成交(PartiallyFilled)—已成交(Filled)/已撤(Cancelled)/废单(Rejected)”等状态。关键点在于:只有处于“已报”或“部分成交”状态的订单才可能被撤;已全部成交的订单无法撤单,已撤订单也不能再次撤单。撤单请求发出后,还存在一个“撤单待确认(PendingCancel)”的中间态——此时订单既可能被成功撤销,也可能因为对手方恰好成交而撤单失败。这个中间态是实盘中极易被忽略、却对异常识别非常重要的窗口。
接下来区分四类撤单。第一类是主动撤单:由策略或交易员主动发起,常见触发包括限价单价格偏离盘口过远、信号反转、超时未成交、发现更优报价等。它的特征是“有明确决策来源”,撤单时间点往往与行情变化或策略逻辑切换同步。第二类是被动撤单:并非策略本意,而是被交易所或风控系统强制终止,例如价格超出涨跌停被废单、持仓超限被拒、账户资金不足、合规拦截等。被动撤单通常伴随拒单原因码,且往往在报单后极短时间内发生。
第三类是批量撤单:一次性撤销多笔订单,典型场景是收盘前集中清仓、策略整体下线、风控一键撤单。它的识别特征是“同一时间窗口内多笔撤单集中出现、撤单标的分散或集中于同一组合”。第四类是调仓驱动的撤单:因目标组合权重变化,原有挂单不再符合新目标而撤销,例如调仓日将某只股票目标权重从5%降到2%,原先按5%挂出的买单需要撤掉重挂。这类撤单与调仓事件强相关,撤单后往往伴随新的委托,形成“撤旧单—挂新单”的配对特征。
把生命周期与撤单类型对应起来看,可以得到一个实用的判断顺序:先看订单处于哪个状态(已报还是部分成交),再看撤单由谁发起(策略、风控、交易所),最后看撤单后的行为(是否重挂、是否清仓)。这三步能把大部分撤单归入上述四类,也为后续“异常撤单与正常调仓特征对照”提供了统一的观察坐标。需要强调的是,同一笔撤单可能同时具备多种属性,例如调仓日收盘前的批量撤单,既属于批量撤单,也属于调仓驱动,归类时应以“主导原因”为准,避免标签重叠导致统计口径混乱。
| 撤单类型 | 发起方 | 典型触发 | 时间特征 | 后续行为 |
|---|---|---|---|---|
| 主动撤单 | 策略/交易员 | 价格偏离、信号反转、超时 | 与行情或信号同步 | 可能重挂或放弃 |
| 被动撤单 | 交易所/风控 | 废单、超限、资金不足 | 报单后极短时间 | 通常无重挂 |
| 批量撤单 | 策略/风控 | 收盘清仓、策略下线 | 集中时间窗口 | 多笔同时撤销 |
| 调仓驱动撤单 | 策略 | 目标权重变化 | 调仓事件附近 | 撤旧单后挂新单 |
最后提醒一个工程细节:撤单请求发出到确认之间存在时延,实盘中应记录“撤单请求时间”和“撤单确认时间”两个时间戳,并记录撤单时的剩余数量。若只记录确认时间,会把“撤单待确认”窗口内的成交误判为撤单失败;若忽略剩余数量,则无法区分“全撤”与“部撤”。这两个字段是后续做异常识别时最基础、也最容易被遗漏的数据项。