文章

QuantLib 金融计算——原理之蒙特卡洛(Monte Carlo)

介绍 QuantLib 中蒙特卡洛法的代码架构。

QuantLib 金融计算——原理之蒙特卡洛(Monte Carlo)

概述

在金融工程计算中,蒙特卡洛最常见的应用场景是为衍生品定价,特别是路径依赖的奇异期权。

作为金融工程计算的三大方法论之一,相较于树方法,蒙特卡洛对变量动态结构的要求更为宽松;相较于有限差分方法,蒙特卡洛无须在边界条件和网格上做精心的设计。

这套方法论一直体现出一种大道至简、无招胜有招的特点,非常适合这个算力爆发的时代。

蒙特卡洛与设计模式

衍生品定价中,实施蒙特卡洛通常分为下列几个步骤:

  1. 为底层变量(资产价格或者利率等)生成一条路径;
    • 若要使用对偶变量缩减方差,还需生成一条对偶路径;
  2. 计算出衍生品合约在这条路径上的实现价格;
    • 若要使用控制变量缩减方差,还需计算控制变量对应的合约(该合约要有解析解)在这条路经上的实现价格,用来修正第 2 步的实现价格;
  3. 反复执行第 1 和 2 步,汇总若干实现价格的样本;
  4. 计算样本的均值作为最终定价的结果。

由此可见,蒙特卡洛非常贴近“模板方法模式”的使用场景,将生成路径、计算实现价格、使用对偶变量和使用控制变量分别抽象出来,由基类负责这些方法的协同,而方法的具体实现就交给派生类了。

事实上,QuantLib 中若干用于期权定价的蒙特卡洛引擎就是按照模板方法模式设计的,其中最核心的两个类分别是 McSimulationMonteCarloModel

McSimulation 为其所有派生类定义抽象接口,即:

  • pathPricer
  • pathGenerator
  • controlPathPricer
  • controlPathGenerator
  • controlPricingEngine

不过,实际的计算任务被委派给了 MonteCarloModel

随机路径的模拟

很自然地,模拟随机路径的任务落在了 StochasticProcess 及其派生类上,其中最核心的方法是 evolve,它接受当前的状态、时间间隔和一个(组)随机数,进而推算出下一时刻的状态,递归地调用就实现了路径的模拟。

效率的瓶颈与变通的办法

蒙特卡洛可以大力出奇迹,但是大力通常意味着多花时间。

事实上,为了达到普适性,StochasticProcessevolve 方法牺牲了太多的效率。以最常用的 GeneralizedBlackScholesProcess 为例,

  • 一方面,evolve 方法直接和间接调用的成员方法几乎都是虚方法;
  • 另一方面,这些虚方法内部的实现通常并不简单,依然是若干复杂虚方法的调用。第二方面是制约计算效率的主要瓶颈。

对于最简单的常系数 GBM,并不推荐直接用 GeneralizedBlackScholesProcess 模拟随机路径,一个变通的办法是为常系数 GBM 写一个专门的派生类(基类是 GeneralizedBlackScholesProcess),根据 GBM 的转移密度公式覆盖掉 GeneralizedBlackScholesProcess 的接口,抄近路,直接忽略掉 GeneralizedBlackScholesProcess 低效率的默认实现。

对于复杂一些的局部波动率 GBM,也许也可以用这个办法。(Analytical approximation of the transition density in a local volatility model

本文由作者按照 CC BY 4.0 进行授权