Knight Capital(2012)— 45分で460億円

9年前のデッドコードとフラグ再利用、1台だけの配備漏れが45分で4.6億ドルの損失に化けた事件から、デッドコード削除・フラグ規律・配備検証・緊急停止の原則をSEC処分文書に忠実に学べる。

応用Knight Capitalインシデントフィーチャーフラグデッドコードデプロイポストモーテム最終更新: 2026-07-29
3つの要点
TL;DR
  1. 8台中7台にしか新コードが配備されず、残る1台では再利用されたフラグが2003年に廃止済みの旧機能Power Pegを起動。45分で154銘柄・約4億株を約定し、損失は4.6億ドル超に達した。
  2. Power Pegの停止条件(累積約定数の追跡)は2005年の改修で壊れていたが、死んだコードとして未テストのまま本番に残置。同じフラグの意味がサーバー間で食い違う部分配備が最悪の形で発火した。
  3. 配備検証もkill switchも無く、対応中に正常な7台から新コードを撤去して全台が暴走。教訓はデッドコード削除・フラグ再利用の禁止・配備の自動検証・独立したハードリミットと緊急停止手順の整備。

何が起きたか(日時・影響範囲)

2012年8月1日9時30分(米国東部時間)、米株式市場最大級のマーケットメイカーだったKnight Capitalの発注ルーターSMARSが暴走しました。45分間に数百万件の注文を送出し、154銘柄で400万件超・約4億株(3.97億株)を約定。買い越し約35億ドル(80銘柄)・売り越し約31.5億ドル(74銘柄)という意図しない建玉を抱え、同社は税引前約4.4億ドルの損失を公表しました(SEC処分文書の認定は4.6億ドル超。1ドル100円換算で約460億円)。取引の取消しが認められたのは6銘柄のみで、残りは有効に確定。自己資本を大きく毀損した同社は4億ドルの緊急増資(既存株主は約7割希薄化)で延命した後、同年12月に競合Getcoとの合併に合意し、独立企業としては実質消滅しました。

SMARSとPower Peg

SMARSは親注文を細かい子注文へ分割して各取引所へ高速送信する自動ルーターです。Power Pegはその中の旧機能で、親注文が満たされるまで子注文を出し続ける設計でした。2003年に使用を停止しましたが、コードは削除されず本番に残っていました。

タイムライン

時期(東部時間)出来事
2012年7月上旬NYSEの新制度RLP(Retail Liquidity Program)をSECが認可。開始は8月1日で、準備期間は約1か月
7月27日〜RLP対応の新コードを8台のSMARSサーバーへ数日かけて手動配備。1台への複製が漏れたが、第2確認者によるレビュー手順は無かった
8月1日 08:01〜「Power Peg disabled」というエラーに言及する自動メール97通が担当者へ送信される。警報として設計されておらず、開場前に対応されず
09:30取引開始。旧コードのままの1台がRLPフラグをPower Peg起動と解釈し、暴走発注を開始
09:30〜10:15対応の過程で正常な7台からも新コードを撤去し、全台が暴走。約45分後にようやく送出を停止
8月2日〜6日建玉を一括売却して損失を確定。株価は2日で7割超下落し、緊急増資へ
2013年10月16日SECが市場アクセス規則(Rule 15c3-5)違反で1,200万ドルの制裁金。同規則の初の適用例

根本原因の技術解説

第一の欠陥はデッドコードです。Power Pegは2003年から未使用でしたが、SMARSの本番コードから削除されていませんでした。さらに2005年の改修で「累積約定数の追跡」処理がコード列の上流へ移設され、Power Pegの停止条件——親注文の充足を検知して子注文を止める——は静かに壊れました。使われていない前提のコードだったため、この破壊を検出するテストは行われていません。

第二の欠陥はフラグの再利用です。RLP対応の新コードは、かつてPower Pegの起動に使っていたフラグを「RLP対象注文の印」として転用しました。配備が8台中7台で止まった結果、同じ1ビットが7台では「RLPとして処理」、1台では「Power Pegを起動」という正反対の意味を持つ混在状態が生まれます。旧コードの1台では、RLPフラグ付きの親注文が届くたびに、約定を数えない壊れた送信ループが子注文を吐き続けました。

