蒙特卡罗算法 Monte Carlo
一、Monte Carlo历史渊源
Monte Carlo 方法的实质是通过大量随机试验,利用概率论解决问题的一种
数值方法,基本思想是基于概率和体积间的相似性。它和 Simulation 有细微区
别。单独的 Simulation 只是模拟一些随机的运动,其结果是不确定的;Monte
Carlo在计算的中间过程中出现的数是随机的,但是它要解决的问题的结果却是
确定的。
二、Monte Carlo方法适用用途
(一)数值积分
计算一个定积分,如 ,如果我们能够得到 f(x)的原函数 F(x),那
么直接由表达式: F(x1)-F(x0)可以得到该定积分的值。但是,很多情况下,由
于 f(x)太复杂,我们无法计算得到原函数 F(x)的显示解,这时我们就只能用数
值积分的办法。如下是一个简单的数值积分的例子。
数值积分简单示例
如图,数值积分的基本原理是在自变量 x的区间上取多个离散的点,用单个
点的值来代替该小段上函数 f(x)值。
常规的数值积分方法是在分段之后,将所有的柱子(粉红色方块)的面积全
部加起来,用这个面积来近似函数 f(x)(蓝色曲线)与 x 轴围成的面积。这样
做当然是不精确的,但是随着分段数量增加,误差将减小,近似面积将逐渐逼近
真实的面积。
Monte Carlo 数值积分方法和上述类似。差别在于,Monte Carlo 方法中,
我们不需要将所有方柱的面积相加,而只需要随机地抽取一些函数值,将他们的
面积累加后计算平均值就够了。通过相关数学知识可以证明,随着抽取点增加,
近似面积也将逼近真实面积。
在金融产品定价中,我们接触到的大多数求基于某个随机变量的函数的期望
值。考虑一个欧式期权,假定我们已经知道在期权行权日的股票服从某种分布
(理论模型中一般是正态分布),那么用期权收益在这种分布上做积分求期望即
可。
(二)随机最优化
Monte Carlo在随机最优化中的应用包括:模拟退火(Simulated Annealing)、
进化策略(Evolution strategy)等等。一个最简单的例子是,已知某函数,我们
要求此函数的最大值,那么我们可以不断地在该函数定义域上随机取点,然后用
得到的最大的点作为此函数的最大值。这个例子实质也是随机数值积分,它等价
于求此函数的无穷阶范数( -Norm)在定义域上的积分。
由于在金融产品定价中,这部分内容用的相对较不常见,所以此课程就不介
绍随机最优化方法了。
三、Monte Carlo形式与一般步骤
(一)积分形式
做 Monte Carlo时,求解积分的一般形式是:
X 为自变量,它应该是随机的,定义域为(x0, x1),f(x)为被积函数,ψ(x)
是 x的概率密度。在计算欧式期权例子中,x为期权到期日股票价格,由于我们
计算期权价格的时候该期权还没有到期,所以此时 x 是不确定的(是一随机变
量),我们按照相应的理论,假设 x的概率密度为ψ(x)、最高可能股价为 x1(可
以是正无穷)、最低可能股价为 x0(可以是 0),另外,期权收益是到期日股票
价格 x和期权行权价格的函数,我们用 f(x)来表示期权收益。
(二)一般步骤
我将 Monte Carlo分为三加一个步骤:
1.依据概率分布ψ(x)不断生成随机数 x, 并计算 f(x)
由于随机数性质,每次生成的 x的值都是不确定的,为区分起见,我们可以
给生成的 x赋予下标。如 xi表示生成的第 i个 x。生成了多少个 x,就可以计算
出多少个 f(x)的值
2.将这些 f(x)的值累加,并求平均值
例如我们共生成了 N个 x,这个步骤用数学式子表达就是
3.到达停止条件后退出
常用的停止条件有两种,一种是设定最多生成 N 个 x,数量达到后即退出,
另一种是检测计算结果与真实结果之间的误差,当这一误差小到某个范围之内时
退出。
有趣的类比:积分表达式中的积分符合类比为上式中累加符号,dx类比为
1/N(数学知识告诉我们积分实质是极限意义下的累加;f(x)还是它自己,积
分中的ψ(x)可类比为依据ψ(x)生成随机数
4.误差分析
Monte Carlo 方法得到的结果是随机变量,因此,在给出点估计后,还需要
给出此估计值的波动程度及区间估计。严格的误差分析首先要从证明收敛性出发,
再计算理论方差,最后用样本方差来替代理论方差。在本课程中我们假定此方法
收敛,同时得到的结果服从正态分布,因此可以直接用样本方差作区间估计。详
细过程在例子中解释。
这个步骤的理论意义很重要,但在实际应用中,它的重要性有所淡化,倘若
你的老板不太懂这些知识,你报告计算结果时可以只告诉他点估计即可。
注意,前两大步骤还可以继续细分,例如某些五大步骤就是将此处的前两步
细分成四步。
四、最简单的例子
举个例子:
计算从 函数从 0到 2的定积分值 。
数学方法:我们已知 的原函数是 ,那么定积分值就是:
= 。计算这个数值可以在 Matlab中输入代码:
exp(2)-exp(0)
上面得到的值是此不定积分的真实值。
常规数值积分:在 区间内取 N个点,计算各个点上的函数值,然后用
函数值乘以每个区间宽度,最后相加。Matlab代码:
N=100;x=linspace(0,2,N);sum(exp(x).*2/N)
试着调大 N的值,你会发现,最后的结果将更接近真实值。
Monte Carlo数值积分法:在 内随机取 N个点,计算各个点上的函数
值,最后求这些函数值的平均值再乘以 2(为何要乘以 2 在后面小节详细讲)。
看 Matlab代码:
N=100;x=unifrnd(0,2,N,1);mean(2*exp(x))
同样的,通过增大 N,这种方法得到的结果也将越来越接近真实值。
解释
这个例子要求的积分形式是: , 还不完全是 形式,我们
先做变换, ,这里 是 f(x);1/2 是ψ(x),它表示,在取值范围
(0,2)区间内,x服从均匀分布。
前一例子共三条语句,逐句解释如下:
N=100;
设定停止条件,共做 N次 Monte Carlo模拟。
x=unifrnd(0,2,N,1);
按照(0,2)区间均匀分布概率密度对 x 随机抽样,共抽取 N 个 xi。此句相当
于第一个步骤中的前半部分。
mean(2*exp(x))
2*exp(x)作用是对每个 xi计算 f(xi)的值,共可得到 N个值,这个相当于第一
个步骤后半部分;Mean()函数的作用是将所有的 f(xi)加起来取平均值,相当于
第二个步骤。
这段代码中的停止条件隐含于 N值设定中,它一次性生成 N个 x值,完成此
次计算后整个程序就结束了。
五、Monte Carlo方法的优点
对比前面常规数值积分和 Monte Carlo数值积分代码,同样数量的 N值——
也就意味这几乎相同的计算量——常规数值积分结果的精确度要高于 Monte
Carlo数值积分的结果。那么,我们为何还需要用 Monte Carlo来算数值积分呢?
答案的关键在于,常规数值积分的精度直接取决于每个维度上取点数量,维
度增加了,但是每个维度上要取的点却不能减少。在多重积分中,随着被积函数
维度增加,需要计算的函数值数量以指数速度递增。例如在一重积分
中,只要沿着 x轴取 N个点;要达到相同大小的精确度,在 s重积
分 中,仍然需要在每个维度上取 N
个点,s个纬度的坐标相组合,共需要计算 Ns个坐标对应的 f()函数值。取点越
多,会占用计算机大量内存,也需要更长运算时间,最终导致这种计算方法不可
行!
Monte Carlo 方法却不同,不管是积分有多少重,取 N 个点计算的结果精确
度都差不多。因此,即使在一重积分的情形下,Monte Carlo方法的效率比不过
常规数值积分,但随着积分维度增加,常规数值积分的速度呈指数下降,Monte
Carlo方法的效率却基本不变。经验表明,当积分重数达到 4重积分甚至更高时,
Monte Carlo方法将远远优于常规数值积分方法。
现在回到金融产品定价,欧式期权理论定价公式只需要一重积分,此时 Monte
Carlo方法的效果不明显,但是如果我们考虑一个亚式期权:期限为 1年期,期
权价格基于此 1年内每天某个时点时的价格,全年共 252个交易日,这样此亚式
期权理论定价公式是一个 252 重积分。常规的数值积分方法,需要取 N252个点,
这个数有多大,你自己去计算一下就知道了(注意:N 取值要远远大于 2),常
规数值积分方法不可行,只能用 Monte Carlo。
综上,如果计算高维度多重积分,如路径依赖的 exotic options(奇异期权)
等金融产品定价,我们一般用的方法都是 Monte Carlo。
六、Monte Carlo方法原理
Monte Carlo 方法计算的结果收敛的理论依据来自于大数定律,且结果渐进
地(Asymptotically)服从正态分布的理论依据是中心极限定理。
以上两个属性都是渐进性质,要进行很多次抽样,此属性才会比较好地显示
出来,如果 Monte Carlo 计算结果的某些高阶距存在,即使抽样数量不太多,这
些渐进属性也可以很快地达到。
这些原理在理论上意义重大,但由于我们一般遇上的 Monte Carlo问题都是
收敛的、结果也都是渐进正态分布,所以工作中使用时可以不加考虑。