当前位置: 首页 > article >正文

用NumPy玩转蒙特卡洛模拟:手把手教你用随机数估算圆周率π和期权价格

用NumPy玩转蒙特卡洛模拟手把手教你用随机数估算圆周率π和期权价格蒙特卡洛模拟就像一场数学魔术表演——通过随机撒点就能算出圆周率通过模拟股票走势就能预测期权价格。这种将概率游戏变成科学计算利器的技术正在金融工程、物理仿真等领域大放异彩。今天我们就用NumPy这把瑞士军刀带你亲自动手实现两个经典案例布丰投针实验估算π和欧式期权定价模拟。1. 蒙特卡洛方法的核心思想想象你在一间黑暗的房间里往墙上随机扔飞镖。虽然看不清靶心但如果你记录下所有飞镖的位置就能根据命中靶心的比例反推出靶心的大小——这就是蒙特卡洛模拟的精髓。这种方法得名于摩纳哥的赌城蒙特卡洛因为随机性是其核心特征。蒙特卡洛方法主要依赖三个关键要素随机数生成高质量的伪随机数决定了模拟的可靠性重复实验大数定律保证结果收敛到真实值结果统计通过概率统计方法提取有用信息在Python中NumPy的random模块提供了完善的随机数生成工具。我们最常用的两个函数是import numpy as np # 生成[0,1)均匀分布随机数 uniform_random np.random.rand(1000) # 生成标准正态分布随机数 normal_random np.random.randn(1000)提示虽然称为随机数但计算机生成的其实是伪随机数。对于大多数应用场景伪随机数已经足够随机了。2. 布丰投针实验用随机数计算π18世纪法国数学家布丰(Georges-Louis Leclerc)提出了一个惊人的发现通过随机投针可以估算圆周率π。这个实验成为蒙特卡洛方法最早的雏形之一。2.1 实验原理设想一组平行线间距为t。随机投下一根长度为l的针(l ≤ t)针与平行线相交的概率为P (2l)/(πt)通过大量实验统计相交频率就能反推出π的近似值。2.2 NumPy实现步骤我们用NumPy向量化运算高效模拟这个实验def estimate_pi(num_needles, needle_length1, line_spacing1): # 随机生成针中心位置(0到t/2之间) center_pos np.random.rand(num_needles) * (line_spacing/2) # 随机生成针角度(0到π/2之间) angles np.random.rand(num_needles) * (np.pi/2) # 计算针尖到最近平行线的距离 tip_distance (needle_length/2) * np.sin(angles) # 统计相交次数 crosses np.sum(center_pos tip_distance) # 估算π值 estimated_pi (2 * needle_length * num_needles) / (line_spacing * crosses) return estimated_pi让我们运行100万次投针实验np.random.seed(42) # 固定随机种子便于复现 pi_estimate estimate_pi(1_000_000) print(fπ的估计值为: {pi_estimate:.6f}, 误差: {abs(pi_estimate-np.pi)/np.pi*100:.4f}%)典型输出结果π的估计值为: 3.141631, 误差: 0.0012%2.3 结果可视化随着实验次数增加估算值会越来越接近真实π值实验次数π估计值相对误差(%)1,0003.1645570.729910,0003.1445440.0926100,0003.1410700.01661,000,0003.1416310.0012这个实验生动展示了如何用随机性解决确定性数学问题。虽然不如专业算法高效但体现了蒙特卡洛方法的普适性。3. 金融工程应用欧式期权定价蒙特卡洛模拟在金融衍生品定价中扮演着关键角色。我们以欧式看涨期权为例展示如何模拟股票价格路径来估算期权价值。3.1 布莱克-斯科尔斯模型基础欧式看涨期权赋予持有者在到期日以执行价K购买标的资产的权利。其理论价格可通过几何布朗运动模拟股票价格路径dS μSdt σSdW其中S股票价格μ预期收益率σ波动率dW维纳过程(随机项)3.2 NumPy实现步骤def european_call_option(S0, K, T, r, sigma, num_simulations100000): 蒙特卡洛模拟欧式看涨期权价格 参数: S0: 初始股价 K: 执行价 T: 到期时间(年) r: 无风险利率 sigma: 波动率 num_simulations: 模拟次数 # 生成随机路径(使用正态分布) rand_numbers np.random.randn(num_simulations) # 计算到期股价 ST S0 * np.exp((r - 0.5*sigma**2)*T sigma*np.sqrt(T)*rand_numbers) # 计算期权收益 payoffs np.maximum(ST - K, 0) # 贴现求现值 option_price np.exp(-r*T) * np.mean(payoffs) return option_price示例计算# 参数设置 S0 100 # 当前股价 K 105 # 执行价 T 1 # 1年到期 r 0.05 # 5%无风险利率 sigma 0.2 # 20%波动率 price european_call_option(S0, K, T, r, sigma) print(f欧式看涨期权价格估计值: {price:.4f})典型输出欧式看涨期权价格估计值: 8.02133.3 模拟结果分析影响期权价格的关键因素波动率波动越大期权价值越高时间价值到期时间越长期权价值越高价内外程度执行价与现价的差距我们可以用蒙特卡洛方法研究这些参数的影响# 研究波动率影响 volatilities np.linspace(0.1, 0.5, 10) prices [european_call_option(S0, K, T, r, vol) for vol in volatilities]将结果可视化波动率(σ)期权价格0.104.330.155.890.208.020.2510.210.3012.470.3514.720.4016.940.4519.130.5021.28注意实际金融应用中会采用更精细的模型和方差缩减技术但基本原理相同。4. 提升蒙特卡洛模拟精度的技巧虽然蒙特卡洛方法简单强大但要获得高精度结果需要注意以下几点4.1 控制随机数质量使用可靠的随机数生成器(np.random.default_rng()较新版本更推荐)设置随机种子保证结果可复现避免随机数序列相关性# 新版NumPy推荐方式 rng np.random.default_rng(seed42) uniform_random rng.random(1000) normal_random rng.standard_normal(1000)4.2 增加模拟次数根据大数定律误差与√N成反比误差 ∝ 1/√N要减少一半误差需要四倍模拟量。4.3 方差缩减技术对偶变量法同时使用U和1-U两组随机数控制变量法利用已知精确解的相似问题分层抽样将样本空间划分为均匀子区域以对偶变量法改进期权定价为例def european_call_antithetic(S0, K, T, r, sigma, num_simulations): # 生成两组对偶随机数 rand_numbers np.random.randn(num_simulations) antithetic -rand_numbers # 对偶变量 # 计算两组路径 ST1 S0 * np.exp((r - 0.5*sigma**2)*T sigma*np.sqrt(T)*rand_numbers) ST2 S0 * np.exp((r - 0.5*sigma**2)*T sigma*np.sqrt(T)*antithetic) # 计算两组收益 payoffs1 np.maximum(ST1 - K, 0) payoffs2 np.maximum(ST2 - K, 0) # 取平均值后贴现 option_price np.exp(-r*T) * np.mean(0.5*(payoffs1 payoffs2)) return option_price这种方法通常能将收敛速度提高2-4倍。5. 蒙特卡洛模拟的局限与替代方案虽然蒙特卡洛方法应用广泛但也存在一些不足计算成本高高精度需要大量模拟收敛速度慢误差仅以1/√N速度下降维度灾难高维问题效率急剧下降替代或补充方案包括拟蒙特卡洛使用低差异序列替代随机数PDE方法对某些问题更高效深度学习近年兴起的替代方法例如使用Sobol序列的拟蒙特卡洛实现from scipy.stats import qmc def european_call_quasi_mc(S0, K, T, r, sigma, num_simulations): # 生成Sobol序列 sampler qmc.Sobol(d1, scrambleTrue) u sampler.random(num_simulations) # 转换为正态分布 rand_numbers qmc.normal(u) # 计算股价路径 ST S0 * np.exp((r - 0.5*sigma**2)*T sigma*np.sqrt(T)*rand_numbers) # 计算期权价格 payoffs np.maximum(ST - K, 0) option_price np.exp(-r*T) * np.mean(payoffs) return option_price在实际项目中我通常会先用小规模测试比较不同方法的效率和精度再选择最适合当前问题的方案。对于简单问题标准蒙特卡洛通常已经足够对于高维复杂问题则需要考虑更高级的技术。

