2012年8月1日早晨,美国做市商骑士资本(Knight Capital)的系统在开盘后45分钟内疯狂报单,亏损约4.6亿美元,一家华尔街老牌公司就此被压垮。而这场灾难的源头,不是黑客、不是行情、也不是算法策略本身,而是一段被“废物利用”的死代码,和一次漏发了一台服务器的手工部署。软件工程师 Tom Najdek 在 NDC Conferences 频道的演讲《How a Stock Trading Algorithm Created a 460M Loss in 45'》里,把这场事故当成一堂完整的软件工程课来讲。本文带你逐层还原这条视频的论证,并对每个关键主张做溯源与批判性审查——看没看过视频,都能多懂一层。
| 项目 | 内容 |
|---|---|
| 视频标题 | How a Stock Trading Algorithm Created a 460M Loss in 45'(直译:一套股票交易算法如何在45分钟亏掉4.6亿美元) |
| 频道 | NDC Conferences(NDC 大会官方 YouTube 频道) |
| 演讲者 | Tom Najdek(常驻伦敦的软件工程师) |
| 发布时间 | 2020年前后上线(据频道页面,本次未能实时核验精确日期) |
| 播放量 | 数十万至百万量级(以频道页面实时数据为准) |
| 时长 | 约40分钟技术演讲 |
| 观看方式 | 在 YouTube 检索上述英文标题即可找到(参考来源附检索链接) |
说明:本篇成稿环境无法实时抓取 YouTube 页面,以上条目以频道页面为最终依据;文中涉及的交易数字均转引自美国证券交易委员会(SEC)2013年行政令及当年主流财经媒体报道,不属于演讲者个人口径。
Najdek 的讲法不是堆时间线,而是像剥洋葱一样,把一个“看似离谱的意外”一层层剥回“处处可复现的工程疏漏”。按他的叙事顺序,可以拆成五层。
视频开场直接把观众拉回2012年8月1日美东时间上午9:30。纽约证券交易所的“零售流动性计划”(Retail Liquidity Program,RLP)当天上线,骑士资本作为参与做市商,开盘第一笔订单进入自家订单路由系统 SMARS 后,系统行为瞬间失控:对一个本应一次性完成的客户母单,路由器开始反复“补单”,以买价挂卖、以卖价追买——每一笔都在送钱。据 SEC 行政令记载,短短45分钟内,SMARS 在154只股票上产生了超过400万笔成交、约3.97亿股的交易量;到上午10点左右,骑士资本在约80只股票上累积了约70亿美元量级的净头寸(据当年彭博、《华尔街日报》报道,以净空头为主)。更具黑色幽默的一幕是:据当年媒体报道,事发当日上午10点前后,CEO Thomas Joyce 还在做客 CNBC 为 RLP 上线站台,浑然不知自家系统正在自毁。
这是全片最有知识密度的部分。Najdek 用伪代码逐步还原了 SMARS 里一个叫 Power Peg 的模块:它诞生于2003年,设计意图是“主动买卖吃价差”——追踪母单的累计成交股数,直到执行完母单数量才停手。问题是这个功能从未真正投产,2005年前后就被公司放弃。但和其他大多数“死代码”一样,它没有被删除,而是安静地躺在路由系统里。视频的核心论点在此亮出:杀死骑士资本的不是新代码,而是一段七年没人看过的旧代码。
2005年,另一位开发者在实现新的订单路由逻辑时,没有新建标识,而是复用了 Power Peg 的旧开关(flag)。按当时的设计:当这个开关被置位时,系统会重置“母单累计成交量”计数器。2008年,SMARS 又经历了一次重构,重置计数器的逻辑被删除了——但没有任何人意识到,那条老路径从此变成了一颗上膛的枪:一旦开关被触发,计数器永远不清零,系统就会认为母单永远没执行完,于是无限补单。据 SEC 行政令的表述,这个缺陷在系统里潜伏了多年,之所以从没出事,只是因为那个开关从来没被真正触发过。用 Najdek 的话说(大意):这不叫“没有bug”,这叫“还没引爆”。
引信在2012年8月1日早晨被点燃。为支持 RLP,骑士资本当晚向 SMARS 的8台服务器部署新代码——操作由技术人员手工完成,结果只复制到了7台,第8台仍在运行旧版本,且没有任何人发现。更微妙的是,两套版本“兼容”得足够好:系统正常启动、正常测试、正常接单,混版本运行毫无异常。直到 RLP 新订单类型首次带着那个熟悉的 flag 到达第8台服务器,沉睡的死代码被激活,循环报单开始。视频在这一层的落点是:手工部署的每一次“复制粘贴”,都是一个没有对账的分布式事务。
最后一层讲后果如何滚雪球:纽交所等交易所按规则作废了偏离超过60%的“明显错误交易”,但骑士资本留下的头寸损失已无法挽回;公司股价两日内暴跌七成以上,靠 Jefferies 牵头的一揽子高息优先股救助(条件苛刻到年化利息高得惊人)才免于破产;同年12月,公司宣布与高频做市商 Getco 合并,2013年更名 KCG Holdings,2017年被 Virtu Financial 以约14亿美元收购——独立存在的骑士资本就此消失。SEC 于2013年10月对骑士资本处以1200万美元罚款,这也是新颁布的“市场接入规则”(Rule 15c3-5)的标志性第一案。
这条视频的每一个技术细节都能在真实文献中找到出处,这也是它经得起反复观看的原因。
监管与事件史料。 事件的权威记录是 SEC 于2013年10月16日发布的行政程序令(In the Matter of Knight Capital Americas LLC,Release No. 34-70694),其中完整披露了 Power Peg 的来历、2005年的开关复用、2008年重构删除计数器重置、8台服务器漏发1台等细节——本文所有交易数字均出于此。当时主流财经媒体(彭博、路透、FT)的追踪报道则补充了资本层面的细节。两个来源相互印证,是这条视频史实可靠性的基础。
“技术债”的经典理论。 死代码 seven 年无人敢删、开关被后人“废物利用”,正是 Ward Cunningham 在1992年 OOPSLA 报告中提出“技术债”(technical debt)隐喻的极端案例:为了眼前省事(不新建标识、不删旧模块)欠下的债,最终以复利形式偿还——只不过骑士资本还的不是重构工时,而是4.6亿美元真金白银。
部署与发布工程。 “deploy ≠ release”是 Jez Humble 与 David Farley 在《Continuous Delivery》(2010)中的核心主张:部署到机器与向用户开放新逻辑必须是两个可独立控制、可回滚的阶段。骑士资本把两者捏在一次性手工操作里,且没有版本一致性校验。Google 的《SRE》(2016)进一步把“灰度发布、金丝雀、部署对账”变成了行业标准动作——如果8台服务器走的是自动化流水线加版本漂移检测,第8台的旧代码根本活不到开盘。
特性开关的生命周期。 Martin Fowler 在2015年的文章《Feature Toggles》中明确警告:开关是“技术债的一种”,必须绑定过期机制、用完即删。骑士资本的旧 flag 恰好是反面教材——开关活过了使用它的所有人和所有用途。
对继承代码的敬畏。 Michael Feathers 在《Working Effectively with Legacy Code》(2004)里给遗留代码下的定义是“没有测试覆盖的代码”。SMARS 的死路径多年无事故,营造出的安全感正是典型的“偏差正常化”(Diane Vaughan 在研究挑战者号事故时提出的概念):异常状态长期存在而无后果,会让组织把侥幸误认为稳健。
“一行代码毁掉一家公司”是标题党。 视频标题强调算法,但完整链条是:无人清理的死代码+随手复用的旧开关+重构时删掉的保护逻辑+无测试覆盖+手工漏发部署+缺失的订单金额与频率限额+没有应急预案。代码只是最后一环,前面每一环都给了组织叫停的机会。这是观看该视频时最需要建立的认知:把事故归因于“某行代码”,会让你错过真正的教训。
损失数字存在口径差异。 媒体当年普遍写“4.4亿美元”(公司披露口径),SEC 行政令记载约4.6亿美元税前损失。两者差异来自统计时点与费用归属的不同。视频沿用4.6亿口径没有问题,但读者引用时应注明口径,不要当作两个不同事实。
“45分钟”是约数。 从开盘报单失控到系统被彻底切断,各来源描述在40至60分钟之间浮动。不影响结论,但严谨引用时建议写“约45分钟”而非精确到秒。
视频视角偏工程,商业机制着墨少。 Power Peg 为什么每笔都亏?因为做市的利润来自“买在买价、卖在卖价”的价差,而 Power Peg 反向操作——买在卖价、卖在买价,等于每笔主动让渡价差还叠加冲击成本;再叠加计数器失效导致的指数级重复报单,亏损速度才如此惊人。这一层视频讲到了,但做市商的资产负债约束、交易所作废交易的仲裁过程,需要读者另查 SEC 与交易所公告。
不要得出“高频交易都危险”的结论。 同时代大量高频机构风控严密、运行至今。骑士资本的特殊性在于它同时承担了“科技层”与“承销业务层”的风险(2012年3月它还在 BATS IPO 定价事故中折戟,据当年报道其承销了纽交所超过两成的新股上市)。真正稀缺的不是“别做高频”,而是“部署纪律与熔断机制”——这才是视频结论的正确抽象层级。
1. 定期给你的代码库“办葬礼”。 每个季度做一次死代码审计:十年没人触达的模块、注释掉的分支、名称里带 legacy/test/old 的路径,要么补测试后删除,要么明确标记禁用。特性开关必须有 owner 和过期日,过期即拆除。骑士资本的证据表明,最危险的不是新代码的bug,而是“以为还在、其实早变味”的旧路径。
2. 把部署从手工动作变成流水线资产。 任何需要“复制到N台机器”的发布都应自动化、幂等、可对账;发布后跑版本一致性巡检(对比所有节点的构建哈希),不一致即告警。有条件的项目再上灰度与金丝雀:先放1%流量观察,而不是全量互切。骑士资本8台漏1台的事故形态,在今天对应的是“配置漂移”——Terraform、Ansible 这类基础设施即代码工具的存在意义正在于此。
3. 把“最多亏多少”写进代码,而不是写进PPT。 系统层面必须有独立的熔断层:单笔订单上限、累计金额上限、报单频率上限、异常撤销率告警,以及一个任何人都能一键按下的 kill switch。这些限额应当独立于业务代码的路径,即使业务逻辑全错,熔断层也能把损失封顶。骑士资本缺少的正是这个与算法无关的“最后一道闸”——这也是为什么 SEC 事后追究的是市场接入风控(Rule 15c3-5),而不是那行旧代码。
flowchart TD
subgraph A["埋雷期 2003-2012"]
A1["2003: 开发 Power Peg 模块<br/>买卖价吃价差+母单计数器"] --> A2["2005: 功能弃用但代码未删<br/>旧开关被新逻辑复用"]
A2 --> A3["2008: 系统重构<br/>计数器重置逻辑被删除"]
A3 --> A4["死路径潜伏多年无事故<br/>安全感被误认为稳健"]
end
subgraph B["引信 2012-08-01 晨"]
B1["上线 RLP 新代码"] --> B2["手工部署8台漏发1台<br/>混版本运行无异常"]
end
subgraph C["爆燃 开盘后约45分钟"]
C1["RLP订单触发旧开关"] --> C2["计数器永不清零<br/>系统判定母单未完成"]
C2 --> C3["无限补单+反向吃价差<br/>154只股票逾400万笔成交"]
C3 --> C4["累积约70亿美元头寸<br/>税前亏损约4.6亿美元"]
end
subgraph D["余波 2012-2017"]
D1["交易所作废超60%偏离交易"] --> D2["股价暴跌+高息救助"]
D2 --> D3["并入Getco更名KCG<br/>2017年被Virtu收购"]
D4["SEC罚款1200万美元<br/>Rule 15c3-5标志性第一案"] --> D3
end
A4 --> B1
B2 --> C1
C4 --> D1
C4 --> D4
D3 --> E["启示: 清死代码/自动化部署/独立熔断"]
以下链接为权威公开资料的常见地址;本次成稿环境无法联网实时核验,如遇失效请按标题自行检索。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
