熔断开关、盘前风控与盘后控制
2012 年 8 月 1 日,周三,纽约时间 09:30:00。Knight Capital Group —— 美国头部做市商之一,承担约 10% 的零售股票订单流 —— 开盘。两周前一次代码部署中的路由标志位错配,激活了八台生产服务器中的一台上的休眠测试代码。这段休眠代码把每一笔进来的父订单都解读为在 上证 等价的小盘价格改进段做"高买低卖"循环(原始事件发生在美国主板,但故障模式与国内任何机构都共享)。系统在 45 分钟里送出大约 400 万笔订单覆盖约 150 只标的,堆出 70 亿美元 Knight 完全不想持有的多空头寸。盘前订单大小检查存在并起了作用 —— 它限制了单笔大小。问题是没有把自动 PnL 熔断接到盘中亏损上,也没有在 broker 聚合层面做自动报单速率限制。当 Knight 的风险团队在 10:15 手工识别出失控服务器并关掉时,公司已经亏掉 4.4 亿美元;救命的 4 亿美元紧急股权融资把现有股东几乎稀释干净;Knight 四个月后被 Getco 收购。每一笔实盘订单都过盘前风控闸门、每一台桌都配多触发自动熔断开关、没有熔断触发的日子就是审计熔断的日子 —— 这是 Knight 案给整个量化行业留下的强制纪律。本课结束时你应当能背诵七项盘前检查、三类熔断触发、盘后对账流程,以及强制这一切的监管框架。
本课讲控制层 —— L1 在步骤 6(盘前风控闸门)与步骤 13(盘后对账)处命名、L2 已打开的 FIX 等价通道与 EMS 之间的拦截层。下面分五块。
(A) 美国 15c3-5 规则与五大类强制控制
美国市场准入规则(15c3-5)2010 年 11 月 3 日通过,直接回应 2010 年 5 月 6 日"闪电崩盘",2011 年 11 月 30 日全面合规。规则适用于所有提供市场准入的经纪商 —— 包括直接市场准入(DMA)模式即买方机构通过保荐经纪商发 FIX 单到交易所。经纪商对每一笔订单的盘前风控闸门负责。规则授权五大类盘前盘后控制。
下面这段内联代码列表固定五大类(沪 / 深 / 中金所适用的国内 CSRC《程序化交易管理暂行规定》2024 年 10 月 8 日生效一一映射,标签翻译但结构同):
(1) credit_and_capital_limits
(2) erroneous_order_limits
(3) restricted_list_and_hard_blocks
(4) pre_trade_regulatory_compliance (Reg SHO + Reg NMS + LULD + market-wide circuit breakers)
(5) post_trade_surveillance
类 1 —— 经纪商对每个客户、每条策略设资金风险阈值(最大名义敞口、单策略风险资本)。类 2 —— 拒掉超过大小或价格偏离阈值的订单(俗称的"乌龙指"检查)。类 3 —— 限制名单封锁:内幕信息标的、员工 36 小时静默期、法务封锁、观察名单。类 4 —— 监管前置:沪深 涨跌停 / 中金所 价格 涨跌幅 限制 / 国债期货 平仓 优先(类似 美国 LULD 与市场级熔断的作用)、可融券 标的 与 融资融券 牌照核查(对应 Reg SHO 的可借核查)、不交易日 / 异常停牌核查。类 5 —— 盘后监控操纵、分层、欺诈撤单、自成交,并按要求上报(国内对应大额异常交易报告)。
国内对应监管:中基协 对 私募 的程序化交易自律规则、证监会《程序化交易管理暂行规定》要求高频与一般程序化客户分级报备、上证 / 深证 程序化交易管理实施细则(规则文本明文要求 异常交易行为监控、报单速率限制、异常撤单监控、自成交防止、大额持仓报告 5 类),与美国市场准入规则在结构上一一对应。
(B) 单笔子单七项盘前检查
EMS 产出的每个子单都过一个坐在 EMS 与 FIX 通道之间的盘前风控闸门 —— L1 生命周期的步骤 6,典型 10–100 微秒一笔。
下面这段内联代码列表固定七项检查:
(1) max_order_size (notional + share-count vs ADV)
(2) max_price_deviation (<= ±5% of last-trade or <= ±10 ticks)
(3) duplicate_or_rate_limit (max orders/sec per account or ClOrdID-prefix)
(4) account_exposure_limit (position + sector + VaR + gross/net)
(5) restricted_list_check (legal-block + watch-list + halt)
(6) self_trade_prevention (STP via FIX 7928 SelfMatchPreventionID)
(7) short_sale_locate (Reg SHO US / 融资融券 标的核查 CN)
检查 1 —— 名义额与股数上限,目的是把单笔市场冲击与对盘中最大回撤的贡献框住。典型阈值:单笔名义不超过 ADV 的 1%(经验法则,使流动性大盘 单笔市场冲击小于 2 bp 的滑点 并把单笔交易成本控制住);单笔股数上限,流动性大盘 ≤ 50,000 股,小盘 ≤ 5,000 股。数据源是 OMS 每日刷新的单股 ADV 表。检查 2 —— 限价不超过最新成交价的 ±5%(或 ±10 个 tick,取大;有些场所用 ±3% 作"明显错误"阈值);数据源来自 L2 行情接入。沪深 主板 还需叠加 涨跌停 上下界:挂涨停下不允许买、跌停上不允许卖。检查 3 —— 滑动窗口报单速率每秒上限;典型 100 单/秒(普通策略账户)到 1,000 单/秒(亚 10 微秒托管 HFT)。沪深 交易所明文规定 单账户 每秒不超过 300 笔(主板)、200 笔(ETF 期权)、100 笔(中金所 股指期货);头部 私募 与外资 HFT 在国内通过 OES / STEP / CTP 协议落地时,这条线由经纪商在网关侧硬约束。检查 4 —— 单股头寸 / 行业 / 风险价值(VaR)/ 杠杆上限四线齐查;数据源是 OMS 与 4.4.2 的风控引擎。
检查 5 —— 用集合查询比对账户限制名单:法务封锁、内幕静默、观察名单、监管停牌、当日 涨跌停 触发后剩余时段被限。检查 6 —— 自成交防止;通过 FIX 7928 SelfMatchPreventionID(国内对应自成交标识)告诉场所撤掉挂单端、新单端或两端。沪深 / 中金所 / 商品期货所 都明确禁止自成交;触发后场所自动撤单。检查 7 —— 卖空 标的可融核查。国内的卖空走 融资融券 通道,一只标的需在两融可融券标的清单(沪深 各约 1000 只)且券商有融券余量;OMS 的可融券表存有"融券锁定"确认;盘前闸门校对,无锁定的卖空单直接拒。Reg SHO 是 美国 对应规则,要求经纪商对每笔卖空提供"可借确认"(locate)。
(C) 熔断开关 —— 三类触发与熔断动作
熔断开关是一台断路器。触发时它(i)撤掉所有会话上所有挂单、(ii)拒绝新报单直到清除、(iii)寻呼当班运维、(iv)写一条 KILL_SWITCH_TRIPPED 事件到审计 trail,带触发原因。
下面这段内联代码列表固定三类触发:
(a) human_button (desk-head physical big-red button + OMS-dashboard kill)
(b) automated_PnL_or_position_breach (intraday loss > -X bp -> freeze; gross > leverage cap -> freeze)
(c) automated_infrastructure_failure (market-data stale > N seconds OR FIX session disconnect > N seconds OR risk-engine heartbeat lost -> freeze)
触发 (a) —— 交易台台长工位上的物理大红按钮 + 总经理 / 风控总监可见的 OMS 控制台熔断键。人观察到明显失控(报单速率反常、成交标的离谱、市场事件意外)时手动按下。多数头部量化 私募 都配策略级熔断(只杀一条策略,其他继续)与全局熔断(全杀)。触发 (b) —— 监控进程每秒采样按策略 PnL;盘中回撤超阈值(典型:量化中性 -80 bp,中证500 增强 -200 bp,opportunistic 宏观 -300 bp,多策略组合层 -500 bp)就自动触发。头寸超线(总敞口 > 6 倍杠杆、单股 > 6% 集中度、行业 > 30%)同样触发。这就是 Knight Capital 缺的那一条。触发 (c) —— 心跳监控:行情接入(流动标的超 N 秒无 tick = feed stale = kill)、FIX 等价会话存活(超 2 × HeartBtInt 无心跳应答 = session dead = kill,见 L2)、风控引擎存活、drop-copy 存活。2020 年 3 月美国 LULD 多次熔断序列里这条触发正确发挥作用:行情失效时全行业熔断自动跳起,事先演练过的手工重启流程把熔断逐步清掉。
下面的 KaTeX 块公式固定 PnL 触发阈值:
$\theta_{kill}$ 是按策略设定的熔断阈值(bp)。典型值:量化中性 80 bp(国内 私募 头部 明汯 / 幻方 / 灵均 标定的常见线)、中证500 增强 200 bp、opportunistic 宏观 300 bp、多策略 pod 级 500 bp。Knight 教训直白:只写在纸上、没接到 PnL 自动触发器上的熔断就是装饰。没有熔断触发的日子就是审计熔断的日子。每月在非交易时段做"消防演练"验证三类触发都能跳;每季度"桌面演练"走一遍事件响应。
Formula Explorer
N * (1/lambda) - rho(D) 盘后对账与差异解决
收盘后,交易台跑 L1 步骤 13 命名的对账管道,验证 EMS 记录的每一笔成交与券商 PB / 结算商记录的每一笔吻合。
(1) T+0 drop-copy 比对 —— 对每个 ClOrdID,EMS 记录的成交(LastQty、LastPx、ExecID)与 PB drop-copy 成交逐字段比对。国内工具:恒生 O45 的对账模块 + 私募 自研 Python 对账脚本;外资 PB 通道下也用 SS&C Recon / Duco / Gresham。(2) 头寸对账 —— OMS 按标的 + 方向的头寸与 PB 头寸结单比对;差异来自漏记成交、子账户分摊错、未应用的分红 / 公司行动、前一日未结算交易。
(3) 差异分类。下面这段内联代码列表固定六类:
(1) missing_fill (PB has, EMS does not)
(2) duplicate_fill (EMS has, PB does not)
(3) price_mismatch (LastPx differs)
(4) quantity_mismatch (LastQty differs)
(5) side_mismatch (very rare - application bug)
(6) account_misallocation (correct fill, wrong sub-account)
(4) 差异解决 —— 分派给运营分析员,按 L2 的 grep ClOrdID=XYZ fix.log 纪律查 FIX 日志,如对方有问题则联系 PB,如己方有问题则调整 OMS。所有差异必须在隔日结算截止前关掉:沪深 现金股票 / ETF 走 CSDC 中国证券登记结算公司,截止在 17:00 上海;中金所 股指期货 走每日盯市,16:15 结算价发布。(5) 上报路径 —— 若差异超监管阈值(国内对应大额异常交易报告 / 中基协 自律 规则要求 私募 24 小时内上报),公司必须在法定时窗内披露。
(E) 工作样例 —— 某中证500 增强 私募 通过 国信证券 接 上证 / 深圳
某中证500 增强 私募 RMB 30 亿 AUM,直连 国信证券 接 上证 / 深圳。国信 在自家综合业务平台与 顶点风控 / 金仕达风控 / 恒生风控 模块组合上实现七项检查;私募 的 OMS(恒生 O45)喂给经纪商单股 ADV、账户敞口上限、可融券锁定表、限制名单。熔断开关是 私募 自研的 PnL 监控(每秒采样、量化中性 跳在 -80 bp;增强 跳在 -200 bp),叠加 国信 broker 级控制。
测试场景。(A) 送出 1,000,000 510300(沪深300 ETF)限价 4.80,当下最新成交 4.50(+6.7%);检查 2 拒掉(max price deviation)。(B) 当账户在 510300 已 4.5% 集中度对 4.0% 上限时,再送 500,000 510300;检查 4 拒掉(account exposure)。(C) 一秒内送 200 笔买入 1,000 股 510300;检查 3 拒掉(rate limit;沪深 300/秒 上限)。(D) 送出某不在 融券 可融 名单的标的的卖空;检查 7 拒掉(融资融券 标的核查)。(E) 盘中 PnL 累计到 -82 bp 对 -80 bp 阈值;触发 (b) 跳;全部挂单撤、新报单拒、寻呼当班、写 KILL_SWITCH_TRIPPED;策略冻结直至风控总监清栓。
下面这段围栅 python 代码块勾勒闸门:
# 证监会 程序化交易管理暂行规定 / 美国市场准入规则 — seven pre-trade checks
class PreTradeRiskGate:
def check_max_order_size(self, order):
"""Check 1: notional + share-count vs per-symbol ADV table."""
...
def check_max_price_deviation(self, order, last_trade_px):
"""Check 2: limit price within +/-5% of last trade or +/-10 ticks."""
...
def check_rate_limit(self, order, account_state):
"""Check 3: sliding-window orders-per-second per account."""
...
def check_account_exposure(self, order, position_state, var_table):
"""Check 4: position + sector + VaR + gross/net caps."""
...
def check_restricted_list(self, order, restricted_list):
"""Check 5: set-membership against restricted list."""
...
def check_self_trade(self, order, open_orders):
"""Check 6: STP via FIX 7928 SelfMatchPreventionID."""
...
def check_short_sale_locate(self, order, locate_table):
"""Check 7: 融资融券 标的与 融券 锁定 lookup."""
...
def run_all_checks(self, order):
"""Run checks 1-7 in order; return first failure or Accept."""
...
收束在纪律条款:没有熔断触发的日子就是审计熔断的日子。月度消防演练验证三类触发;季度桌面演练走一遍事件响应。
Exercise
你在运营一只通过 国信证券 直连 上证 / 深圳 的量化交易台。(i) 按顺序背诵美国市场准入规则的五大类(或国内 证监会《程序化交易管理暂行规定》对应五大类)。(ii) 按顺序背诵七项盘前检查,每项一行描述。(iii) 对下面三笔测试单指出被哪项拒绝:(A) 买入 1,000,000 510300(沪深300 ETF)限价 4.80,当下最新成交 4.50(+6.7%);(B) 买入 500,000 510300,账户已 4.5% 集中度对 4.0% 上限;(C) 一秒内送 200 笔买入 1,000 股 510300。(iv) 背诵三类熔断触发、熔断动作(撤全部挂单、拒新单、寻呼当班、写 KILL_SWITCH_TRIPPED),并给出量化中性 私募 的 θ_kill 阈值(bp)。(v) 走盘后对账流程:drop-copy 比对 → 头寸对账 → 差异分类(六类)→ 差异解决于隔日结算截止前(CSDC 17:00 上海)。(vi) 用一句话概括 Knight Capital 教训。
提示
提示
θ_kill 必须由触发 (b) 强制,而不是只靠触发 (a)。向 L4 的衔接:盘前风险报告把前一日对账完成状态作为 go / no-go 闸门;实盘熔断触发后启动事件响应剧本;本课定义的全部技术控制层会被 L4 包进每天运行交易台的人与系统的协同流程。