相关文章:

用NumPy玩转蒙特卡洛模拟:手把手教你用随机数估算圆周率π和期权价格

用NumPy玩转蒙特卡洛模拟:手把手教你用随机数估算圆周率π和期权价格 蒙特卡洛模拟就像一场数学魔术表演——通过随机撒点就能算出圆周率,通过模拟股票走势就能预测期权价格。这种将概率游戏变成科学计算利器的技术,正在金融工程、物理仿真等…...

用FPGA实现一个USB转串口工具:从协议理解到Verilog实战

用FPGA实现一个USB转串口工具:从协议理解到Verilog实战 在嵌入式开发领域,USB转串口工具就像工程师的"瑞士军刀"——从单片机调试到工业设备通信都离不开它。市面上虽然有成品的USB转TTL模块,但自己动手用FPGA实现一个&#xff0c…...

别再死记硬背空洞卷积了!用PyTorch手写ASPP模块,带你搞懂多尺度信息融合的来龙去脉

从零解剖ASPP模块:用PyTorch实现揭示多尺度语义分割的精髓 第一次看到DeepLab论文里的ASPP模块时,我盯着那些不同dilation rate的空洞卷积分支发愣——为什么是6、12、18这三个神奇数字?为什么不能直接用更大的膨胀率捕捉更广的上下文&#x…...

