跳到正文
博客园· DolphinDB·· 4 小时前AI 评分36

DolphinDB 上线 Monte Carlo 与 pdeSolver 两类通用衍生品定价工具实测

QuantLib 之外,衍生品定价还能怎么选?DolphinDB Monte Carlo + PDE 工具实测 - DolphinDB

AI 导读

DolphinDB 全新上线 Monte Carlo 与 pdeSolver 两类通用定价工具,开发者可用自定义 evolve、payoff 函数表达非标衍生品模型,无需从底层手写求解器。

正文

算一个标准欧式期权不难,难的是“不标准”的产品:亚式要盯观察日和历史定盘(Fixing),障碍要判断价格有没有触碰,随机波动率、多资产还会再加状态变量。

对于常见金融产品,DolphinDB 已提供覆盖不同资产类别的专用定价函数,调用即可估值。而面对非标衍生品,现成函数往往不够用,开发者需要能灵活定义模型、调整计算条件、检验数值结果的通用求解工具。为此,DolphinDB 全新上线两类通用定价工具,不必再从底层手写求解器:

  1. Monte Carlo:模拟随机路径,结合产品收益规则做统计估值,并给出标准误与置信区间;
  2. pdeSolver 系列函数:求解一维、二维线性抛物型 PDE,得到网格上的价格曲线或价格面,同时可输出 Greeks。

本文将结合典型衍生品案例,介绍两类工具的核心接口与使用方式,并通过性能测试展示其在不同定价场景下的计算表现,帮助开发者了解如何利用 DolphinDB 构建灵活的定价模型。

一、Monte Carlo:灵活构建路径依赖型定价模型

对于亚式期权、障碍期权等路径依赖型衍生品,期权收益不仅取决于到期时的标的价格,还与存续期内的价格变化有关。要完成定价,开发者需要模拟标的资产的随机演化路径,再根据产品条款计算收益,最终估计期权价格。

如果每次都从底层手写完整流程,随机数生成、相关性转换、批量计算和统计汇总等环节就需要反复实现。事实上,不同产品之间的差异往往集中在两个方面:标的状态如何演化,以及产品在什么条件下支付多少钱。 随机路径模拟与统计估计流程则可以复用。

DolphinDB 的通用 Monte Carlo 工具正是围绕这一思路设计的。开发者通过自定义函数定义状态演化和收益逻辑,模拟与统计流程由工具统一组织。

核心能力

Monte Carlo 定价主要涉及三个函数:

  • mcSimulate:模拟随机过程,生成相应的模拟路径。
  • monteCarlo:组合自定义状态演化函数、收益函数与模拟配置,完成 Monte Carlo 定价流程。
  • mcEstimate:对模拟结果进行统计估计。

根据使用目的,可以采用两种典型工作流。

  • 在研究和调试阶段,可以使用 mcSimulate 生成路径,再通过自定义处理与 mcEstimate 完成估值。这种方式便于检查模拟路径和中间结果,但保存完整路径可能占用较多内存。
  • 在业务定价场景中,则可以直接调用 monteCarlo,由函数内部按批次推进模拟并汇总结果,适合固定 Payoff 的批量数值估计。

各类产品都可以用 evolve 与 payoff 两个函数表达。通过这种方式,欧式期权、亚式期权、障碍期权、回望期权、多资产期权等产品,都可以在复用模拟框架的基础上定义各自的模型逻辑。对于随机波动率模型,也可以将标的价格与波动率等状态变量纳入模拟。

以亚式期权为例

以亚式期权为例,假设标的资产价格遵循几何布朗运动(GBM)。开发者首先通过 evolve 函数定义资产价格如何随时间变化:

def gbmEvolve(t, state, dt, noise, p) {
    drift = (p["r"] - p["q"] - 0.5 * p["sigma"] * p["sigma"]) * dt
    return state * exp(drift + p["sigma"] * sqrt(dt) * noise)
}

