← 返回信息流
AI 资讯Hacker News·3 小时前

2021年银行Python编程口述历史

原标题:An oral history of Bank Python (2021)

速览

本文通过口述历史的形式,回顾了2021年银行行业在Python编程方面的应用与发展历程。内容涵盖了当时银行技术团队在数据处理、自动化及分析工具方面的实践与经验。这一记录为理解金融科技领域的技术演进提供了宝贵的视角。

AI 深度解读

Bank Python 口述史:大型投行内部的神秘代码世界

背景

在公众视野之外,存在着一个鲜为人知但至关重要的软件生态系统,作者将其称为“Bank Python”(银行 Python)。这并非我们日常所熟知的标准 Python 环境,而是大型投资银行内部广泛使用(尽管并非所有银行都如此)的专有 Python 生态系统的分支。

这些系统由成千上万的工程师和开发人员维护,但在公共互联网上几乎找不到关于它们的详细记录。当作者试图向外界解释“Bank Python”时,往往会被视为疯子的呓语,因为其架构和运作方式听起来过于离奇。

为了深入探讨这一领域,作者构建了一个虚构的、综合性的示例系统,命名为“Minerva”。虽然系统名称和子模块名称经过化名处理,且部分细节经过艺术化加工,但其核心逻辑和架构特征忠实反映了大型投行内部 Python 系统的真实面貌。

核心内容

Minerva 系统展示了银行内部 Python 代码如何与底层数据存储、金融估值逻辑以及层级结构紧密耦合。其核心由两个主要组件构成:Barbara 数据存储和 Dagger 估值引擎。

1. Barbara:全局键值存储

Barbara 是 Minerva 系统的基石,本质上是一个基于 Python 对象的全球性数据库。

  • 极简架构:Barbara 是一个简单的键值存储(Key-Value Store),其内部实现极其朴素,仅由 pickle(Python 序列化模块)和 zip(压缩模块)组成。
  • 全局命名空间:Barbara 包含多个“环”(Rings,即命名空间),但默认的“环”充当整个银行的全局对象数据库。日常运营所需的大部分数据——包括交易数据、工具数据(如债券)、市场数据等——都直接从 Barbara 中提取。
  • 状态存储:应用程序通常将内部状态直接存储在 Barbara 中。脚本通过简单的锁机制(甚至没有事务处理)直接读写数据类(dataclasses)。Minerva 脚本无法访问传统文件系统,所有数据必须存入 Barbara。
  • 一致性模型
    • Barbara 节点在其环内复制写入操作,类似于 Dynamo 或 BigTable 的工作原理。
    • 当调用 barbara.open() 时,它连接到默认环中最近的工作实例。在该实例内,读写操作具有强一致性。
    • 其他实例的读写操作会很快同步,但并非即时。如果一致性至关重要,开发者应确保始终连接到特定实例(尽管这种做法通常不被鼓励,除非必要)。
    • 由于架构简单,Barbara 极其健壮,完全故障极为罕见,降级状态也较少见。
  • Overlay(叠加)功能
    • 支持将多个环堆叠。读取操作会按顺序尝试各个环(例如:先查 middleoffice,若不存在则查 ficc,最后查 default)。
    • 写入操作可以配置为始终写入第一个环,或写入该键已存在的最顶层环。
  • 局限性
    • 对于大型数据集,传统 SQL 数据库或 kdb+ 可能是更好的选择。
    • Barbara 对象大小的软限制约为 16MB(压缩后的 pickle 文件通常很小,因此这是一个相当宽松的限制)。
    • 虽然支持基于对象属性的二级索引,但如果程序严重依赖二级索引,则应考虑其他方案。

2. Dagger:金融工具的有向无环图(DAG)

