:自动交易事故 Knight Capital——当错误以机器速度进入现实)
这是历史中的执行控制系列的第十三篇。第一篇历史中的执行控制一诺曼底登陆 D-Day 的天气窗口——没有正确的执行窗口就不执行。第二篇历史中的执行控制二切尔诺贝利——不要让错误穿过所有边界。第三篇历史中的执行控制三阿波罗 13——失败不是终点边界才是系统韧性。第四篇历史中的执行控制四图灵与 Bletchley Park——不是破解密码而是重构决策优势。第五篇历史中的执行控制五珍珠港——信号必须及时改变执行状态。第六篇历史中的执行控制六挑战者号 Challenger——工程边界不能被执行压力压过。第七篇历史中的执行控制七Therac-25——软件不能替代所有硬件安全边界。第八篇历史中的执行控制八火星气候轨道器——接口通过不代表语义一致。第九篇历史中的执行控制九阿丽亚娜 5 号——复用成功代码不代表新场景依然安全。第十篇历史中的执行控制十三哩岛——信号很多不代表系统形成了正确的状态判断。第十一篇历史中的执行控制十一冷战误报 Petrov——告警不等于行动。第十二篇历史中的执行控制十二核潜艇危机 Arkhipov——单点权力不能决定灾难性执行。前面十二篇里多数灾难以人的节奏展开、至少给了理解的时间。这一篇不同错误以机器速度进入现实——45 分钟一家华尔街巨头几乎被自己的系统交易到破产。摘要2012 年 8 月 1 日美股开盘后Knight Capital 的一套自动交易系统开始异常运行。在大约 45 分钟内它向市场发出了数百万条订单产生约 400 万笔成交涉及 154 只股票、超过 3.97 亿股公司最终因这些意外头寸损失约 4.6 亿美元。这起事故常被总结成一个软件错误让一家大公司几十分钟内巨亏。但从 Havenlon 的视角看真正值得讨论的不是程序员部署错了代码而是当错误进入自动执行链之后为什么没有一层能够及时限制它Knight 的系统并没有停止工作——恰恰相反它运行得飞快接收订单、生成指令、连接市场、持续成交不断把内部错误变成外部事实。这就是自动化时代最危险的失败形态系统不是不能执行而是在错误条件下依然拥有完整的执行能力。Knight Capital 给 Havenlon 的第十三课是机器速度不是系统韧性没有边界的自动化只会让错误更快进入现实。一、先把历史讲准确Knight Capital 当时是美国最大的做市商之一约占全美股票交易量的 10%。事发前它正为纽约证券交易所即将于 8 月 1 日上线的零售流动性计划RLP做准备需要更新一套关键系统SMARSSmart Market Access Routing System智能市场准入路由系统——一个高速自动路由器负责把上游传来的母订单拆成大量子订单发往市场。7 月 27 日到 31 日之间一名技术员手工把新的 RLP 代码逐台部署到8 台 SMARS 服务器上却漏掉了其中一台而 Knight既没有书面部署规程、也没有第二人复核、更没有自动化的部署后校验于是没人发现这台服务器仍停留在旧状态。问题的引信藏在一个细节里新的 RLP 代码复用了一个当年用来激活旧功能的标志位。这个旧功能叫Power Peg——2000 年代初的一段测试用做市程序本就是设计来高买低卖以压力测试其他系统的。它大约在 2003 年就被弃用但服务器端代码从未被删除而且那个本该在累计成交量达到上限时叫停它的逻辑在2005 年的一次重构中被搬走、失效了。于是 8 月 1 日开盘7 台正确更新的服务器正常处理 RLP而那台漏更新的服务器把复用的标志位理解成了启动 Power Peg。更值得注意的是开盘前的早上 8:01Knight 内部系统就已经发出了 97 封含 Power Peg disabled 字样的报警邮件——但这些警告没有被升级、也没有在开盘前得到处置。9:30 开盘后这台失控的服务器在处理区区212 笔零售母订单时发出了数百万条子订单45 分钟内成交约400 万笔、154 只股票、逾 3.97 亿股让 Knight 在 80 只股票上形成约 35 亿美元净多头、在 74 只股票上形成约 31.5 亿美元净空头最终亏损约4.6 亿美元部分资料记为约 4.4 亿。还有一个极具警示意义的细节事发时SMARS 团队最初的直觉是我们被攻击了于是在还没弄清病因的情况下把所有服务器回滚到旧版本——而旧版本里 Power Peg 逻辑仍然挂在那个被复用的标志位上结果错误逻辑被扩散到了全部 8 台服务器越修越糟。事后美国证券交易委员会认定 Knight 违反了市场准入规则Rule 15c3-5公司几近破产靠紧急注资续命最终并入 KCG。二、这不是一次系统宕机我们习惯把技术事故想象成系统无法运行服务器宕机、页面打不开、任务停止。这类故障通常很明显——系统停了业务也停了。但 Knight 的事故完全不同系统没有停它仍在处理订单、访问市场、产生成交执行能力本身完好无损只是正在错误地执行。这是一种比宕机更危险的状态系统活着、权限有效、连接正常、执行路径畅通但它正在做错误的事情。对高风险系统来说最危险的问题往往不是能不能运行而是——系统是否会在错误状态下继续运行。三、错误代码不可怕没有边界才可怕任何复杂软件都可能有缺陷测试无法覆盖所有组合部署可能出现差异旧逻辑可能被意外触发配置可能不一致人也会犯错。如果把 Knight 的事故简单归结为软件有 bug就会错过真正的工程问题。最初的错误确实发生在软件和部署层。但一个软件错误之所以能变成数亿美元损失是因为它后面没有足够强的限制没有在异常订单速率下立即停止没有在库存快速偏离时立即限制没有在异常成交规模下立即切断没有让单台服务器的异常被隔离没有让旧代码的触发迅速进入拒绝状态。所以真正的问题不是为什么软件会出错而是——软件出错之后为什么仍然拥有如此之大的执行权四、自动化把思考时间从系统里拿走了人工执行天然存在延迟人要看屏幕、理解信息、输入命令、确认结果发现异常后停下来。这种延迟有时降低效率但也常常为系统提供缓冲。自动化的价值就是去掉这些延迟——但它在去掉人工延迟的同时也可能去掉系统发现错误的时间。Knight 的异常活动持续约 45 分钟。对人来说45 分钟只是一场会议对自动交易系统来说45 分钟足以完成数百万次现实动作。这就是机器速度改变风险性质的地方错误不再等待组织理解它——错误会先完成执行再等待人类解释。五、合法订单也可能写成错误的现实Knight 发出的订单并不是格式非法的数据包它们能进入市场、被交易所接受、与其他订单成交、形成真实持仓、产生真实资金后果。从协议和接口角度看它们能够被执行——但能够被执行不代表应该被执行。这与本系列反复强调的判断一致Payload 合法不代表语义正确。订单格式可以合法、账户可以合法、权限可以合法、通道可以正常、市场也可以正常接受它但只要这组订单已经偏离真实业务意图那么每一次成功成交都是系统在把语义错误写进现实。所以执行安全不能只检查请求是否合法还必须检查这组请求是否仍然表达原始意图数量和频率是否仍在预期范围系统状态是否发生异常偏移——市场接口验证了这些订单可以执行而 Knight 内部缺的正是判断它们是否应该继续执行的那层边界。六、部署成功不代表状态一致旧代码也不是历史软件部署通常会给出一个干脆的结论发布成功。但发布成功往往只表示部署命令执行完成、健康检查返回正常它并不证明所有节点版本一致、旧代码已彻底移除、每台服务器都处于相同状态。Knight 的问题正在这里控制平面认为部署完成执行平面却仍有一台停在旧语义里——这是一种典型的状态分裂。用 Havenlon 的语言说上层记录的状态不能自动替代执行节点的真实状态。云端说已同步不代表本地一致平台说部署成功不代表每个执行器都正确。最终执行前系统必须验证执行边界真正看到的状态。Knight 还揭示了一个常被忽略的风险停止使用不等于失去执行能力。Power Peg 早已被弃用、在团队认知里近乎遗忘但它仍存在于执行路径中一个被复用的标志位就足以把它唤醒。一个功能可以在文档上被废弃、可以多年无人调用但只要它还能被某种输入激活它就不是历史而是一项潜在能力。这对 AI Agent 尤其重要一个旧工具仍挂在 Agent 权限里、一个过期 API 仍能访问、一个废弃脚本仍有生产权限、一个旧策略仍能被回滚启用——它们看似沉睡但只要还能执行就仍属于攻击面与失控面。可靠的系统不能只问这个功能现在常不常用还要问它是否还能执行谁能重新激活它激活后受哪些边界约束七、告警不是停止能力Kill Switch 不能等根因Knight 的系统并非完全没有信号——开盘前那 97 封报警邮件就是证据事故中异常也很快变得明显。但这和三哩岛的教训一样系统有信号、人也开始意识到异常但信号没有迅速转化成执行状态的变化。邮件不是边界仪表盘不是边界有人看见异常也不是边界。真正的边界必须能做到异常速率超阈值就自动收缩库存快速偏离就限制新增执行版本不一致就拒绝启动异常订单持续产生就切断市场连接执行状态无法解释就进入 Safe Mode。如果告警只能催促人类尽快调查、而机器仍在全速执行人和机器之间就会形成一场不对称竞赛——机器负责制造后果人负责理解后果而通常机器会赢。这就引出高风险自动化最基础的一种能力Kill Switch。它不修复程序、不做根因分析、不是事后审计它只回答一个问题——当前系统已经明显异常是否应该暂时失去继续执行的能力关键在于停止不需要等待根因完全确定。版本为什么不一致、旧代码为什么被触发、部署哪里出错都可以之后再查但异常执行正在发生时第一目标应该是先阻止错误继续进入现实。Knight 恰恰缺了这层能在理解病因之前就先止损的能力——它甚至在没弄清病因时先回滚反而把错误扩散到了所有服务器。八、事后审计太晚人工审批也不是充分答案金融交易有一个鲜明特点一旦订单进入市场并成交结果就不再只存在于公司内部——它会影响真实持仓、真实资金、交易对手、市场价格、监管义务和公司资本。所以完整日志无法替代事前边界。系统事后可以精确重建哪台服务器版本错了、哪段旧代码被触发、发了哪些订单、亏损如何形成但这些都无法让已经成交的订单重新变成从未发生。这正是执行控制与审计的根本区别审计负责解释现实执行控制负责限制现实。看到这里一个直觉答案是关键操作应该人工确认。但在机器速度下人工审批本身并不充分——人不可能逐笔审批数百万条订单也无法在毫秒级系统里逐步理解每次状态变化。自动化规模一旦建立单纯把人塞回流程往往只会制造一个形式上的按钮。真正需要的是让系统拥有机器速度下的自动边界单位时间订单数上限、单策略最大风险、库存偏离阈值、节点版本一致性证明、异常行为自动隔离、不可逆动作分层授权、超出模型范围后自动降级。边界必须和执行运行在相近的速度上——如果交易以毫秒发生而控制依赖十分钟后的人工会议那么控制就不在执行路径里只是在旁边观察。九、AI Agent 正在获得类似的机器执行速度Knight 是自动交易时代的案例但它对 AI Agent 时代更有直接意义。Agent 正在从回答问题走向连续执行生成代码、调用 API、修改配置、部署服务、转移资产、导出数据、控制设备并根据结果继续下一步。它和自动交易系统有一个共同点——一个上游错误可以被拆成大量下游动作一个模糊目标可能变成几十次工具调用一次上下文污染可能影响整个执行计划一个错误策略可能被复制到所有节点一次权限授予可能让 Agent 连续操作多个系统。而 Agent 的执行速度远高于人类理解速度。等人发现不对它可能已经改了多个环境、删了大量数据、完成了资产转移、更新了权限关系、触发了其他自动化系统。这就是 Knight 对 AI Agent 最直接的警告不要把 Agent 的执行能力建立在人总能及时发现错误之上。十、系统必须限制错误能够扩大到多大高可靠系统不应该只问错误会不会发生答案几乎一定是会而更应该问一个错误最多能影响多大范围这就是灾难半径。单个节点出错会不会影响全部系统单个策略异常能不能访问全部资产一个 Agent 误判能不能调用所有工具一个 Owner 账户失陷能不能绕过所有边界一段旧代码被激活能不能产生无限执行Knight 的错误之所以危险正是因为那段异常逻辑拥有足够大的市场访问能力、并能持续产生海量订单——错误没有被限制在一台服务器、一小段时间、有限数量的动作里。真正可靠的边界应该让错误被收敛在一个节点、一小段时间、有限的动作数、有限的资产规模、有限的权限范围、可恢复的影响区域之内。这就是 Havenlon 强调的损失收敛Havenlon 不能保证上游永远不出错但它应该努力做到——任何一个错误都不能无限扩张。十一、Havenlon 的答案让执行能力始终受独立边界约束Knight 的系统问题不能只靠更好的代码解决。更好的测试、更严格的部署、更强的监控都很重要但只要系统仍然拥有大规模、连续、不可逆的执行能力就必须存在独立的限制。Havenlon 的结构把执行拆成多个层级Agent 可以生成计划业务系统可以构造请求SaaS 可以协调策略Owner 和成员可以参与治理执行设备验证当前状态本地边界限制资产、对象、频率和窗口异常出现时系统自动降级或拒绝最终动作形成可验证证据。这里的核心不是增加一个审批框而是确保——执行能力永远不是无限的。任何软件、任何 Agent、任何账户、任何策略、任何节点都只能在边界之内行动。也正因如此需要重新理解停止这件事。在追求高可用的系统里停止常被当成失败——服务不能中断、交易不能暂停、自动化不能卡住。但 Knight 告诉我们系统持续运行不一定代表系统健康有时系统继续运行本身才是最大的风险。真正可靠的系统必须区分两种停止因基础设施故障而停止可能代表能力丢失和因执行边界生效而停止代表控制仍然存在。当订单速率异常、节点状态不一致、资产暴露急剧扩大、执行路径无法解释时系统主动停止不是失败而是在证明——自动化仍然服从边界。十二、从十三篇看主线执行控制的第十三个侧面D-Day没有正确窗口不执行。切尔诺贝利不要让错误穿过所有边界。Apollo 13失败不是终点边界才是系统韧性。Bletchley Park不是破解密码而是重构决策优势。珍珠港信号必须及时改变执行状态。挑战者号工程边界不能被执行压力压过。Therac-25软件不能替代所有硬件安全边界。Mars Climate Orbiter接口通过不代表语义一致。Ariane 5复用成功代码不代表新场景依然安全。Three Mile Island信号很多不代表形成了正确的状态判断。Stanislav Petrov告警不等于行动机器判断不能直接获得不可逆执行权。Arkhipov单点权力不能决定灾难性执行。Knight Capital当错误获得机器速度事后审计永远追不上现实。这十三个故事共同指向一个核心判断自动化越强执行边界就越不能只存在于人工流程里。结语Knight Capital 的事故不该只被记成一次昂贵的软件部署失败。它真正揭示的是自动化系统的一个根本问题机器不会因为结果看起来荒谬就自然停下来。只要输入能触发逻辑、只要权限仍然有效、只要市场仍在接受订单、只要系统没有遇到硬边界它就会继续执行。这也是 AI Agent 时代即将普遍面对的问题。Agent 不会天然知道自己正在扩大错误软件不会天然因为损失加速而产生克制自动化系统也不会天然理解这件事已经不该继续。所以——克制必须被设计限制必须被编码拒绝必须拥有真实能力Safe Mode 必须能在机器速度下生效。Knight Capital 给 Havenlon 的第十三课是事后知道发生了什么不等于事前拥有控制。 当错误以机器速度进入现实日志再完整也只能解释已经发生的损失。自动化的价值是更快地完成正确动作而执行控制的价值是不让错误动作也跑得那么快——让错误不能无限执行让异常能够及时停止让单个节点不能放大整个系统的风险让机器速度始终服从边界速度。参考资料U.S. SEC,In the Matter of Knight Capital Americas LLC行政命令Release No. 706942013 年 10 月 16 日违反 Rule 15c3-5 市场准入规则Doug Seven,Knightmare: A DevOps Cautionary TaleKnight Capital 事故的多方复盘SMARS、Power Peg、标志位复用、8 台服务器部署、97 封开盘前报警邮件、212 母订单 / 400 万笔成交 / 154 只股票 / 3.97 亿股 / 约 4.6 亿美元损失、回滚扩散等细节