2012 年 8 月 1 日早上 8 点 01 分,骑士资本的一组员工收到一封系统邮件,内容是「Power Peg disabled」。接下来一个半小时,又来了 96 封。没人理会。这类邮件平时大家基本不看,它从设计上就不是警报。
骑士可不是小公司。按美国证监会的说法,美国上市股票的全部成交里,大约十分之一经过它的手。而这些邮件指向的问题,开盘不到一小时,就差点让这家公司垮掉。
那天,纽约证券交易所上线了一个服务散户小额订单的新项目,骑士为此更新了自己的订单路由系统。新代码借用了一个旧开关,这个开关原本用来启动一个叫 Power Peg 的老功能。Power Peg 从 2003 年起就不用了,但一直没人把它删掉。
此前几天,从 7 月 27 日起,一位技术员把新代码逐台装到路由系统的服务器上。服务器一共八台,代码装上了七台。没有第二个人检查,也没有哪条书面规定要求有人检查。
9 点半开盘,身后是 97 封没人处理的报错邮件。在第八台服务器上,那个旧开关把 Power Peg 叫醒了。早在 2005 年,Power Peg 里负责「已经买了多少股」的计数功能被挪到了代码的别处,所以它现在不知道什么时候该停。收到 212 笔客户小单,它往市场里发出了几百万笔订单。骑士订单系统的另一部分其实已经认出这些客户订单都成交了,可这个消息没有传到路由系统。美国证监会后来认定,骑士也没有任何流程,能在路由系统自己行为异常时让它停下。
系统还连着市场在下单,工程师们一边盯着一边找问题。他们试的一个办法,是把那七台正常服务器上的新代码撤掉。结果更糟:现在八台全在跑 Power Peg。
大约 45 分钟里,骑士在 154 只股票上成交了 3.97 亿股。等终于停下来,它手里多了 35 亿美元本不想买的股票,还卖空了 31.5 亿美元本不想卖的。把这些头寸平掉,亏了 4.6 亿美元。
不到三周前,骑士的股价还在 12 美元以上。出事五天后,一群投资人拿出 4 亿美元救命,换走了公司七成以上的股份。第二年夏天,骑士和对手 Getco 合并成一家新公司 KCG。
美国证监会后来罚了它 1200 万美元。处罚决定里写着:如果有一条书面流程,要求部署后做一道「简单的复核」,就能发现漏掉的那台服务器,整件事本可以避免。