本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。
原文链接:Python 蒙特卡洛模拟
蒙特卡洛模拟是一种基于随机数和概率分布的数值计算方法,广泛应用于金融、物理、工程等领域,用于解决复杂的概率问题。它通过多次随机实验,逼近问题的解或估计某些指标的值。在现代计算中,Python 提供了丰富的库和工具,可以高效地实现蒙特卡洛模拟。
蒙特卡洛模拟的基本原理
蒙特卡洛模拟的核心思想是通过随机抽样和大量实验,逼近真实结果。
其基本步骤包括:
-
构建数学模型:明确问题并将其表示为概率问题。
-
生成随机样本:根据问题的概率分布,生成大量随机数据。
-
模拟实验:对每个随机样本执行实验或计算。
-
统计结果:通过实验结果估计目标值或概率。
蒙特卡洛模拟的精度取决于实验次数:实验次数越多,结果越接近真实值。
示例数据准备
在实际问题中,蒙特卡洛模拟可以用于估算 π 的值、金融风险评估、随机过程模拟等。以下通过估算 π 的值引入基本实现。
用蒙特卡洛模拟估算 π 的值
在一个单位正方形中,画一个内接圆。通过随机生成点计算落入圆内的点占总点数的比例,可以近似求得 π 值:

import random
# 蒙特卡洛模拟估算 π
def estimate_pi(num_samples):
inside_circle = 0
for _ in range(num_samples):
x, y = random.uniform(0, 1), random.uniform(0, 1)
if x**2 + y**2 <= 1:
inside_circle += 1
return 4 * inside_circle / num_samples
# 运行模拟
num_samples = 100000
pi_estimate = estimate_pi(num_samples)
print(f"使用 {num_samples} 次模拟估算 π 的值为:{pi_estimate}")
运行结果示例:
使用 100000 次模拟估算 π 的值为:3.14178
随机过程模拟
随机过程是蒙特卡洛模拟的重要应用场景,特别是在金融和物理领域。例如,股票价格的随机变化可以用布朗运动来建模。
假设初始股票价格为 ( S_0 ),每天的价格变化服从正态分布 ( \mathcal{N}(\mu, \sigma) )。通过模拟未来若干天的价格变化,可以预测价格的可能范围。
import numpy as np
import matplotlib.pyplot as plt
# 模拟股票价格的布朗运动
def simulate_stock_price(S0, mu, sigma, days, num_simulations):
dt = 1 # 时间步长为1天
simulations = []
for _ in range(num_simulations):
prices = [S0]
for _ in range(days):
change = np.random.normal(mu * dt, sigma * np.sqrt(dt))
prices.append(prices[-1] * np.exp(change))
simulations.append(prices)
return np.array(simulations)
# 参数设置
S0 = 100 # 初始价格
mu = 0.05 # 日均回报率
sigma = 0.2 # 日波动率
days = 252 # 模拟一年
num_simulations = 100 # 模拟次数
# 模拟并可视化结果
simulated_prices = simulate_stock_price(S0, mu, sigma, days, num_simulations)
for prices in simulated_prices:
plt.plot(prices, alpha=0.5)
plt.title("股票价格布朗运动模拟")
plt.xlabel("天数")
plt.ylabel("价格")
plt.show()
此代码生成若干条可能的股票价格路径,反映价格的随机波动。
概率分布实现
蒙特卡洛模拟需要随机数的支持,而这些随机数通常遵循某种概率分布。
生成正态分布随机数
正态分布广泛应用于自然现象和金融建模。
# 生成正态分布的随机数
mean, std_dev = 0, 1 # 均值和标准差
samples = np.random.normal(mean, std_dev, 1000)
# 可视化分布
plt.hist(samples, bins=30, density=True, alpha=0.6, color='g')
plt.title("正态分布随机数")
plt.show()
生成均匀分布随机数
均匀分布常用于简单的随机抽样。
# 生成均匀分布的随机数
samples = np.random.uniform(0, 1, 1000)
# 可视化分布
plt.hist(samples, bins=30, density=True, alpha=0.6, color='b')
plt.title("均匀分布随机数")
plt.show()
自定义分布
可以通过概率密度函数(PDF)或累积分布函数(CDF)生成自定义分布的随机数。
# 自定义概率密度函数
def custom_pdf(x):
return 2 * x # 示例:线性分布
# 生成自定义分布的随机数
x = np.linspace(0, 1, 1000)
y = custom_pdf(x)
custom_samples = np.random.choice(x, size=1000, p=y/y.sum())
# 可视化分布
plt.hist(custom_samples, bins=30, density=True, alpha=0.6, color='r')
plt.title("自定义分布随机数")
plt.show()
实际应用场景
选址问题的模拟
假设一个公司计划在城市中选址,需要评估交通流量的随机变化对选址的影响,可以通过蒙特卡洛模拟实现。
# 模拟交通流量选址问题
def simulate_traffic(num_samples, traffic_mean, traffic_std):
traffic = np.random.normal(traffic_mean, traffic_std, num_samples)
profit = traffic * 100 - 5000 # 利润 = 客流量 * 收入 - 固定成本
return profit
num_samples = 10000
profit_samples = simulate_traffic(num_samples, 100, 15)
plt.hist(profit_samples, bins=30, alpha=0.6, color='purple')
plt.title("选址问题的利润分布")
plt.xlabel("利润")
plt.ylabel("频数")
plt.show()
# 估算风险概率
risk_probability = (profit_samples < 0).mean()
print(f"亏损的概率为:{risk_probability:.2%}")
金融衍生品定价
蒙特卡洛模拟也广泛用于金融衍生品(如期权)的定价,通过模拟资产价格路径估计衍生品的期望价值。
总结
本文详细介绍了蒙特卡洛模拟的基本原理及其在 Python 中的实现,包括 π 的估算、随机过程模拟和概率分布生成等内容。此外,还展示了蒙特卡洛模拟在选址问题和金融建模中的实际应用。通过大量的随机实验和统计分析,蒙特卡洛方法可以有效解决复杂的概率问题,是现代计算中的重要工具。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

6522

被折叠的 条评论
为什么被折叠?



