怎么用 Excel 做蒙特卡洛模拟

 我来答
hosezhou19896
高粉答主

2019-05-26 · 关注我不会让你失望
知道小有建树答主
回答量:1253
采纳率:100%
帮助的人:21.1万
展开全部

Excel 做蒙特卡洛模拟的具体操作步骤如下:

1、打开Excel表格,填写三个活动时间估算的乐观值,最可能值和悲观值。

2、分别计算三个活动的均值和标准差

均值=(乐观值+4 * 最可能值 + 悲观值)/ 6,标准差=(悲观值-乐观值)/ 6。

3、计算出来的均值和标准差,对三个活动按照正态分布进行随机模拟。

公式:=INT(NORMINV(RAND(),$F$2,$G$2))。

4、将随机出来的值,进行固化。把上一步中红框的区域,按值复制一份。

5、3个活动均为FS的关系,三个互动的时间之和就等于总项目时间。

6、总工期考入新的Sheet,并进行从小到大的重新排序。

7、排序后的数据进行筛选,剔除重复数据,全部模拟出来工期的值。

8、进行频度统计,选中与总工期相对应的频度下面的单元格D2:D23。

输入公式“=FREQUENCY(A2:A101,C2:C23)”,然后按下Ctrl+Shift+Enter。

9、计算积累频度:每一个频度的积累频度=自身的频度+前面所有项的频度之和。

10、选择二维折线图,添加的空白折线图上右键选择数据区域,将累计频度改为蒙特卡洛模拟。

11、选择自己喜欢的样式,蒙特卡洛模拟生成的图表即可。

一点设计演示
高粉答主

推荐于2017-12-16 · 职场/教育各类模板,衷于原创
一点设计演示
采纳数:874 获赞数:83606

向TA提问 私信TA
展开全部

下面是在Excel中模拟一只股票价格的例子。假设股票价格
的对数收益率服从正态分布,均值为0,每日变动标准差为0.1,
模拟股票价格1年的路径,过程如下:
用到两个内置函数,即用rand()来产生0到1之间的随机数,然后用norminv()来获得服从既定分布的随机数,即收益率样本=norminv(rand(), 0, 0.1)。假定股票价格的初始值是100元,那么模拟的价格就是 S=100 * exp(cumsum(收益率样本))。
其中的cumsum()不是Excel的内置函数,其意思就是收益率样本的累积,每个时刻的值都是当前样本及此前所有样本的和,如,收益率样本从单元格C3开始,当前计算C15对应的模拟价格,则模拟价格计算公式是:100 * exp(sum($C$3:C15))。
由此可以得到股票价格的一条模拟路径。

其他非正态分布也可以通过类似方式得到分布的抽样,即分布函数的逆函数,这些函数Excel都内置了。所以,做蒙特卡洛模拟的时候,关键是先确定所需模拟的分布,然后进行抽样,然后应用层面的各种公式就可以在抽样的基础上进行计算了。

--------以下是补充的--------

根据上面提到的思路,其实可以很便捷地为期权做定价。下面就用蒙特卡洛方法为一个普通的欧式看涨期权定价(蒙特卡洛在为普通期权plain vanilla option定价时不占优势,因为相对于解析法而言计算量很大。但是,如果要给结构比较复杂的奇异期权定价时,可能蒙特卡洛法就比较实用,有时可能成为唯一的方法)。

1)假设这个期权是欧式看涨期权,行权价格为50元,标的股票当前的价格也是50元,期权剩余时间是1天。

2)假设标的股票的价格服从对数正态分布,即股票的每日收益率服从正态分布,均值为0,每日标准差为1%。

根据分布假设,首先用rand()函数产生在0到1之间的均匀分布样本。为了提高精确度,这里抽样的数量为1000个(其实1000个是很少的了,通常需要10万个甚至50万个,但是在Excel表格中操作这么多数字,不方便,这是Excel的不足之处)。

下一步,用norminv(probability, mean, std)函数来获得股票收益率分布的1000个抽样,其中的probability参数由rand()产生的抽样逐个代入,mean=0.0, std = 0.01。注意这里抽样得到的日度收益率。也就是说,这个样本对应的下一个交易日股票价格的收益率分布。

下一步,股票价格=50×exp(收益率样本),得到股票价格分布的抽样,有1000个样本。


根据我做的实验,这1000个样本的分布图形(histogram)跟对数正态分布是比较接近的,如下图所示:

图的横轴是股票价格,纵轴是样本中出现的频率。

得到了股票价格未来一天分布的样本之后,就可以以此样本来计算期权的价格了。

欧式看涨期权的定义为:

C=max(S-K,0)

所以,根据这个计算公式可以计算出在到期那天在特定的价格下期权的价值。在Excel中,相当于 期权价值=max(股票价格样本 - 50,0)。由此就可以得到了该期权未来1天价值的样本。

