QuantLib 金融计算——原理之蒙特卡洛(Monte Carlo)
介绍 QuantLib 中蒙特卡洛法的代码架构。
QuantLib 金融计算——原理之蒙特卡洛(Monte Carlo)
概述
在金融工程计算中,蒙特卡洛最常见的应用场景是为衍生品定价,特别是路径依赖的奇异期权。
作为金融工程计算的三大方法论之一,相较于树方法,蒙特卡洛对变量动态结构的要求更为宽松;相较于有限差分方法,蒙特卡洛无须在边界条件和网格上做精心的设计。
这套方法论一直体现出一种大道至简、无招胜有招的特点,非常适合这个算力爆发的时代。
蒙特卡洛与设计模式
衍生品定价中,实施蒙特卡洛通常分为下列几个步骤:
- 为底层变量(资产价格或者利率等)生成一条路径;
- 若要使用对偶变量缩减方差,还需生成一条对偶路径;
- 计算出衍生品合约在这条路径上的实现价格;
- 若要使用控制变量缩减方差,还需计算控制变量对应的合约(该合约要有解析解)在这条路经上的实现价格,用来修正第 2 步的实现价格;
- 反复执行第 1 和 2 步,汇总若干实现价格的样本;
- 计算样本的均值作为最终定价的结果。
由此可见,蒙特卡洛非常贴近“模板方法模式”的使用场景,将生成路径、计算实现价格、使用对偶变量和使用控制变量分别抽象出来,由基类负责这些方法的协同,而方法的具体实现就交给派生类了。
事实上,QuantLib 中若干用于期权定价的蒙特卡洛引擎就是按照模板方法模式设计的,其中最核心的两个类分别是 McSimulation
和 MonteCarloModel
。
McSimulation
为其所有派生类定义抽象接口,即:
pathPricer
pathGenerator
controlPathPricer
controlPathGenerator
controlPricingEngine
不过,实际的计算任务被委派给了 MonteCarloModel
。
随机路径的模拟
很自然地,模拟随机路径的任务落在了 StochasticProcess
及其派生类上,其中最核心的方法是 evolve
,它接受当前的状态、时间间隔和一个(组)随机数,进而推算出下一时刻的状态,递归地调用就实现了路径的模拟。
效率的瓶颈与变通的办法
蒙特卡洛可以大力出奇迹,但是大力通常意味着多花时间。
事实上,为了达到普适性,StochasticProcess
的 evolve
方法牺牲了太多的效率。以最常用的 GeneralizedBlackScholesProcess
为例,
- 一方面,
evolve
方法直接和间接调用的成员方法几乎都是虚方法; - 另一方面,这些虚方法内部的实现通常并不简单,依然是若干复杂虚方法的调用。第二方面是制约计算效率的主要瓶颈。
对于最简单的常系数 GBM,并不推荐直接用 GeneralizedBlackScholesProcess
模拟随机路径,一个变通的办法是为常系数 GBM 写一个专门的派生类(基类是 GeneralizedBlackScholesProcess
),根据 GBM 的转移密度公式覆盖掉 GeneralizedBlackScholesProcess
的接口,抄近路,直接忽略掉 GeneralizedBlackScholesProcess
低效率的默认实现。
对于复杂一些的局部波动率 GBM,也许也可以用这个办法。(Analytical approximation of the transition density in a local volatility model)