一些定量数学库实际上只是定价公式的集合。希望是这样(请参阅数学模块),而且还有更多。该库旨在插入投资银行或对冲基金的风险和定价基础架构中。这并不排除使用该库进行学术工作,而是会引入学术界经常缺少的现实世界中的混乱状态。
QuantMath负责管理金融工具的生命周期(请参阅工具模块)。当产品付款或派息时,这会导致工具拆分为多个流量。什么都不会消失。高盛(Goldman Sachs)的SecDB库以将这一理念发挥到极致而闻名,但QuantMath至少具有相同水平的训练能力。正确建模流向何处时至关重要-当流不再是该工具的价值的一部分并由交易对手拥有时(即使尚未结清)。
大多数投资银行都在解决结算问题。股权的价值是多少?是现货价格,还是从实际收到股权支付之日起的现货价格折扣(例如T + 2)。 QuantMath打算允许严格地结算,支付保费,偿还收益以及相关的对冲。
QuantMath旨在简化因风险增加而未更改的计算的重用。例如,如果您有一个具有多个股票基础的异国情调产品,那么碰撞这些基础之一只会导致重新评估受影响的蒙特卡洛路径。以我的经验,这是至关重要的优化,而QuantMath可以实现从最低水平(如引导股利曲线)到最高水平(如重新使用Longstaff-Schwarz优化)的可能性。
递归地构建工具是很常见的。一个篮子包含复合或量化下限,然后一个动态索引维持该篮子-最终以动态索引为基础编写一个奇异产品。因此,该库必须管理这种递归产品,无论是通过分析还是通过有限差分引擎在蒙特卡洛进行估值。
该库必须易于操作,以使Quants可以使用,以及IT系统可以使用。添加新的风险,工具或模型通常应意味着仅更改一个文件(可能还包括mod.rs中的文件列表)。与IT的接口应该是数据驱动的,因此IT无需每次添加仪器或模型时都进行重建。模型,工具和风险应该是正交的,因此任何模型,工具和风险都可以与任何模型一起使用(受明智的数学限制)。如果出现问题,只需调试QuantMath就很容易,而不必调试包含的IT系统。这意味着QuantMath应该只能从序列化状态(例如JSON文件)运行。
该库具有严格的模块层次结构。理想情况下,应该没有向后依赖性,以便可以将库分成每个模块的单独的板条箱。如果您是第一次浏览该库,则最好从顶层(Facade)开始。从顶层开始,这些模块是:
这是IT系统与之对话的接口。它是数据驱动的,因此添加新产品或模型完全不会影响IT系统。
定价者根据市场数据和模型选择来评估工具。目前,我们有两个定价器:蒙特卡洛,它通过对许多随机路径求平均值来评估工具;自定价器,它依赖于知道如何定价的工具。我希望至少添加一个有限差分后向感应引擎。
我们期望价格在未来发生变化的模型。所有人都是随机的,但有些人的波动性或汇率是随机的。模型的示例是BGM(Brace Gatarek Musiela),Black,Heston。
定义如何破坏市场数据,并在发生这种情况时管理相关性。其中包含风险报告的定义,例如符合某些条件的所有下限的Delta,Gamma,Vega和Volga。
定义金融产品,指数,资产和货币。任何有价的东西。一些工具知道如何定价(基本上,任何价格定义明确且与模型无关的工具-请记住,此模块的价格低于模型)。一些工具知道如何在蒙特卡洛框架中给自己定价,给定其下标者的路径。
输入市场数据;交易量,股息,现货价格,收益率曲线等。还定义了这些数据项的波动。大多数风险是通过增加这些投入来计算的。
低级数学公式,从Black-Scholes公式到插值和正交。在可能的情况下,我们使用来自Rust中成熟的板条箱的功能,例如ndarray和statrs,因此这主要是特定于数量的数学。
日期对于金融数学软件非常重要。 我们在所有地方都使用显式日期,而不是年份分数,这对于正确处理结算至关重要。 此模块还处理日期算术,例如日期规则和天数。 非常低级的功能,例如Error结构的定义以及对serde的必需扩展,例如dedup(对有向无环图中的节点进行重复数据删除)和工厂(在序列化和反序列化中使用agged_serde处理多态节点)。