利用蒙特卡罗模拟

Python 中的蒙特卡洛模拟

Izzy Weber

Curriculum Manager, DataCamp

广泛适用性

蒙特卡罗模拟应用于:

  • 金融与商业
  • 工程
  • 物理科学
Python 中的蒙特卡洛模拟

股价预测

显示随时间变化的模拟股价图

1 https://marketxls.com/monte-carlo-simulation-excel
Python 中的蒙特卡洛模拟

风险管理

显示 VaR 置信区间的图

1 https://www.investopedia.com/articles/04/092904.asp https://corporatefinanceinstitute.com/course/modeling-risk-monte-carlo-simulation/
Python 中的蒙特卡洛模拟

结合位点识别

 

蛋白质结合位点图示

1 https://pubs.rsc.org/en/content/articlelanding/2020/ra/d0ra01127d
Python 中的蒙特卡洛模拟

工程中的可靠性分析

显示安全与失效域的图表

1 www.researchgate.net/publication/228814883_Probabilistic_Transformation_Method_in_Reliability_Analysis
Python 中的蒙特卡洛模拟

蒙特卡罗模拟的优势

 

  • 考虑各输入的取值范围
  • 不仅展示可能结果,还给出其概率
  • 便于可视化所有可能结果范围
  • 可检验不同情境下会发生什么

 

用蒙特卡罗模拟进行优化

Python 中的蒙特卡洛模拟

有偏骰子的袋子

从两个袋子中各掷一个骰子,每个袋子含三个有偏骰:

bag1 = [[1, 2, 3, 6, 6, 6], [1, 2, 3, 4, 4, 6], [1, 2, 3, 3, 3, 5]]
bag2 = [[2, 2, 3, 4, 5, 6], [3, 3, 3, 4, 4, 5], [1, 1, 2, 4, 5, 5]]

 

模拟:

  • 随机各取一枚骰子并同时掷出
  • 点数之和为 8 记为成功,否则为失败
  • 计算每种唯一骰子组合的成功概率
Python 中的蒙特卡洛模拟

有偏骰子模拟

def roll_biased_dice(n):
    results = {}

for i in range(n): bag_index1 = random.randint(0, 2) die_index1 = random.randint(0, 5) bag_index2 = random.randint(0, 2) die_index2 = random.randint(0, 5)
point1 = bag1[bag_index1][die_index1] point2 = bag2[bag_index2][die_index2]
key = "%s_%s" % (point1, point2)
if point1 + point2 == 8: if key not in results: results[key] = 1 else: results[key] += 1
Python 中的蒙特卡洛模拟

有偏骰子结果

dice1_dice2 probability_of_success
6_2 5.54
3_5 2.67
2_6 1.45
4_4 4
Python 中的蒙特卡洛模拟

有偏骰子结果

bag1 = [[1, 2, 3, 6, 6, 6], [1, 2, 3, 4, 4, 6], [1, 2, 3, 3, 3, 5]]
bag2 = [[2, 2, 3, 4, 5, 6], [3, 3, 3, 4, 4, 5], [1, 1, 2, 4, 5, 5]]

1 万次试验的模拟结果: 显示骰子组合成功概率的柱状图

Python 中的蒙特卡洛模拟

有偏骰子结果

bag1 = [[2, 2, 3, 4, 6, 6], [1, 2, 2, 4, 6, 6], [1, 2, 3, 3, 3, 3]]
bag2 = [[1, 2, 3, 4, 5, 6], [1, 3, 3, 4, 4, 6], [2, 2, 2, 3, 5, 5]]

1 万次试验的模拟结果: 显示骰子组合成功概率的柱状图

Python 中的蒙特卡洛模拟

蒙特卡罗模拟的局限

  • 模型输出取决于输入质量
  • 极端事件的概率常被低估
Python 中的蒙特卡洛模拟

Vamos praticar!

Python 中的蒙特卡洛模拟

Preparing Video For Download...