接下来,通过 payoff 函数定义如何根据模拟路径计算期权收益。下面的示例同时计算算术平均价格和几何平均价格对应的收益:

def asianPayoff(paths, timeGrid, p) {
    n = rows(paths[0])
    m = size(paths) - 1
    prices = matrix(DOUBLE, n, m)
    for (i in 1..m) {
        prices[, i - 1] = paths[i][, 0]
    }
    arithmeticAverage = rowAvg(prices)
    geometricAverage = exp(rowAvg(log(prices)))
    T = timeGrid[size(timeGrid) - 1] - timeGrid[0]
    df = exp(-p["r"] * T)
    return df * matrix(max(arithmeticAverage - p["K"], 0.0),
                       max(geometricAverage - p["K"], 0.0))
}

定义好状态演化函数与收益函数后,即可调用 monteCarlo,结合初始资产价格、时间网格、模拟路径数量和模型参数完成估值:

res = monteCarlo(gbmEvolve, asianPayoff, 100.0,
    0..12 / 12.0, 100000, 1, p, opt)

在这个示例中,gbmEvolve 和 asianPayoff 承载了开发者自定义的模型逻辑;其余参数用于指定初始状态、模拟时间范围、模拟规模以及相关配置。通用 Monte Carlo 流程负责组织模拟和估计,并返回价格估计值及标准误等结果。

可以看到,当产品条款发生变化时,开发者只需调整 evolve 和 payoff 两个函数,路径模拟与统计估计流程无需重写。

二、pdeSolver:一次求解得到整张价格面

对于欧式期权等产品,可以通过解析公式直接计算价格。但对于美式期权等具有提前行权特征的产品,定价问题会更加复杂:除了求解标的价格与时间相关的定价方程,还需要考虑持有期内提前行权的可能性。

偏微分方程(PDE)方法把定价问题转化为数值求解:把标的价格和时间划分成网格,从到期日的收益出发,逐步向当前时刻倒推,算出不同状态下的理论价格。它的好处是一次求解得到的不是单点价格,而是一整张价格面,还可以在同一框架下处理提前行权、边界条件、时变参数和复杂收益结构。

核心能力

DolphinDB 提供了完整的 PDE 数值求解框架:

DolphinDB 的 pdeSolver 系列函数支持一维和二维线性抛物型 PDE,核心能力包括:

  • 方程配置:扩散、对流、反应、源项系数均可配置,支持常数或随价格、时间变化的函数(如局部波动率)。
  • 网格与边界:支持均匀网格和 sinh/tanh/log 非均匀网格(可在执行价、障碍附近加密),支持 Dirichlet、Neumann、Robin 边界。
  • 时间推进:显式、隐式 Euler、Crank–Nicolson 及 Theta 格式可选;对不连续收益可用 Rannacher smoothing 抑制振荡。
  • 提前行权约束:美式期权通过 obstacle 配置表达,支持 PSOR 与 Penalty 两条求解路径。
  • 二维问题:支持 ADI 方法(Douglas、CS、MCS、HV),可处理 Heston、Basket、Exchange 等含交叉导数的模型。
  • 输出完整:除价格外,还可返回指定状态点的插值价格、Delta、Gamma 等 Greeks,以及收敛与迭代诊断信息。

开发者可以通过配置定价方程、终值条件、边界条件及数值求解参数来构建定价模型,只需表达金融模型,而不必从底层自行实现 PDE 求解算法。

以美式看跌期权为例

以美式看跌期权为例,假设标的资产价格为 100、执行价格为 100、无风险利率为 5%、波动率为 20%,期限为一年。可以先定义方程系数、到期收益函数和边界条件:

coeff = pdeCoeff1D(
    diff={S,tau -> 0.5 * volatility * volatility * S * S}, //扩散项
    conv={S,tau -> rate * S},                              //对流项
    react=-rate                                            //反应项
)
payoff = {S -> max(strike-S, 0.0)}                         //到期收益
boundary = [strike, 0.0]                                   //计算区域两端的边界值

