
2026/06/26 5:14
Bank Python のオーラル・ヒストリー(2021 年)
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
投資銀行セクターは、オープンソースの標準よりも速度と厳格な内部統制を重視する固有のエコシステムである**「Minerva」を中心に据えた独自のプラットフォームとして「Bank Python」を開発しました。このシステムは、コードをディスクではなくデータベース内に直接保存するという「データファースト」**のアプローチを採用しており、4 つの中央サブシステムによって管理されています:
- Barbara: データ用のグローバルキーバリューストア
- Dagger: 金融インストルメントグラフの管理用
- Walpole: デプロイとログ処理を担うモノリシックなジョブレアンナー
- MnTable:
を代替する固有のテーブルライブラリpandas
このアプローチにより、**「vouch」**メカニズムによるインスタントデプロイなどの独自機能は実現できますが、外部からの統合をブロックする閉鎖的な「技術的モノカルチャー」を生み出しています。同時に、標準的な業界ツールに対する従業員の技術習熟度が低下する技能萎縮(スキルアトロフィ)も招いています。その結果、新入社員对于这些複雑な内部構造を習得するには急激な学習曲線に直面することになり、同セクターは規制がリスク制限を図る意図にも関わらず、オープンソースに対して一方通行の関係性を維持しています。自前のソリューションを輸出する一方で、グローバルなコミュニティから隔離されています。
本文
【Python】巨大投資銀行で使用される「バンク・Python」の奇妙な世界:ミネルバシステムの内側を探る
金融分野における Python の利用方法は、一般的な開発コミュニティとは全く異なる独自の生態系を形成しています。本稿では、大衆にはあまり知られていない巨大投資銀行内部で採用されている独自の実装体系、「バンク・Python」(通称:ミネルバ)について解説します。このシステムは既存の Python エコシステムとは異なり、事実上独自の派生版(フォーク)として進化しています。数千人が使用するこの閉じた環境では、外部からは情報を得ることは容易ではありませんが、その仕組みを覗くことで、従来の常識を覆すソフトウェア構造を知ることができます。
注: 本文中の詳細は一部簡略化・改変された架空の統合システム「ミネルバ」に基づいています。すべての詳細を網羅することはできませんが、主要な構成要素と概念の大まかな輪郭を示します。
1. バーバラ:巨大なキーバリューストア(鍵付き値ストア)
ミネルバシステムの根幹を成すのは、Python オブジェクトのグローバルデータベース上に構築された**「バーバラ」**です。これは単純なピクルス(pickle)と ZIP の組み合わせで構成され、驚くほど堅牢な設計を持ちます。
基本構造と使い方
- 機能: 階層型のキー空間を持つシンプルなキーバリューストア。
- 接続方法:
でデフォルトの「ring」に接続する。barbara.open() - データ保存方針: ミネルバ内ではファイルシステムを使用せず、すべてのデータ(取引データ、インスツルメントデータ、市場データ、アプリケーションの状態)をバーバラに保存する。
コード例:国債データの取得と評価
import barbara # デフォルトのデータベース「ring」に接続 db = barbara.open() # いくつかの国債を入手(Base64 エンコードされたパスを使用) my_gilt = db["/Instruments/UKGILT201510yZXhhbXBsZQ=="] # ボンド(国債)の現在価値を計算する(銀行的モデラーに従って) current_value: float = my_gilt.value()
リング(ネームスペース)とオーバーレイ機能
- デフォルトリング: 銀行全体の単一のグローバルなオブジェクトデータベースとして機能。
- オーバーレイ: 複数のリングをリスト化して「スタック」のように重ね合わせられる。
- 読み取り: 最初のリングから検索し、存在しない場合は次々に試す。
- 書き込み: デフォルトは第一のリング、あるいは特定のキーが存在する上位リング(構成設定による)へ行う。
コード例:複数のリングへの接続と検索
# 複数のリングに接続:キーは提供されたリング名の順序で「重ね合わされる」 db = barbara.open("middleoffice;ficc;default") # /Etc/Something を'Etc'リングから取得するが、そこにある場合は # 'ficc'を試し、それでもなければデフォルトリングを試す some_obj = db["/Etc/Something"]
データパスの例(バーバラ内)
| パス | 説明 |
|---|---|
| 金融インスツルメント(債券、株式など)用のディレクトリ |
| 取引(発生した DEALS)用のディレクトリ |
| 為替部門の一般的なエリア |
| ボダフォン株に関連する項目用のディレクトリ |
| 一部のビジネスプロセスからの中継オブジェクト |
制限と注意点
- サイズ制限: ソフトな制限は約 16MB(ZIP 化されたピクルス)。大規模データセットの場合は SQL や kdb+ などの代替手段を検討する必要がある。
- 整合性:
は最も近い稼働インスタンスに接続し、強い整合性を保つ。他インスタンスからの読み書きは比較的すぐに反映されるが即座ではない。barbara.open()
2. ダガー:金融インスツルメントの有向非巡回グラフ(DAG)
投資銀行の重要な業務「資産価格付け」(評価額推定)を可能にするのが、金融インスツルメント間の依存関係を管理する**「ダガー」**です。
基本原理
- 目的: 債券やデリバティブなどの価値を計算し、基礎インスツルメントの価格変動に応じて自動的に再評価を行う。
- 構造: インスツルメント間の依存関係は**有向非巡回グラフ(DAG)**として形成される。
- 例:クレジット・デフォルト・スワップ(CDS)は、元となる債券(Underlier)の価値に依存する。
クラス例:信用デフォルト・スワップ
class CreditDefaultSwap(Instrument): """信用デフォルト・スワップは債券が破綻した際に 一定額の金銭を支払う""" def __init__(self, bond: Bond): super().__init__(underliers=[bond]) self.bond = bond def value(self) -> float: # ある資産価格モデルに従って、(キャッシュされた) # 評価額を返す return ...
自動再評価の仕組み
- トリガー: 基礎インスツルメント(例:債券)の評価が変更されると、ダガーは関連するすべての派生商品(CDS など数百種類)を自動的に再計算する。
- 実装効果: 格付会社の格下げや企業のネガティブニュースにより債券価格が変わった場合、その影響が一連のモデルに即座に伝播します。
ポジションとブック(集合)
個々の評価値を集約する仕組みが以下のクラスで定義されます。
class Position: """ポジションとは、あるインスツルメントと、その数量のこと""" def __init__(self, inst: Instrument, quantity: float): self.inst = inst self.quantity = quantity def value(self) -> float: # 評価額を返す(キャッシュされた)。これは基本的には # self.inst.value() * self.quantity と同じ return ... class Book: """ブックとは、ポジションの集合のこと""" def __init__(self, contents: Set[Valuable]): self.contents = contents def value(self) -> float: # またもや評価額を返す(キャッシュされた)。これは大まかに: # sum(p.value() for p in self.contents) と同じ return ...
- ネスト構造: 銀行全体の価値を求めるには、最上位のブックを呼び出せば良い。
bank = db["/Books/BigBankPlc"] print(bank.value()) # 銀行全体の評価額 - Excel との類似点: Excel のセル依存関係と同様に、DAG 構造によりバージョン管理とテストが可能なプログラム言語での数値計算を可能にする。
リスク指標との親和性
- 暴露度分析:ダガーを利用して、特定企業(例:倒産噂のある会社)に関連する全てのポジション(オプション、先物など)を「ネットアウト」して把握する。
- これにより、サブプライム・ローンデフォルトなどのリスクを迅速に可視化できる。
3. ウォールポール:銀行全体向けのジョブランナー
ミネルバの特徴的な点は、ソースコード自体もバーバラというキーバリューストア内に格納されており、ディスク上のファイルシステムは存在しないことです。この環境を稼働させるためのジョブマネージャーが**「ウォールポール」**です。
機能と特徴
- 位置付け: メガサイズ・Jenkins と systemd のような役割を持つ、単一の巨大な銀行全体向けインスタンス。
- 管理対象: ソースコードのビルド、定期的なデータ更新ジョブ、メール送信など。
- 堅牢性:
- クラッシュ時の自動再始動およびアラート出力。
- ジョブ間の依存関係理解(前段ジョブ失敗時は後続ジョブ起動を防止)。
- ログの保存。
デプロイの利点
- ハードル低下: 誰でも
ファイル(設定ファイル)に時間、機能場所、デプロイ方法を記述するだけでジョブを追加可能。ini - 意思決定プロセス: 大規模銀行において交渉が長期化する中で、インフラ整備を迅速化するための重要な手段となる。
- クラウドとの対比: クラウドネイティブ(K8s, Terraform など)は習熟曲線が急だが、ini ファイルなら誰でも扱えるという「低摩擦」な設計哲学を持つ。
4. MnTable:至る所に存在するテーブルライブラリ
Python や JavaScript に一般的なのはハッシュテーブル(辞書型データ)ですが、ミネルバではテーブル構造が好まれます。MnTableはこれを実現するための独自ライブラリです。
なぜテーブルなのか?
- メモリ効率: ハッシュテーブルはインメモリのみであり大規模なデータセットで疎になります。MnTable はディスクとの転送に最適化されており、密集型のメモリ管理を行います。
- アクセスパターン: 単一プライマリキーだけでなく、効率的な B-ツリーインデックスによる多様なアクセスに対応。
- バッチ処理: 遅延評価(lazy evaluation)をサポートし、大規模データに対するパフォーマンスを最適化。
注: オープンソースのパッケージ
はメモリ効率や API の複雑さなどの理由から、ミネルバ環境では MnTable が優先されます。pandas
コード例:MnTable の使い方
# 提供された型の三つの列を持つ新しいテーブルを作成 t1 = mntable.Table([('counterparty', str), ('instrument', str), ('quantity', float)]) # テーブルにいくつかのデータを追加(テーブルはデフォルトで不変) t1.extend( [ ['Cleon Partners', 'xlon:voda', 1200.0], ['Cleon Partners', 'xlon:spd', 1200.0], ['Blackpebble', 'xlon:voda', 1200.0], ], in_place=True) # 新しいテーブルを返します(元のテーブルを変更せず) # vodafone のみを含むもの。これは遅延評価であり、 # 実際に表示するまで評価されません t1.restrict(instrument='xlon:voda')
- 実装: 一部の関数は C++ で書かれた高度なブロックを使用し、他の関数は SQLite3 上で構築されています。
- 用途: 金融モデリングで広く使用される「中規模データ」(ギガバイト単位)の処理に適しています。
5. ミネルバシステムの特徴と課題
データファーストのアプローチ
ミネルバは**「コードファースト」ではなく「データファースト」**の設計思想を持っています。
- オブジェクト指向(OOP)との違い: OOP ではクラス(行動)を中心に設計し、データを後から追加する傾向があります。一方、ミネルバはテーブル(データ)を先に定義し、コードがそれを操作します。
- インピーダンスミスマッチ: この構造は従来のオブジェクト指向エンジニアには不自然に感じられることがありますが、データの整合性を保つ上で有効です。
統合された巨大さ
- 一つの巨大なエコシステム: コードベース、データベース、ジョバンナーが単一の基盤(バーバラ)の上に統合されています。
- ランタイムと環境の齟齬がないため、開発から本番環境への移行を即座に行えます(1 時間以内でのスクリプト動作)。
- Excel の制約からの脱却: Excel のスプレッドシートワークフローに代わりつつ、その直感的なメリットを残すような「中庸」のソリューションとして機能しています。
痛みの度合いと文化的隔絶
- 学習曲線: ミネルバ特有の IDE やライブラリを習熟するには長い時間を要します。外部環境(標準 Python)でのスキル(pip, virtualenv など)が通用しなくなります。
- NIH 症候群(今あるものに固執する態度): 外部の革新なアイデアを取り入れるよりも、内部で完璧化した独自の体系を維持する傾向があります。
- 一方向切符: 「外部からの入力はあるが、外部への出力は禁止」という方針により、GitHub プロフィールなどの開示も限定的です。
6. 異色な仕組みと学習の重要性
スキップされる要素(想像する余地あり)
ミネルバには以下のようなさらに奇妙な要素が含まれます:
- プロプライエタリな時系列データ構造
- コード変更承認用の「vouch」システム(権限を持つ者による手動確認でデプロイを通過)
- ダガー内部での「タイムトラベル」(履歴データの操作機能)
- Git に依存しないセミカスタマイズのバージョン管理
- Prolog ベースの許可システム
- 特定の OS/アプリケーション(Windows 7, Outlook 2010 など)との共存
「既存システムから学ぶ」ことの重要性
- 未知の技術への偏重: 新しいテクノロジーに飛びつく前に、すでに実用されている異国のシステムを深く理解することが重要です。
- vouch システムの実像: コード変更をデータベースとして保存するため、「デプロイステップ」という概念自体が消失します。重大な変更は責任者のサイン(vouch)または評判だけで承認されます。これは外部には信じがたい話ですが、数千人が利用している巨大システムです。
エクセルと Python のバランス
- 多くのテック業界人が Excel を軽視しますが、金融現場では Excel が意思決定の根幹を成すことがあります。
- ミネルバのようなシステムは、Excel ユーザーのビジネスロジックを理解しつつ、それを安全なコード環境(Python)に移植するための架け橋として機能します。
まとめ
巨大投資銀行における Python の世界は、一般的な「Gentle Python」とは異なる過酷かつ複雑な生態系です。
- バーバラによるグローバルデータベース
- ダガーによるグラフベースの自動計算
- ウォールポールによるコード管理とジョブ実行
- MnTableによるテーブル中心のデータ処理
この「ミネルバ」システムは、データの整合性と計算効率を最優先し、大規模な金融取引を支えるために構築された独自の金字塔です。外部からは理解しにくく、時には排他的に見えるかもしれませんが、そこにはExcel を凌駕する信頼性と、独自の論理が息づいています。