-
2022-04-06 14:52:51
什么是蒙特卡洛模拟呢?让我来说说吧:
蒙特卡洛(Monte Carlo)方法,又称随机抽样或统计试验方法,属于计算数学的一个分支,它是在上世纪四十年代中期为了适应当时原子能事业的发展而发展起来的。传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。这也是以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。
蒙特卡洛模拟有两个优点:
一是简单,省却了繁复的数学报导和演算过程,使得一般人也能够理解和掌握;
二是快速。简单和快速,是蒙特卡罗方法在现代项目管理中获得应用的技术基础。
让我们实现关于 抛硬币 的蒙特卡洛模拟吧!
废话不说,先上代码:
import random #导入模块 # 模拟功能 def simulate(): # 第一次抛硬币 res1 = random.randint(0, 1) # 第二次抛硬币 res2 = random.randint(0, 1) # 返回模拟结果 return [res1, res2] # 测试次数 n = 100 #计算力强大的可以多几个0,越多越精细 # 第一次为反面(0),第二次为正面(1)的次数 m = 0 # 循环n次进行测试 for i in range(n): # 模拟并返回模拟结果 res_list = simulate() # 如果第一次res_list[0]为反面(0),并且第二次res_list[1]为正面(1) if res_list[0] and res_list[1] ==1: # 次数加1 m = m + 1 # 打印可能性 print(m / n)
更多相关内容 -
用Python实现蒙特卡洛模拟
2020-12-08 20:41:23引用Numpy库NumPy库是...蒙特卡洛模型用到的Numpy句法:1、首先引用Numpy库,起个名字叫npimport numpy as np2、生成符合正太分布的0~99之间的随机整数 ,total_count代表生成随机数的个数,也就是要模拟多少次np.r...引用Numpy库
NumPy库是Python的一种开源的数值计算扩展,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。NASA用其来处理一些运算。
蒙特卡洛模型用到的Numpy句法:
1、首先引用Numpy库,起个名字叫np
import numpy as np
2、生成符合正太分布的0~99之间的随机整数 ,total_count代表生成随机数的个数,也就是要模拟多少次
np.random.randint(0,99,Total_Count)
3、用Numpy自带函数计算相关指标 (NPV_Num是一个数组)
Max_Num=np.max(NPV_Num)
Min_Num=np.min(NPV_Num)
Mean_Num=round(np.mean(NPV_Num),0)
Std_Num=int(np.std(NPV_Num, ddof = 1))
用判断语句给相关参数赋值
以研发费为例,Python的句法实际上就是把EXCEL公式“翻译”了一遍。Index_YFF是一个数组,使用.append方法增加数组值。
Index_YFF=[]
rnd_nums=np.random.randint(0,99,Total_Count)
rnd_num rnd_nums:
rnd_num<=19:
Index_YFF.append(400)
rnd_num>19
rnd_num<=69:
Index_YFF.append(500)
rnd_num>69:
Index_YFF.append(600)
用Print语句输出计算结果
Print语句是Python常用的语句,用来显示结果值。
print("样本数:",Total_Count)
print("最大值:",Max_Num)
print("最小值:",Min_Num)
print("平均值:",Mean_Num)
print("标准差:",Std_Num)
用matplotlib库画图
Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
counts, bins, path = plt.hist(NPV_Num,bins=Std_Num,color='green',density=True)
plt.title("Normal distribution")
plt.show()
写一个可以计算年金现值的函数
编程就像搭积木,主程序一般是描述程序运行的顺序和逻辑,而一些用来传递参数进行处理的代码,可以放到自定义函数中。
def pv_f(c,r,n,when=1):
c=np.array(c)
r=np.array(r)
if when==1:
n=np.arange(1,n+1)
else:
n=np.arange(0,n)
pv=c/(1+r)**n
return pv.sum()
至此,用Python模拟蒙特卡洛的方法和代码介绍完了。和EXCEL比较起来,Python的方法更容易扩展,运算速度更快,大有用武之地!
-
蒙特卡洛模拟
2017-12-05 16:07:40用Python实现蒙特卡洛模拟( Monte Carlo simulation),蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为... -
蒙特卡洛模拟(Python)深入教程
2020-12-08 20:44:03字幕组双语原文:蒙特卡洛模拟(Python)深入教程英语原文:Monte Carlo Simulation An In-depth Tutorial with Python翻译:大表哥、wiige什么是蒙特卡罗模拟?蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的...字幕组双语原文:蒙特卡洛模拟(Python)深入教程
英语原文:Monte Carlo Simulation An In-depth Tutorial with Python
翻译:大表哥、wiige
什么是蒙特卡罗模拟?
蒙特卡罗方法是一种使用随机数和概率来解决复杂问题的技术。 蒙特卡罗模拟或概率模拟是一种技术,用于了解金融部门、项目管理、成本和其他预测机器学习模型中风险和不确定性的影响。
风险分析几乎是我们做出的每一个决定的一部分,因为我们在生活中经常面临不确定性、模糊性和变化无常。 此外,即使我们拥有前所未有的信息获取渠道,我们也不能准确预测未来。
蒙特卡洛模拟使我们能够看到决策的所有可能结果,并评估风险影响,从而在不确定的情况下更好地做出决策。
在本文中,我们将通过五个不同的例子来理解蒙特卡罗模拟方法。
资源: Google Colab Implementation | GitHub Repository
应用领域:
金融
项目管理
能量
制造业
工程学
研究和开发
保险
石油和天然气公司
交通
环境
还有其他
举例:
抛硬币示例
用圆和平方估计PI
三门问题
蒲丰投针问题
为什么赌场总是赚的?
a. 抛硬币示例:
抛硬币中奖的概率是1/2。但是,我们有没有办法从实验上证明这一点呢? 在这个例子中,我们将使用蒙特卡罗方法迭代地模拟抛硬币5000次,以找出为什么头部或尾巴的概率总是1/2。如果我们重复抛硬币很多很多次,那么我们可以在概率值的准确答案上获得更高的精确度。在这个例子中,我们将使用Monte-Carlo方法反复模拟抛硬币5000次,以找出头部或尾部的概率始终是1/2的概率。
图2:正面和反面,数学表示。
在抛硬币时:
图3:正面和反面硬币的公式示例。
接下来,我们将用蒙特卡罗方法对这个公式进行实验证明。
Python实现:
1.导入所需的库:
图4:为我们的抛硬币示例导入所需的库。
2.投币功能:
图5:一个简单的函数,将结果随机排列在0和1之间,头部为0,尾部为1。
3.检查函数输出:
图6:运行Coin_Flip()函数
4.主要功能:
图7:计算概率并将概率值附加到结果。
5.调用main函数:
图8:调用Monte Carlo主函数,并绘制最终值。
如图8所示,我们显示在5,000次迭代之后,获得尾部的概率为0.502。 因此,这就是我们可以如何使用蒙特卡罗模拟来通过实验找到概率的方法。
b.使用圆形和正方形估算PI:
图9:圆形和正方形的简单面积。
图10:分别计算圆形和正方形的面积。
要估计PI的值,我们需要正方形的面积和圆的面积。 为了找到这些区域,我们将在表面上随机放置点,并计算落在圆内的点和落在正方形内的点。 这将给我们一个估计的面积。 因此,我们将使用点数作为面积,而不是使用实际面积。
在下面的代码中,我们使用Python的Turtle模块来查看点的随机放置。
python实现:
1.导入需要的库
图10:为我们的π示例导入所需的库。
2.可视化这些点:
图11:绘制图形。
3.初始化部分必填数据:
图12:初始化数据值。
4.主要功能:
图13:实现主功能。
5.绘制数据:
图14:绘制数据值。
6.输出
图15:使用蒙特卡罗方法的π近似。
图16:值的数据可视化。
图17:值的数据可视化。
如图17所示,我们可以看到,经过5000次迭代后,我们可以得到PI的近似值。 另外,请注意,随着迭代次数的增加,估计误差也呈指数下降。
3. 三门问题:
假设你正在参加一个游戏节目,你可以从三扇门中选择一扇:一扇门后面是一辆汽车;另一扇门后面是山羊。 你选了一扇门,假设是1号门,主人,谁知道门后面有什么,就打开另一扇门,比如说3号门,里面有一只山羊。 主人然后问你:你是坚持自己的选择,还是选择另一扇门?
选择不同的门对你有好处吗? 事实证明,从概率上说,打开门对我们有利。具体分析:最初,对于所有的三个门,得到车的概率(P)是相同的(P = 1/3)。
图18:三个门的模拟,展示了每个可能的结果。
现在假设参赛者选择了门1。接下来,主人打开第三扇门,里面有一只山羊。接下来,主持人问参赛者是否要换门?我们将看到为什么转换门更有利:
图19:门的图示结果。
在图19中,我们可以看到在主人打开门3之后,拥有一辆车的最后两个门的概率增加到2/3。现在我们知道第三扇门有一只山羊,第二扇门有一辆车的概率增加到2/3。因此,换门更为有利。现在我们将使用蒙特卡罗方法来多次执行这个测试案例,并通过实验的方式找出它的概率。
Python 实现:
1. Import所需库:
图20: 导入所需库。
2. 初始化数据:
图21: 初始化代表门的枚举变量和存储概率值的列表。
3. Main函数:
图22: 用蒙特卡洛模拟来实现主函数。
4. 调用main函数:
图23: 调用主函数模拟1000次博弈。
5. 输出:
图24: 得到坚持自己的选择或换门的近似获胜概率。
在图24中,我们发现在1000次模拟后,如果我们换门,获胜概率是0.669。因此,我们确信在本例中换门对我们更有利。
4. 蒲丰投针问题:
法国贵族Georges-Louis Leclerc,即蒲丰公爵在1777年提出了这样一个问题[2] [3]:
若在一张绘有等距平行线的纸上随意抛一根短针,求针和任意一条线相交的概率。
概率取决于方格纸的线间距(d),和针长度(l)——或者说,它取决于l/d的比值。在这个例子里,我们可以认为针长度l≤d。简而言之,我们假设了针不能同时相交于两条不同的线。令人惊讶的是,蒲丰针问题的答案与PI相关。
这里,我们将使用用蒙特卡洛法来解蒲丰投针问题,顺便估计出PI的值。不过在此之前,我们要先展示一下解法是如何推导出来的,这样会更有趣。
定理:
如果一根长为l的短针落在一张纸上,而纸上画有距离d≥l的等距线,那么针与任一条线相交的概率为:
图25: 蒲丰投针定理。
证明:
图26: 蒲丰投针问题的可视化。
首先,我们需要统计出与任意垂线相交的针的数量。若针与任意一条线相交,对于特定的θ值,针与垂线相交的最大和最小可能值为:
最大可能值:
图27: 最大概率值。
最小可能值:
图28: 最小可能值。
因此, 对于特定的θ值,针在垂线上的概率是:
图29: 针与垂线相交的概率公式。
这个概率公式局限于特定θ值,在本实验中,θ的范围是0到pi/2。所以,我们需要对所有的θ值做一个积分,得到投针相交的实际概率。
图 30: 对所有θ值积分的投针相交概率公式。
图 31: PI的估计值。
由蒲丰投针问题来估计PI:
接下来,我们要用上面的公式来进行实验求得PI值。
图 32: 求PI值。
现在,因为我们已经知道了l和d的值,所以只要求得了P的值,我们就可以推知PI的值。而要得到概率P,必须要知道相交针数和总针数, 这里的总针数是已知的。
下图是计算相交针数的直观图解。
图33: 可视化表示如何计算针的数量。
Python 实现:
Import 所需的库:
图34: 导入所需库。
2. Main 函数:
图35: 用蒙特卡洛方法模拟蒲丰投针。
3. 调用main函数:
图36: 调用main函数模拟蒲丰投针。
4. 输出:
图 37: 使用蒙特卡洛方法模拟100次投针的数据。
如图37所示,经过100次的模拟,蒙特卡洛法就能得出一个非常接近PI的值。
图源: Pexels
5. 为什么赌场总是赚的?
赌场是怎么赚钱的? 诀窍很简单--“你玩得越多,他们赚的就越多。” 让我们通过一个简单的蒙特卡罗模拟示例来看看这是如何工作的。
考虑一个假想的游戏,玩家必须从一袋筹码中选择一个筹码。
规则:
袋子里有数字从1到100的筹码。
用户可以押注于偶数或奇数筹码。
在这个游戏中,10和11是特殊的数字。 如果我们赌偶数,那么10就算奇数,如果我们赌赔率,那么11就算偶数。
如果我们赌偶数,我们得了10,那么我们就输了。
如果我们赌的是奇数,我们得了11,那么我们就输了。
如果我们以赔率下注,我们获胜的概率为49/100。 获胜的概率为51/100。 因此,对于一个奇数下注,彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%
如果我们打赌偶数,则用户获胜的概率为49/100。 获胜的概率为51/100。 因此,对于一个奇数下注,彩池优势为= 51 / 100–49 / 100 = 200/10000 = 0.02 = 2%
综上所述,每下注1美元,就会有0.02美元下注。 相比之下,轮盘上最低的单一0优势是2.5%。 因此,我们可以肯定,与轮盘赌相比,您在假想的游戏中获胜的机会更大。
Python 实现:
Import所需的库:
图38: 导入赌场模拟所需的库。
2. 玩家下注:
图39: 在下注奇数或偶数。
3. Main 函数:
图 40: 使用蒙特卡洛方法模拟赌场行为。
4. 最终输出:
图41: 计算并展示计算结果。
5. 模拟1000次试试:
图 42: 模拟1000次。
6. 下注数 = 5:
图43: 下注5次时的结果可视化。
7. 下注数 = 10:
图44: 下注10次时的结果可视化。
8. 下注数 = 1000:
图45: 下注1000次时的结果可视化。
9. 下注数 = 5000:
图46: 下注5000次时的结果可视化。
10. 下注数 = 10000:
图47: 下注10000次时的结果可视化。
从上面的实验中,我们可以看到,如果玩家在赌博中下注较少,那么有得赚的机会就比较大。有时候实验会得到负数,这意味着玩家输得倾家荡产负债累累,而不是单车变路虎。
请注意, 这些比例源于为促进理解的非真实场景,认不赌为赢。
结论:
就像任何预测模型一样 模拟结果只有我们的估计值才是好的 重要的是要记住,蒙特卡洛模拟只代表概率而不是确定性。尽管如此,在预测未知的未来时,蒙特卡洛模拟是一个有价值的工具。
声明:本文所表达的观点仅代表作者本人,不代表CMU的观点。这些文字并非为最终成品,仅为当下思考记录以促进学习和交流。
-
用python绘制蒙特卡洛模拟数据折线图
2020-08-19 10:54:08研究蒙特卡洛模拟算法,在excel中模拟出了数据变量,需要绘图的时候,excel会卡死,借助python绘图。 参考如下教程: python使用matplotlib绘制折线图教程 https://www.cnblogs.com/onemorepoint/p/7482644.html 没...研究蒙特卡洛模拟算法,在excel中模拟出了数据变量,需要绘图的时候,excel会卡死,借助python绘图。
参考如下教程:
python使用matplotlib绘制折线图教程
https://www.cnblogs.com/onemorepoint/p/7482644.html没找到上传excel附件的位置,把图片贴出来对数据做一个说明:
第1行为X周,是时间单位,由于是相对时间,所以直接用数字代替
第1列是模拟的次数,总共1000次,每个单元格中的数值为X所对应的y值。根据以上教程修改后的代码如下:
import matplotlib.pyplot as plt import xlrd y=[[] for i in range(0,999)] workbook=xlrd.open_workbook(r'.\file\price.xlsx') sheet=workbook.sheets()[0] #取每一行数据为y值 for i in (range(0,999)): y[i] = sheet.row_values(i+1) #取第一行数据作为x坐标轴 x = sheet.row_values(0) for i in (range(0,999)): plt.plot(x[1:],y[i][1:]) plt.title('line chart') plt.xlabel('x') plt.ylabel('y') plt.show()
运行结果如下:
-
雪球产品python蒙特卡洛模拟实现产品定价
2021-07-11 00:50:13首先用蒙特卡洛模拟股票路径(注意要先做正态检验),这个网上资源很多,不再赘述 核心是计算出每支股票路径的雪球收益,核心python代码如下: """ 计算模拟出的每支股票路径的雪球收益 参数: getin_rate : ... -
雪球产品蒙特卡洛模拟实现产品定价
2022-02-17 15:33:32注:tushare的token目前可用,但是不一定什么时候就失效了,建议自己到tushare(https://www.tushare.pro/)中注册一个,使用自己的token,另外,获取指数信息的需要额外的tushare分数的。 具体描述见博客:... -
如何通过Python实现蒙特卡罗模拟算法
2022-03-19 22:07:06本文主要介绍蒙特卡罗模拟算法,以及如何通过Python来模拟问题。 -
蒙特卡洛模拟Ising模型(附Python代码)
2021-01-14 10:44:42Ising (伊辛)模型为:这里要用到Metropolis采样,可看这篇文章:代码主要参照参考资料[1], 是采用XY Ising模型。自己有做了些改动和注释,看起来会更容易些。代码如下:import randomimport matplotlib.pyplot as ... -
【蒙特卡洛模拟】稳定匹配问题-python实现
2021-01-22 16:43:41适合数据挖掘工程师、算法工程师等群体下载 -
蒙特卡罗模拟法 —— python
2022-02-11 13:11:271.简介 2.实例分析 2.1 模拟求近似圆周率 2.2估算定积分 2.3求解整数规划 -
【建模算法】蒙特卡罗模拟法(Python实现)
2022-04-18 22:44:56蒙特卡罗(Monte Carlo)方法,也称为随机模拟(random simulation)。基本思想:为了解决数学、物理、工程技术等方面的问题,首先建立一个概率模型或随机过程,使它的参数等于问题的解;然后通过对模型或过程的观察... -
期权定价数值方法之蒙特卡洛模拟【python量化】
2021-12-13 17:35:47期权定价数值方法之蒙特卡洛模拟 -
MonteCarlo(蒙特卡洛模拟)雪球产品定价
2022-07-08 13:32:23蒙特卡洛模拟(MC)标准雪球定价 -
python编程通过蒙特卡洛法计算定积分详解
2020-12-23 14:12:42下面使用蒙特卡洛法计算区间[2 3]上的定积分:∫(x2+4*x*sin(x))dx # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt def f(x): return x**2 + 4*x*np.sin(x) def intf -
Python蒙特卡洛模拟工作或任务轻重缓急策略
2022-05-12 10:57:10建模工具 蒙特卡洛模拟通过将一系列值(概率分布)替换为具有固有不确定性的任何因素来构建可能结果的模型,从而执行风险分析。 然后它一遍又一遍地计算结果,每次都使用来自概率函数的一组不同的随机值。这就是... -
12 Python总结之蒙特卡洛模拟
2021-03-17 11:46:16蒙特卡洛模拟蒙特卡洛模拟是金融学和数值科学中最重要的算法之一。它之所以重要,是因为在期权定价或者风险管理问题上有很强的能力。和其它数值方法相比,蒙特卡洛方法很容易处理高维问题,在这种问题上复杂度和计算... -
python 蒙特卡洛模拟_蒙特卡洛模拟(Python)深入教程
2020-08-10 19:11:59python 蒙特卡洛模拟 重点 (Top highlight) 机器学习 , 数学 , 程序设计 , 教程 (Machine Learning, Mathematics, Programming, Tutorial) Author(s): Pratik Shukla, Roberto Iriondo 作者:Pratik Shukla,... -
【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例
2022-05-17 18:45:34原文出处:拓端数据部落公众号 ...视频:风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 ,时长10:. -
用 Python 中的蒙特卡洛模拟预测股票收益
2021-08-21 00:07:27蒙特卡洛方法(或蒙特卡洛实验)是一大类计算算法,它们依赖于重复随机采样来获得数值结果。基本思想是使用随机性来解决原则上可能是确定性的问题。它们通常用于物理和数学问题,并且在难以或不可能使用... -
TAROT:用于python中的蒙特卡洛模拟的易于使用的框架-开源
2021-04-13 11:50:00TAROT是用于python中的蒙特卡洛模拟的易于使用的框架。 像基本算术一样,使不同种类的随机分布数之间的计算变得容易。 塔罗牌提供了用于解释的交互式图形界面。 -
蒙特卡洛仿真的基于Python实例
2021-12-04 20:44:18在此示例中,我们将使用蒙特卡洛方法模拟掷硬币 5000 次,以找出为什么正面向上的概率始终为 1/2。如果我们重复掷这个硬币很多很多次,那么可以达到更高的准确性。 ## 导入库 import random import numpy as np ... -
蒙特卡洛法求圆周率(python)
2022-05-26 10:24:49蒙特卡洛法求圆周率(python) -
随机模拟——蒙特卡洛算法及Python实现
2020-12-12 19:29:06随机模拟——蒙特卡洛算法及Python实现irony•2020 年 04 月 24 日蒙特卡洛算法介绍蒙特卡洛算法(Monte Carlo method)也称统计模拟算法,是一种以概率统计理论为指导的数值计算方法方法。是指使用随机数来解决很多... -
美式期权定价方法之最小二乘蒙特卡洛模拟(LSM)
2021-12-14 10:41:33前文对欧式期权的蒙特卡洛模拟定价方法进行了介绍和python量化,本章节主要是对前一章节的补充。也就是介绍美式期权的蒙特卡洛定价方法。 一、美式期权 不同于欧式期权,美式期权合约的行权时间是不固定的。 美式... -
马尔可夫蒙特卡洛(MCMC)附python代码
2022-01-22 13:04:42详解马尔可夫蒙特卡洛方法,主要是介绍了Metropolis-Hastings Samling算法。 -
蒙特卡洛模拟计算菲涅尔反射系数python实现.docx
2021-03-20 16:19:27python实现蒙特卡洛模拟计算菲涅尔反射系数