# 新コード(7台)
if order.flag_X:
    handle_rlp(order)        # RLP対象として処理

# 旧コード(1台)— flag_X は Power Peg の起動命令
loop:
    send_child_order()
    if parent_filled():      # 2005年の改修以降、この判定は機能しない
        break
原因不明のままの切り戻しが火に油を注いだ

障害対応中、Knightは新コードを疑い、正しく動いていた7台からRLPコードをアンインストールしました。旧コードではフラグの意味がPower Peg起動へ戻るため、以後は全8台が暴走注文を生成し、事態はむしろ悪化しました。変更を理解しないままのロールバックは、配備と同じだけ危険です。

なぜ防げなかったか

横にスクロール

一台だけの旧版を市場リスク統制が止められなかった変更から影響の伝播、復旧、恒久対策までを示す図
障害が拡大した実際の経路と、抜けた防護を独立した恒久対策へ置き換える方法を整理します。

配備を検証する仕組みがありませんでした。新コードは技術者の手動コピーで配られ、全台のバージョン一致を照合する手順も自動化も無く、「8台中7台」という部分配備は発火するまで誰にも見えませんでした。警報も機能していません。開場前から届いていた97通のメールはエラーを名指ししていましたが、システムアラートとして設計されておらず、対応をトリガーしませんでした。

そして緊急停止の設計がありませんでした。文書化された停止手順もkill switchも無く、担当者は本番で45分間診断を続けます。加えて、発注フロー全体を資本閾値や建玉上限で自動遮断する独立の統制が無く、66億ドル超の総建玉が積み上がってもシステムは止まりませんでした。SECが市場アクセス規則違反として問うたのは、バグそのものではなくこの統制の欠如です。

教訓(原則として一般化)

  • デッドコードは削除する: 到達可能なコードは「いつか実行されるコード」です。9年間未使用でも1ビットで蘇ります。無効化や放置ではなく削除し、削除自体を通常のリリースとして検証します。
  • フラグを再利用しない: フィーチャーフラグに作成→展開→掃除のライフサイクルを定め、役目を終えたフラグと分岐は撤去します。同時に稼働しうる全バージョン間で意味が一致することを配備の前提条件にします。
  • 配備を自動化し検証する: 全ノードのバージョン・ハッシュ照合、部分配備の自動検知、カナリアリリースと検証済みロールバックを備えます。手動コピーと目視は統制ではありません。
  • 緊急停止を先に作る: 診断より停止を優先できるkill switchと、文書化・訓練済みの手順を用意します。切り戻しにも配備と同等の検証を課します。
  • アプリの外に独立の上限を置く: 発注額・建玉・レートのハードリミットを業務ロジックと別系統で強制し、コードの故障が資本を直撃しない多層防御にします。

配備自動化やカナリアの原理はDevOps、フェイルセーフと多層防御の設計はセキュリティの各トピックも参照してください。

障害事例の記事ガイド

Knight Capital(2012)— 45分で460億円を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

Knight Capital

比較で見る軸

難易度: advanced / カテゴリ: 障害事例 / タグ数: 6

導入後に効く点

Power Pegの停止条件(累積約定数の追跡)は2005年の改修で壊れていたが、死んだコードとして未テストのまま本番に残置。同じフラグの意味がサーバー間で食い違う部分配備が最悪の形で発火した。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
障害事例
タグ数
6

判断チェックリスト

  • 自社の用途が「Knight Capital / インシデント」に近いか確認する。
  • 強みである「8台中7台にしか新コードが配備されず、残る1台では再利用されたフラグが2003年に廃止済みの旧機能Power Pegを起動。45分で154銘柄・約4億株を約定し、損失は4.6億ドル超に達した。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

Knight Capitalインシデントフィーチャーフラグデッドコードデプロイ
参考: 公式情報