DolphinDB 上线 Monte Carlo 与 pdeSolver 两类通用衍生品定价工具实测
QuantLib 之外,衍生品定价还能怎么选?DolphinDB Monte Carlo + PDE 工具实测 - DolphinDB
DolphinDB 全新上线 Monte Carlo 与 pdeSolver 两类通用定价工具,开发者可用自定义 evolve、payoff 函数表达非标衍生品模型,无需从底层手写求解器。
算一个标准欧式期权不难,难的是“不标准”的产品:亚式要盯观察日和历史定盘(Fixing),障碍要判断价格有没有触碰,随机波动率、多资产还会再加状态变量。
对于常见金融产品,DolphinDB 已提供覆盖不同资产类别的专用定价函数,调用即可估值。而面对非标衍生品,现成函数往往不够用,开发者需要能灵活定义模型、调整计算条件、检验数值结果的通用求解工具。为此,DolphinDB 全新上线两类通用定价工具,不必再从底层手写求解器:
- Monte Carlo:模拟随机路径,结合产品收益规则做统计估值,并给出标准误与置信区间;
- 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