python | Python 蒙特卡洛模拟

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:Python 蒙特卡洛模拟

蒙特卡洛模拟是一种基于随机数和概率分布的数值计算方法,广泛应用于金融、物理、工程等领域,用于解决复杂的概率问题。它通过多次随机实验,逼近问题的解或估计某些指标的值。在现代计算中,Python 提供了丰富的库和工具,可以高效地实现蒙特卡洛模拟。

蒙特卡洛模拟的基本原理

蒙特卡洛模拟的核心思想是通过随机抽样和大量实验,逼近真实结果。

其基本步骤包括:

  1. 构建数学模型:明确问题并将其表示为概率问题。

  2. 生成随机样本:根据问题的概率分布,生成大量随机数据。

  3. 模拟实验:对每个随机样本执行实验或计算。

  4. 统计结果:通过实验结果估计目标值或概率。

蒙特卡洛模拟的精度取决于实验次数:实验次数越多,结果越接近真实值。

示例数据准备

在实际问题中,蒙特卡洛模拟可以用于估算 π 的值、金融风险评估、随机过程模拟等。以下通过估算 π 的值引入基本实现。

用蒙特卡洛模拟估算 π 的值

在一个单位正方形中,画一个内接圆。通过随机生成点计算落入圆内的点占总点数的比例,可以近似求得 π 值:

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 !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值