投资银行的核心业务之一是“资产定价”,即估算金融工具的价值。

  • 估值逻辑
    • 债券是最简单的工具,其价值等于持有期间获得的现金流折现。
    • 更复杂的是衍生品(如信用违约互换 CDS、利率互换等),它们基于“基础”工具,但支付结构不同。
    • 这些工具之间的依赖关系形成了一个有向无环图(DAG)
  • Dagger 的作用
    • Dagger 是 Minerva 中的一个子系统,用于管理这些依赖关系并自动重新估值。
    • 开发者定义工具类(如 CreditDefaultSwap),指定其依赖的基础工具(underliers)。
    • 当基础工具的价值发生变化(例如,某公司信用评级被下调,债券对象通过 Dagger 更新),Dagger 会自动重新计算所有受影响的衍生品价值。这可能涉及数百个其他衍生工具。
  • 层级结构:头寸(Position)与账簿(Book)
    • 头寸(Position):由工具和数量组成,其价值随基础工具价值变化而自动更新。
    • 账簿(Book):金融术语中“Book”含义丰富,在此语境下,它只是一组头寸的集合。
    • 递归结构:账簿可以包含其他账簿,形成从最小交易台到整个银行的嵌套层级。
    • 全行估值:理论上,通过执行顶层账簿的 value() 方法,即可递归计算整个银行的估值。

3. 与 Excel 的类比

理解 Dagger 和 Book 结构的关键在于类比 Excel 电子表格:

  • 在 Excel 中,单元格基于依赖关系自动更新,这也是一种有向无环图。
  • Dagger 允许开发人员将这种“Excel 式”的建模计算迁移到 Python 中。
  • 这使得开发人员可以编写测试、控制版本,并避免处理混乱的文件名(如 CDS-OF-CDS EURO DESK 20180103 Final (fi...)。

关键要点

  • 专有生态系统的隔离性:大型投行使用的 Python 是高度定制化的专有分支,与公共 Python 生态差异巨大,且内部细节对外保密。
  • Barbara 的“简单即强大”
    • 基于 picklezip 的极简实现,使得系统极其健壮且易于维护。
    • 采用最终一致性模型,但在关键路径上可通过连接特定实例保证强一致性。
    • 适合存储结构化对象和状态,但不适合海量数据分析或复杂查询。
  • Dagger 实现自动化估值
    • 利用有向无环图(DAG)管理金融工具间的复杂依赖。
    • 实现了类似 Excel 的“反应式”计算:基础数据变动自动触发下游所有衍生品的重新估值。
    • 将原本分散在 Excel 中的建模逻辑代码化,提升了可测试性和版本控制能力。
  • 层级化账簿结构
    • 通过 Position(头寸)和 Book(账簿)的递归组合,构建了从微观交易到宏观全行估值的完整层级。
    • 这种结构使得全行风险敞口和价值的计算变得模块化且可追溯。
  • 工程实践的转变
    • 从基于文件(如 Excel 文件)的静态建模,转向基于 Python 类和数据库的动态建模。
    • 解决了传统金融建模中版本混乱、难以测试和复现的问题。

意义与影响

“Bank Python”的存在揭示了金融科技(FinTech)领域一个被忽视的角落:在华尔街和伦敦金融城的服务器机房里,运行着一套与开源世界平行的、高度特化的软件工程体系。

  1. 对软件工程哲学的启示: Barbara 的案例挑战了现代数据库追求复杂功能(如 ACID 事务、复杂查询引擎)的趋势,证明了在特定约束下(如对象序列化、层级访问),极简架构(Pickle + Zip)可能具备惊人的鲁棒性和开发效率。

  2. 金融建模的现代化: Dagger 系统代表了金融工程从“电子表格驱动”向“代码驱动”的转型。将 Excel 的逻辑迁移到 Python 中,不仅提高了计算的可维护性,还引入了软件工程的最佳实践(测试、版本控制、模块化),这对于管理日益复杂的衍生品风险至关重要。

  3. 行业壁垒与知识传承: 这种专有系统的封闭性意味着相关的技术知识和最佳实践难以在公共社区中共享。这既构成了大型投行的技术壁垒,也导致了人才流动时的知识断层。理解这些内部系统对于希望进入量化

查看原文 →calpaterson.com