美式期权的提前行权约束,通过求解配置中的 obstacle 表达,这里选用 PSOR 方法:

method = dict(STRING, ANY)
method["obstacle"] = payoff
method["obstacleSolver"] = "PSOR"
method["psorOmega"] = 1.2
method["psorTolerance"] = 1e-10
method["psorMaxIterations"] = 20000

最后,构建空间网格和时间网格,将方程、边界条件及求解配置传入 pdeSolver:

spotGrid = pdeGrid1D(0.0, 300.0, 401, "sinh", strike, 3.0)
tGrid = (0..400) / 400.0
setting = dict(STRING, ANY)
setting["interpAt"] = 100.0
result = pdeSolver(
    coeff, payoff, pdeDomain1D(spotGrid), tGrid,
    boundary, method, setting
)
result["interpValue"]

在上述案例中,方程系数、终值条件和边界条件构成了美式看跌期权的定价模型,提前行权约束则通过 obstacle 单独配置。

产品之间的差异,最终也大多落在这几处配置上:欧式期权省去提前行权约束即可,障碍期权的条款体现在求解区域和边界值上,局部波动率模型改变的只是 diff 系数的取值方式,方程结构本身不变。网格构建与求解流程在这些情况下都不需要重写。

三、性能测试

定价工具的性能不仅影响单次估值耗时,也关系到批量定价、参数敏感性分析和复杂产品研究的计算效率。为评估 DolphinDB 通用数值定价工具的表现,下面分别对 Monte Carlo 模拟定价和 PDE 数值求解进行测试,并与 等实现进行比较。

各库在模型表达、算法和执行优化上存在差异,测试比较的是特定场景和配置下的端到端效率,而非脱离条件的绝对排名;算法或精度设置不一致的场景将单独说明其可比性限制。

Monte Carlo 性能测试

在一组统一配置的测试中,各实现均计算 100,000 条模拟路径、126 个时间步,使用单 worker 和对偶变量法。测试前预热一次,正式运行七次,以端到端耗时的中位数作为结果(DolphinDB 的计时包含 SDK 往返开销)。

测试结果如下,耗时单位均为毫秒:

场景 DolphinDB 标准 DolphinDB log NumPy 标准 NumPy log QuantLib 标准 QuantLib log PriceLib 标准 PriceLib log
European Call 98.0 38.0 144.9 86.1 2447.2 571.2 209.5 152.6
几何 Asian 241.0 80.4 223.4 94.3 10845.0 9438.8 249.2 142.4
算术 Asian 139.1 208.0 154.4 183.1 10704.0 11320.1 199.1 202.8
Heston Call 344.8 283.2 316.3 256.4 2859.3† N/A 420.8 362.3
离散 Up-and-Out 124.4 71.5 155.4 123.9 9762.1 10380.7 198.0 147.6
两资产 Basket 315.9 180.6 310.4 192.1 5655.3 1429.5 N/A N/A

注:standard / log 是同一引擎的两种状态表示写法。QuantLib 的 Heston 采用原生 FullTruncation 方差离散,与其他实现不同,不参与比较。N/A 表示该接口不支持。

四库计时中位数对比图

从测试结果看,DolphinDB 在多个定价场景中展现出显著的计算效率优势。与 QuantLib 相比,在本次测试的五个可比场景中,DolphinDB 标准写法的端到端耗时约为其 1/18 至 1/77,log 写法约为其 1/8 至 1/145。其中,几何 Asian 和离散 Up-and-Out 的 log 写法分别快约 117 倍和 145 倍。相比 NumPy,DolphinDB 也在 European Call、几何 Asian 和离散 Up-and-Out 等场景中取得了更低的耗时。