Vue 3定时任务配置终极指南:5分钟学会可视化Cron表达式生成

Vue 3定时任务配置终极指南:5分钟学会可视化Cron表达式生成 【免费下载链接】no-vue3-cron 这是一个 cron 表达式生成插件,基于 vue3.0 与 element-plus 实现 项目地址: https://gitcode.com/gh_mirrors/no/no-vue3-cron 还在为复杂的Cron表达式语法而烦恼吗…...

告别虚拟机!在Ubuntu 20.04上原生安装MATLAB 2015b的保姆级避坑指南

告别虚拟机!在Ubuntu 20.04上原生安装MATLAB 2015b的保姆级避坑指南 科研工作者和工程师们常常面临一个两难选择:既需要Linux系统的高效稳定,又离不开MATLAB这类专业计算工具。传统解决方案往往依赖虚拟机或双系统,但性能损耗和操…...

揭秘127.0.0.1:从环回地址到开发测试的实战指南

1. 127.0.0.1到底是什么? 第一次看到127.0.0.1这个数字串时,我还以为是什么神秘代码。后来才发现,这可能是程序员每天打交道最多的IP地址之一。简单来说,127.0.0.1就像是计算机给自己开的"专线电话"——当你的程序需要和…...

终极免费音频格式转换解决方案:FlicFlac让Windows音频处理变得简单高效

终极免费音频格式转换解决方案:FlicFlac让Windows音频处理变得简单高效 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为音频格式不兼容…...

手把手教你调试UDS Bootloader:从CAN报文抓取到S32K144内存擦写全流程解析

手把手教你调试UDS Bootloader:从CAN报文抓取到S32K144内存擦写全流程解析 在汽车电子开发领域,Bootloader的稳定性和可靠性直接关系到整车ECU的软件更新能力。本文将带您深入UDS Bootloader的调试实战,通过CANoe/TSMaster工具抓取关键UDS服务…...

在Windows 7 64位系统上从零部署YOLOv3 CPU推理环境:Cygwin配置与Darknet编译实战

1. 环境准备:Windows 7下的特殊挑战 在Windows 7 64位系统上部署YOLOv3的CPU版本,最大的挑战在于这个老旧的系统环境与现代深度学习框架之间的兼容性问题。我去年帮一个工厂的老设备做视觉检测升级时就遇到过类似场景,他们的质检电脑全是Win…...

BilldDesk Pro:重新定义开源远程桌面的3大技术突破与实战应用

BilldDesk Pro:重新定义开源远程桌面的3大技术突破与实战应用 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制、游戏串流 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 在远程办公、IT运维和跨设备协作日益普…...

FanControl终极指南:5分钟掌握Windows免费风扇控制软件

FanControl终极指南:5分钟掌握Windows免费风扇控制软件 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

从概念到实践:AUTOSAR E2E通信保护机制深度解析与测试策略

1. AUTOSAR E2E通信保护机制初探 第一次听说AUTOSAR E2E这个概念时,我正坐在某主机厂的会议室里。当时客户突然抛出一个问题:"我们的刹车信号在CAN总线上传输时,如何确保接收端收到的数据没有被篡改?"这个问题直接点出了…...

FPGA开发实战:从Modelsim到Vivado的典型编译报错排查指南

1. FPGA开发中的编译报错:从入门到精通 刚接触FPGA开发的朋友们,相信你们一定被各种编译报错折磨过吧?我刚开始用Modelsim和Vivado的时候,经常被一堆莫名其妙的错误代码搞得一头雾水。今天我就来分享一些实战经验,帮你…...

从LLM到AGI,决策逻辑为何越强越不可信?深度拆解因果推理链断裂点,工程师速查手册

