5.1.1 蒙特卡洛
什么是蒙特卡洛?
蒙特卡洛(Monte Carlo)是一种思想或一类方法,它通过随机采样来估计数学问题的数值解,本质上是通过大量采样来暴力解决问题,特别适用于复杂的积分、概率计算和优化问题等。
蒙特卡洛如何帮助我们处理复杂后验分布?
在求解后验分布的时候,我们经常要在分布上做一些计算,比如求期望、方差、或其他积分。但是如果碰上复杂分布、高维变量,就会让计算变得特别困难。这时候我们就可以尝试绕过解析解,通过大量采样的方法直接得到统计量。
例如,我们想对一个连续随机变量求期望,概率分布函数为:
这是一个非标准概率密度函数,我们无法直接求积分,但是我们可以从中采样,再利用大数定理(在本书中不做详细解释)近似期望:
同样,对离散连续变量求期望,虽然不涉及积分困难,但当变量的维度很高的时候,会出现维数灾难,求和计算难度随着维度增加而指数级增加。我们也可以通过从采样来近似期望:
一句话总结:遇到棘手的概率分布形式,避开难求的解析解,通过大量采样进行暴力计算估计。
注意:这里我们已知概率函数, 只是这个可能比较复杂,直接积分比较难求。
蒙特卡洛的实际应用案例
接下来我们借着一个模拟股票走势的代码案例,展示蒙特卡洛的用法。
假定某个股票目前的股价是, 预测时间之后的股价,金融工程中有公式:
假定初始股价,我们可以模拟一下,一年之后 (244 个交易日 ) 的股价分布。
首先,定义初始状态和模拟次数。
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
s0 = 10. #刚买入的股价,初始状态
mu = 0.15
sigma = 0.2
nSimu = 10000 # 模拟多少次
nStep = 244 # 每一次模拟走多少步, 1年只有244个交易日
dt = 1/nStep # 由于公式中的单位是年,而一年中有244个交易日,所以dt是理想化的每次股价变化间隔时间。
模拟10000次,得到一年后的股价分布。
price = np.empty((nSimu, nStep))
e = norm()
for i in range (nSimu):
s = s0
price[i, 0] = s
for j in range(nStep):
et = e.rvs() #
s = s + mu*s*dt + sigma*s*et*np.sqrt(dt) #股价的计算公式
price[i, j] = s
画出一年后股价的分布。
plt.hist(price[:,-1], bins=30, density=True)
plt.ylabel('pdf')
plt.xlabel('Price')

最后更新于