不过,性能优势并非在所有场景下都成立。Heston Call 中,DolphinDB 两种写法的耗时均略高于 NumPy;算术 Asian 中,标准写法也明显快于 log 写法。这表明,实际执行效率不仅取决于定价模型本身,还受到状态表示、计算表达式及具体实现方式的影响,不能假设某一种写法在所有模型中都更快。

对于实际应用,还应结合数值精度、算法一致性及目标工作负载进行综合评估。

pdeSolver 性能测试

测试基于 DolphinDB Server V3.00.6.4 Linux 版本,在单核 CPU、Release 配置下进行。各场景采用不同的空间网格、时间区间和数值算法;耗时均为预热后的中位数,单位为毫秒。

场景 空间节点 × 时间区间 纯 C++ QuantLib Python DolphinDB QuantLib/ DolphinDB Python/ DolphinDB
BS 欧式看涨 401 × 400 1.473 3.534 12.590 4.584 0.77× 2.75×
Heston 随机波动率 121 × 61 × 120 48.812 80.162 509.309 98.908 0.81× 5.15×
BS 美式看跌(PSOR) 401 × 200 9.990 2.848 1092.076 25.533 算法不同 42.78×
现金或无价值数字看涨 401 × 200 0.804 3.150 7.474 2.370 1.33× 3.15×
资产或无价值数字看涨 801 × 400 3.115 10.821 18.906 9.794 1.11× 1.93×
下敲出单障碍看涨 601 × 400 2.323 8.172 16.800 7.267 1.12× 2.31×
上敲出单障碍看涨 601 × 400 2.367 8.181 16.434 7.314 1.12× 2.25×
时空局部波动率(Local Vol) 301 × 150 1.491 7.835 8.401 4.181 1.87× 2.01×
Quanto 固定汇率看涨 401 × 200 0.807 3.040 7.536 2.386 1.27× 3.16×

从测试结果看,DolphinDB PDE 求解器在多种定价场景中展现出较好的计算效率。

与 Python 实现相比,DolphinDB 在全部九个测试场景中耗时更低,最高加速比达 42.78 倍,在 Heston 随机波动率、数字期权及障碍期权等场景中也具有明显的性能优势。

与 QuantLib 相比,DolphinDB 的性能表现因定价场景而异。在数字期权、障碍期权、Local Vol 和 Quanto 等场景中,DolphinDB 的运行耗时更低;而在 BS 欧式看涨和 Heston 随机波动率场景中,QuantLib 的耗时更短。对于 BS 美式看跌场景,由于双方采用的数值算法不同,测试结果不宜直接用于性能优劣的比较。

四、实际应用中如何选择与验证定价方法

前面的案例和性能测试说明,Monte Carlo 与 PDE 各有适用场景,执行效率也会随模型与实现方式变化。在实际项目中,方法选择不宜只依据产品名称或单次运行时间,而应从模型适用性、数值可靠性和计算成本三个方面依次判断。

第一步:产品特征决定工具

首先考虑是否已有满足业务需求的专用定价函数。如果没有,再根据模型状态、收益结构和需要输出的结果,判断通用 Monte Carlo 或 PDE 是否适用。

定价需求 可考虑的工具 主要依据
路径依赖收益、复杂 Payoff 或多随机因子 Monte Carlo 通过模拟状态演化和自定义收益逻辑描述产品条款
需要获得不同标的价格下的理论价格,且模型适用 PDE PDE 通过空间与时间网格求解价格曲线或价格面
具有提前行权特征,且能够用支持的 PDE 约束表达 PDE 通过 obstacle 等配置处理提前行权约束
已有成熟的标准产品定价接口 专用定价函数 直接复用已有模型与计算流程

上述选择并非绝对。具体采用哪种方法,仍取决于模型假设、求解器支持范围、精度要求及计算资源。

第二步:结合数值诊断验证结果

定价工具输出的价格需要经过验证,才能用于实际业务。不同数值方法的误差来源不同,因此验证方式也应有所区别。