然后,将未来价值贴现回来(用无风险利率贴现,假设无风险利率为0.05,则贴现公式是=exp(-0.05/360)×期权价值,得到期权价格的1000个样本。

最后,对期权价格的1000个样本求平均,Excel函数average(期权价格样本),就可以得到期权的价格了。

我这里算出来的是:0.2015元。

而根据Black-Scholes期权定价公式算出来的理论价格则是0.2103元。二者比较接近,但是还是有差距。


而且,每次刷新Excel表格,就重新做一次模拟,得到的模拟价格变动比较大,有时是0.2043元,有时是0.1989元。由于这个抽样的数量比较小(1000个样本),所以估算的结果受到样本的影响会比较大。如果把抽样数量提高100倍甚至500倍,那么样本变动的影响可能会小一个或者两个数量级。但是计算量就大了,如果计算机性能不够高,那么利用Excel来做的话,比较困难。

这就是我的工作台:

------ 再来一个 --------

看到有人提到利用蒙特卡洛方法来估计圆周率Pi,挺有意思,也简单,所以就在Excel中做了一个实验。

基本原理在于在直角坐标系中的第一个象限中的一个单位圆,如下图所示:

在这个面积为1的正方形中,有四分之一的圆,圆的半径与正方向的边长都是1。那么根据圆的面积公式,这个图形中阴影部分的面积应该是 Pi/4。

下面开始进入蒙特卡洛的解法。

即,如果我们对这个正方形平面中的点进行均匀地抽样,随着抽样点的增多,那么落入阴影内的点的数量与总抽样数量的比,应该基本上等于阴影的面积Pi/4与整个正方形面积1的比,即Pi/4。用数学表示,就是

阴影内的样本点数量 ÷ 总数量 = Pi/4

所以,Pi = 4 × 阴影内的样本点数量 ÷ 总数量。


下面就在Excel中进行实验。

用rand()函数生成2000个随机数,作为随机样本点的X轴坐标,

再用rand()函数生成2000个随机数,作为随机样本点的Y轴坐标。

如此就得到了2000个随机样本点,这些点的X轴坐标和Y轴坐标都大于零且小于1,所以是在前面所说的正方形之中的点。

下一步,判断样本点是否处于阴影之内,由于这个阴影就是单位圆在直角坐标系第一想象的四分之一,所以圆阴影内的点都符合如下不等式:

翻译到Excel中,就是用IF函数来判断,例如:

IF(A2^2 + B2^2 <=1, 1, 0)

即,如果样本点在阴影中,得到1,否则得到0。这样就把样本点区分开来了。

最后,把所有得到的1和0加总,就知道所有样本点中处于阴影中样本点的数量了。

最后根据

Pi = 4 × 阴影内的样本点数量 ÷ 总数量

就可以算出Pi来了。

我这个试验中算出来的 Pi=3.142。

以下是样本点的散点图:

由于样本数量有限,所以计算出来的Pi的精度并不高。

以下是工作界面,挺简单的。

来源:知乎

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
周启萌
2018-07-26 · TA获得超过1152个赞
知道大有可为答主
回答量:1441
采纳率:86%
帮助的人:1716万
展开全部
用到两个内置函数,即用rand()来产生0到1之间的随机数,然后用norminv()来获得服从既定分布的随机数,即收益率样本=norminv(rand(), 0, 0.1)。假定股票价格的初始值是100元,那么模拟的价格就是 S=100 * exp(cumsum(收益率样本))。
其中的cumsum()不是Excel的内置函数,其意思就是收益率样本的累积,每个时刻的值都是当前样本及此前所有样本的和,如,收益率样本从单元格C3开始,当前计算C15对应的模拟价格,则模拟价格计算公式是:100 * exp(sum($C$3:C15))。
由此可以得到股票价格的一条模拟路径。

其他非正态分布也可以通过类似方式得到分布的抽样,即分布函数的逆函数,这些函数Excel都内置了。所以,做蒙特卡洛模拟的时候,关键是先确定所需模拟的分布,然后进行抽样,然后应用层面的各种公式就可以在抽样的基础上进行计算了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nice山东草原狼

2017-11-07 · 好的设计人就是好同学
nice山东草原狼
采纳数:31656 获赞数:825108

向TA提问 私信TA
展开全部
1、首先,我们来填入这三个活动时间估算的乐观值,最可能值和悲观值。
分别计算这三个活动的均值和标准差。
均值=(乐观值+4 * 最可能值 + 悲观值)/ 6
标准差=(悲观值-乐观值)/ 6
根据第二步计算出来的均值和标准差,对三个活动按照正态分布进行随机模拟。因为是测试项目,这里我们只进行随机100次。
公式:=INT(NORMINV(RAND(),$F$2,$G$2))
其中:NORMINV 正态分布;INT 去整; RAND() 取随机数;
2、将随机出来的值,进行固化。也就是将上一步中红框的区域,按值复制一份。以防止随机数在每次更改单元格后都会发生变化。
3、由于3个活动均为FS的关系,所以三个互动的时间之和就等于总项目时间。
将总工期考入新的Sheet,并进行从小到大的重新排序。
4、将排序后的数据进行筛选,剔除重复数据。从而的到全部模拟出来工期的值。
进行频度统计。首先选中与总工期相对应的频度下面的单元格D2:D23,然后输入公式“=FREQUENCY(A2:A101,C2:C23)”,然后按下Ctrl+Shift+Enter。如此会计算出模拟出来各个总工期的发生次数。
5、计算积累频度:每一个频度的积累频度=自身的频度+前面所有项的频度之和
选择二维折线图;
6、在添加的空白折线图上右键“选择数据区域”: 数据区域即总工期和积累频度两列。由于我们并不需要总工期呈现为曲线形式,在选择后的对话框中,将总工期删除,只保留累计频度。
将“累计频度改为“蒙特卡洛模拟”。
7、选择标轴C2:C23
最终选择一个好看的样式,展现辛苦生成的图表就可以啦。

注意事项:这里模拟的项目是一个只有3个首尾相接活动的简单项目。在实际项目中,必须考虑由于活动工期变化所导致的关键路径变化的情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式