第一章:AGI的决策透明度与可解释性 2026奇点智能技术大会(https://ml-summit.org) 当通用人工智能系统在医疗诊断、司法辅助或金融风控中作出关键判断时,人类不仅需要答案,更需要理解“为何如此”。决策透明度指系统能清晰呈现其推理路径与…...

伪类与伪元素

伪类和伪元素的本质区别是修饰的东西是否能在DOM中找到对应的真实节点,比如伪类:first-of-type修饰的是一个能找到的真实节点,而伪元素::first-line修饰的不是一个真实的节点而是一段文本的一行 伪类: 伪类以单个冒号(:)开头,用于在元素特定状态为他添加样式(注意伪类本身不决定…...

从概念到应用:一文读懂概率密度函数与累积分布函数的联系与区别

1. 随机变量:理解概率分布的基础 概率密度函数(PDF)和累积分布函数(CDF)是统计学中描述随机变量分布的两个核心工具。要真正理解它们,我们得从随机变量这个基础概念说起。随机变量就像是一个数学魔术师&am…...

如何快速配置游戏自动化助手:面向新手的完整指南

如何快速配置游戏自动化助手:面向新手的完整指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.…...

蓝桥杯备赛指南:从零构建算法知识体系

1. 蓝桥杯竞赛与算法知识体系概述 参加蓝桥杯竞赛就像玩一款策略游戏,你需要先收集基础装备(语法和API),然后学习各种战斗技巧(算法和数据结构),最后才能挑战大Boss(竞赛题目&#…...

Ubuntu一键部署Docker与可视化面板Portainer实战

1. 为什么选择Docker与Portainer? 如果你是一名开发者或者运维人员,肯定对Docker不陌生。简单来说,Docker就像是一个魔法箱子,可以把你的应用和它需要的所有东西打包在一起,这样在任何地方运行都不会出问题。而Portain…...

如何快速配置英雄联盟助手:ChampR的完整使用指南

如何快速配置英雄联盟助手:ChampR的完整使用指南 【免费下载链接】champr 🐶 Yet another League of Legends helper 项目地址: https://gitcode.com/gh_mirrors/ch/champr 你是否曾经在英雄联盟游戏中因为出装选择而犹豫不决?&#x…...

给AMD APU装Debian驱动,除了firmware-linux,你还需要注意这个Secure Display报错

给AMD APU装Debian驱动:从Secure Display报错到完美图形加速 在Debian系统上为AMD APU(加速处理单元)配置显卡驱动时,许多用户会遇到一个令人困惑的报错——"Secure Display: Generic Failure"。这个看似简单的提示背后…...

QSpectrumAnalyzer终极指南:3步掌握多平台SDR频谱分析

QSpectrumAnalyzer终极指南:3步掌握多平台SDR频谱分析 【免费下载链接】qspectrumanalyzer Spectrum analyzer for multiple SDR platforms (PyQtGraph based GUI for soapy_power, hackrf_sweep, rtl_power, rx_power and other backends) 项目地址: https://git…...

手把手教你如何在企业网络中部署SyncE(含芯片选型指南)

手把手教你如何在企业网络中部署SyncE(含芯片选型指南) 在数字化转型浪潮中,企业网络对时钟同步精度的要求正从毫秒级向微秒级跃迁。SyncE(同步以太网)技术凭借其媲美传统SDH的同步性能,正在5G前传、金融交…...

西门子1200 PLC罐装线项目:博图编程实践与精彩解析

西门子1200plc罐装线项目,程序包括modbus通讯,模拟量输入输出,西门子程序画面精彩,程序编辑分类清晰,非常具有参考学习意义,支持博图V13及以上版本打开在自动化控制领域,西门子1200 PLC以其强大…...

Windows上安装APK的终极解决方案:APK Installer完整指南

Windows上安装APK的终极解决方案:APK Installer完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接安装安卓应用而烦恼吗&a…...

Android SVG 实战:从零构建交互式中国地图组件

1. SVG基础与Android开发准备 SVG(Scalable Vector Graphics)作为矢量图形标准,在Android开发中具有独特优势。与传统的位图格式不同,SVG通过XML描述图形,这意味着无论放大多少倍都不会出现像素化。在Android项目中&a…...

从SGD到Adam:深度学习优化器演进之路与实战选型指南

1. 优化器:深度学习的隐形引擎 第一次训练神经网络时,我盯着损失曲线像过山车一样上蹿下跳,差点以为代码写错了。后来才发现,问题出在那个不起眼的优化器参数上。优化器就像深度学习模型的导航系统,它决定了模型参数如…...

别光看菜单了!HFSS 2023 R2工作界面保姆级拆解:从建模到仿真的高效操作流

HFSS 2023 R2界面深度优化指南:从功能认知到效率革命 第一次打开HFSS 2023 R2时,那个充满各种窗口和工具栏的界面可能会让你感到些许压迫感。但别担心,这就像飞行员第一次坐进战斗机驾驶舱——看似复杂的仪表盘背后,其实隐藏着精…...

告别复杂配置!在Ubuntu 20.04/22.04上快速部署Astra Pro摄像头(含PCL点云实时显示)

在Ubuntu 20.04/22.04上极简部署Astra Pro深度相机的完整指南 深度相机在机器人、三维重建和计算机视觉领域扮演着越来越重要的角色。Astra Pro作为一款性价比极高的深度感知设备,其部署过程却常常让开发者头疼。本文将彻底改变这一现状——通过自动化脚本和现代包管…...

从踩坑到精通:Element el-date-picker 与后端 API 联调的那些‘坑’和最佳实践

从踩坑到精通:Element el-date-picker 与后端 API 联调实战指南 在前后端分离的开发模式中,日期选择器作为高频交互组件,其与后端的数据对接往往成为初级开发者的"隐形杀手"。Element UI 的 el-date-picker 组件虽然功能强大&#…...