对于 Monte Carlo,可以结合标准误、置信区间和不同模拟规模下的估值结果,判断统计误差是否满足要求;对于 PDE,则可以通过加密网格、调整求解容差和检查价格及 Greeks 的收敛情况,评估数值结果的稳定性。

在条件允许时,还可以使用解析解或独立参考实现进行交叉验证。对于缺乏解析解的复杂产品,则可以结合统计误差、网格收敛性和独立实现结果建立验证方案。

第三步:在满足精度要求后评估性能

性能优化应建立在模型正确、结果可靠的基础上。Monte Carlo 可以结合模拟路径数量、时间步和批次配置评估计算效率;PDE 则可以针对网格规模、求解算法和执行路径进行测试。

第三章的测试结果表明,具体性能会随模型和实现方式变化。因此,在实际部署前,应选择有代表性的产品和参数组合进行测试,并尽量保证模型定义、精度要求与测试规模具有可比性。

总体而言,实际应用中应先确定适用的定价方法,再验证数值结果,最后评估计算效率。DolphinDB 提供的通用 Monte Carlo 与 PDE 工具,为这一过程提供了可复用的计算框架,开发者可以将更多精力集中于金融模型与产品条款本身。

五、方案价值与未来演进

DolphinDB 的 Monte Carlo 与 PDE 工具不仅提供数值求解能力,也为金融衍生品定价模型的开发、优化与集成提供了可复用的计算基础,主要体现在以下几个方面:

  • 灵活的定价模型构建能力:标准金融产品可以直接调用专用定价函数;面对非标衍生品、路径依赖产品或定制化收益结构时,开发者可以通过自定义状态演化、收益逻辑,或配置 PDE 系数、边界条件、网格与求解方法构建定价模型,无需为每一种新产品从头搭建完整的计算框架。
  • 模型开发与高性能计算相结合:支持通过批量计算、向量化、JIT 等方式优化执行效率。Monte Carlo 可结合路径数量、时间步、批次划分及内存约束调整计算策略;PDE 则可围绕网格规模、预计算策略与求解方法进行优化。实际性能取决于模型、算法、硬件及参数配置,需要通过可比测试验证。
  • 贯通定价计算与业务数据流程:结合 DolphinDB 的数据处理与分析能力,减少市场数据、模型参数和计算结果在不同系统与组件之间流转的需要。在此基础上,可以围绕具体业务建立标准化计算流程,统一管理产品参数、模型配置、数值方法与结果校验逻辑,为批量估值、情景分析及后续风险分析提供基础,降低重复开发与维护成本。
  • 面向复杂金融工程需求持续扩展:在现有能力基础上,未来可进一步探索三维 PDE、有限体积法(FVM)、有限元法(FEM)等数值方法,以及 Sobol 序列与准蒙特卡洛方法(QMC)、控制变量法、Brownian bridge 连续障碍修正、美式与百慕大式期权的最优停止算法、模型参数校准和 Greeks 自动微分等方向。上述内容属于潜在的演进方向,具体实现与支持范围以实际产品进展为准。

无论采用哪种数值方法,定价工具的核心价值都在于复用成熟的计算流程,让开发者将更多精力放在金融模型、产品条款与业务逻辑上,而不是重复实现底层求解算法。


进一步了解具体函数接口、代码实现与性能测试,可通过文档中心,阅读以下教程:

  • 《Monte Carlo 数值计算与期权定价实战》:讲解 GBM 随机过程、欧式期权、亚式期权、障碍期权、回望期权、两资产期权、Heston 随机波动率以及雪球示例,并讨论历史 Fixing、估值误差、对偶变量和性能测试。
  • 《pdeSolver 金融衍生品定价教程》:如何使用 DolphinDB pdeSolver 系列函数求解一维和二维线性抛物型 PDE,并将其应用于金融衍生品定价。内容覆盖模型与接口映射、典型定价案例,适合量化研究、衍生品定价研发等人员阅读。

来源:博客园 · cnblogs.com