ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

维纳过程全解:从随机游走到卡尔曼滤波、蒙特卡洛与扩散模型

维纳过程全解:从随机游走到卡尔曼滤波、蒙特卡洛与扩散模型 1. 从一个醉汉走路说起维纳过程到底在描述什么维纳过程Wiener process这个名字听起来像是纯数学家的玩具但如果你做过传感器标定、写过蒙特卡洛定价代码、调过卡尔曼滤波器的Q矩阵或者被扩散模型的噪声调度坑过那你已经在跟它打交道了。它的另一个名字更接地气——布朗运动。1827年植物学家布朗在显微镜下看到花粉颗粒在水里无规则抖动1905年爱因斯坦用水分子不断撞击颗粒给出了物理解释1923年前后维纳把它严格数学化于是这条处处连续、处处不可微的怪异曲线有了公理化定义。它就是描述连续时间里随机累积误差的标准模型。我需要先讲清楚它能干什么。凡是随时间推进、每一步都加一个独立小扰动、扰动幅度与时间平方根成正比的现象维纳过程都是第一候选模型。金融资产的对数价格、陀螺仪输出的角随机游走、颗粒在流体中的位移、神经元膜电位的阈下波动、扩散模型前向加噪过程全都是同一套数学结构在不同物理量上的投影。这篇文章适合谁看三类人。第一类是工程背景的朋友手头有传感器数据或时间序列想搞明白为什么噪声谱长那样、Allan方差曲线为什么是那个斜率第二类是做量化或仿真的人需要写蒙特卡洛代码、要理解伊藤引理为什么多出那一项第三类是学生和转行者觉得随机过程课本太抽象想要一条从代码到公式的路径。我不打算从测度论开讲而是先给你能跑的代码再回头解释为什么它成立。阅读门槛设定在会写Python、懂正态分布、记得住求导链式法则其余的我现场补。先说一个我在项目里踩过的认知坑很多人以为维纳过程就是正态分布随机数的累加代码写出来也对但一旦涉及二次变差、伊藤积分、路径性质直觉就完全失效。比如它的样本路径长度是无穷大你在图上量不出斜率比如 $(dW)^2$ 在极限意义下等于 $dt$ 而不是0。这些反直觉点恰恰是应用中最容易出错的地方后面我会逐个拆开。2. 把定义钉死三条公理与六个必须记住的性质2.1 形式化定义与增量条件标准维纳过程 ${W(t), t \ge 0}$ 是一个随机过程满足三条起点归零$W(0) 0$几乎必然成立。独立增量对任意 $0 \le t_1 t_2 \cdots t_n$增量 $W(t_2)-W(t_1), \ldots, W(t_n)-W(t_{n-1})$ 相互独立。高斯增量对任意 $0 \le s t$有 $W(t) - W(s) \sim N(0, t-s)$。第三条里方差等于时间间隔这一点是灵魂。它同时保证了平稳性分布只依赖时间差不依赖绝对时刻和时间维度的正确标度。为什么是 $t-s$ 而不是 $(t-s)^2$因为这来自中心极限定理的标度$n$ 步独立同分布零均值随机游走总位移的标准差是 $\sqrt{n} \cdot \sigma_{\text{step}}$令步长与 $1/n$ 成正比就得到方差与时间成正比。配套的还有两条常被写进定义的正则性条件路径连续几乎必然以及 $W(t)$ 关于 $t$ 的联合分布是多元正态协方差 $\mathrm{Cov}(W(s), W(t)) \min(s,t)$。最后这条公式极其好用看到 $\min$ 就想到维纳过程。2.2 六个必须背下来的性质附推导性质一多元正态性与协方差结构。任意取 $t_1 t_2 \cdots t_n$向量 $(W(t_1), \ldots, W(t_n))$ 服从均值零、协方差矩阵 $\Sigma_{ij} \min(t_i, t_j)$ 的多元正态分布。这个矩阵是正定的因为没有哪个非零线性组合的方差是零。性质二鞅性。对 $s \le t$$E[W(t) \mid \mathcal{F}_s] W(s)$。理由很直接$E[W(t)-W(s) \mid \mathcal{F}_s] 0$。另外 $W(t)^2 - t$ 也是鞅因为$$E[W(t)^2 - t \mid \mathcal{F}_s] E[(W(s) \Delta)^2] - t W(s)^2 (t-s) - t W(s)^2 - s.$$这条是伊藤公式的种子。性质三马尔可夫性。给定当前值未来与过去条件独立。转移密度是高斯核$$p(s, x; t, y) \frac{1}{\sqrt{2\pi(t-s)}} \exp\left(-\frac{(y-x)^2}{2(t-s)}\right).$$它就是热传导方程 $\partial_t p \frac{1}{2}\partial_x^2 p$ 的基本解这个联系不是巧合维纳过程本来就是扩散方程的概率化身。性质四二次变差等于时间。对区间 $[0,t]$ 取划分 $\Pi$令 $|\Pi| \to 0$有$$\sum_{i} (W(t_{i1}) - W(t_i))^2 \xrightarrow{L^2} t.$$推导思路令 $\Delta_i W(t_{i1})-W(t_i)$$\Delta_i^2$ 的期望是 $\Delta t_i$方差是 $2(\Delta t_i)^2$。求和后期望为 $t$方差为 $2\sum (\Delta t_i)^2 \le 2|\Pi| t \to 0$。二次变差是非随机的这一点是伊藤积分区别于黎曼积分的根源。性质五一阶变差无穷大。取划分后 $\sum |\Delta_i|$ 的期望约为 $\sum\sqrt{2\Delta t_i/\pi}$当网格变细时按 $1/\sqrt{|\Pi|}$ 发散。直观说路径的折线总长度没有上界你在任何有限区间上都量不出有限长度。这也解释了为什么 $\int f,dW$ 不能按勒贝格-斯蒂尔杰斯积分定义。性质六自相似与尺度不变。对任意 $c 0$过程 ${c^{-1/2}W(ct)}$ 与 ${W(t)}$ 同分布。这是重正化群思想的离散体现也是为什么你在不同采样率下看到的陀螺仪随机游走系数必须乘以 $\sqrt{\text{采样间隔}}$ 才能统一。2.3 路径性质的反直觉之处连续但不光滑维纳过程的样本路径几乎必然处处连续、处处不可微且分形维数为 1.5。前两个说法常被当成数学家的怪癖忽略掉直到你真的去求数值导数。我用一个真实案例说明后果早期做MEMS陀螺零偏建模时同事直接把陀螺输出做差分求角速率漂移率结果噪声被放大得完全不可用因为对维纳过程求差分商 $\Delta W / \Delta t$ 的方差是 $1/\Delta t$步长越小噪声越大永远不会收敛到一个有限导数。正确做法是先做二次变差分析、再决定是否需要对信号做积分或者预滤波。这条经验值几周的返工时间。注意只要看到方差与时间成正比增量独立路径连续三条同时成立就先假设它是维纳过程然后再去检验而不是反过来先假设平稳序列再硬套ARMA。3. 从随机游走到维纳过程离散到连续的桥怎么搭3.1 缩放随机游走与Donsker定理设 ${\xi_i}$ 独立同分布$E\xi_i 0$$\mathrm{Var}(\xi_i) \sigma^2$。定义部分和 $S_n \xi_1 \cdots \xi_n$然后做线性插值并缩放$$W_n(t) \frac{1}{\sigma\sqrt{n}} S_{\lfloor nt \rfloor}, \quad t \in [0,1].$$Donsker定理泛函中心极限定理说$W_n$ 在函数空间 $C[0,1]$ 上依分布收敛到标准维纳过程。通俗讲任何有限方差的零均值独立增量只要你按 $\sqrt{n}$ 正确缩放极限都是同一个对象。这就是维纳过程在应用数学中地位这么高的原因——它不挑分布形状是普适极限。这个定理给工程实践两个直接指导。第一如果你的原始数据是离散抽样用它建模时一定要做 $\sqrt{\Delta t}$ 缩放否则换采样率模型就崩。第二如果残差明显偏离正态比如厚尾跳跃维纳模型可能不够要考虑加入跳跃项构成跳扩散过程但那是另一个话题。3.2 用Python把这条桥搭出来下面这段代码生成三种逼近独立高斯增量、对称随机游走缩放、二值随机游走缩放并对比它们的经验二次变差。import numpy as np import matplotlib.pyplot as plt rng np.random.default_rng(20240517) def wiener_from_gaussian(T1.0, n2000): dt T / n dW rng.normal(0.0, np.sqrt(dt), sizen) W np.concatenate([[0.0], np.cumsum(dW)]) return np.linspace(0, T, n 1), W def wiener_from_random_walk(T1.0, n2000, scale1.0): dt T / n steps rng.choice([-1.0, 1.0], sizen) * scale * np.sqrt(dt) W np.concatenate([[0.0], np.cumsum(steps)]) return np.linspace(0, T, n 1), W def quadratic_variation(t, W): return np.sum(np.diff(W) ** 2) t, W1 wiener_from_gaussian(n5000) _, W2 wiener_from_random_walk(n5000, scale1.0) _, W3 wiener_from_random_walk(n5000, scale3.0) # 方差是3倍 for name, W in [(gaussian, W1), (rw_scale1, W2), (rw_scale3, W3)]: print(name, QV , round(quadratic_variation(t, W), 4))跑下来你会看到gaussian和rw_scale1的二次变差都接近 1.0而rw_scale3接近 3.0。这正是二次变差公式 $[W,W]_t \sigma^2 t$ 的数值验证。3.3 步长选择的经验值模拟步长不是越小越好。高斯增量法每一步精确服从 $N(0,\Delta t)$误差只来自离散化后的泛函近似比如求路径最大值、首次通过时间这类误差通常按 $\sqrt{\Delta t}$ 收敛用 1000 到 5000 步足够了。但如果你要模拟对路径敏感的泛函如障碍期权敲出步长不足会系统性高估或低估价格这叫离散监控偏差。我的经验是分两级先跑 $n2000$ 扫一遍看数量级再把 $n$ 翻倍跑观察两次结果之差是否小于目标精度的一半。如果翻倍后结果跳变超过5%说明离散误差主导继续加密而不是加样本数。这条判断顺序很关键很多新手一上来就堆 100 万条路径结果离散偏差没消掉白烧算力。4. 维纳过程的家族成员与变换工具4.1 布朗桥、带漂移过程、几何布朗运动带漂移的布朗运动$X(t) \mu t \sigma W(t)$增量服从 $N(\mu \Delta t, \sigma^2 \Delta t)$。$\mu$ 是趋势项$\sigma$ 是波动项。工程里常写成离散形式 $x_{k1} x_k \mu \Delta t \sigma \sqrt{\Delta t}, \epsilon_k$这就是卡尔曼滤波状态方程最常见的形态。布朗桥$B(t) W(t) - tW(1)$$t \in [0,1]$。它的两端固定在0协方差为 $\min(s,t) - st$。布朗桥在工程中的用途被严重低估任何起点和终点已知、中间过程随机的建模都可以用它比如机械臂从A点到B点的轨迹抖动、给定首末库存的库存路径模拟。生成方法也很简单从维纳过程减去线性插值的那条弦即可。几何布朗运动$dS \mu S,dt \sigma S,dW$解为 $S(t) S_0\exp\left((\mu - \sigma^2/2)t \sigma W(t)\right)$。注意指数里那个 $-\sigma^2/2$ 修正项它是伊藤引理的直接产物。漏掉它会让蒙特卡洛模拟的价格系统性偏高我见过不止一份生产代码犯这个错误且因为偏差在 $\sigma$ 小时不显眼测试用例也发现不了。Ornstein-Uhlenbeck过程$dX \theta(\mu - X)dt \sigma dW$把纯随机游走改造成均值回复。它和维纳过程的关系是维纳过程是所有扩散过程的积木加漂移、加回复项、加跳跃都是在此基础上的改造。4.2 伊藤引理为什么不能按普通微积分算设 $f(t,x)$ 二阶连续可微$X(t)$ 是带漂移的布朗运动 $dX a,dt b,dW$则$$df \left(\frac{\partial f}{\partial t} a\frac{\partial f}{\partial x} \frac{1}{2}b^2\frac{\partial^2 f}{\partial x^2}\right)dt b\frac{\partial f}{\partial x}dW.$$多出来的 $\frac{1}{2}b^2 f_{xx}$ 项完全来自 $(dW)^2 dt$。用泰勒展开的直觉解释普通微积分里 $(dx)^2$ 是二阶小量可以丢但布朗运动的增量尺度是 $\sqrt{dt}$平方之后正好是 $dt$ 阶必须保留。这条规则记住一句就够遇到 $dW$ 的二次项换成 $dt$。伊藤引理是所有金融衍生品定价、非线性随机系统分析的起点。举个不那么金融的例子传感器输出 $X$ 是维纳过程你关心的物理量是 $X^2$比如能量、平方误差那么 $d(X^2) 2X,dX dt$。如果你用普通链式法则写 $d(X^2) 2X,dX$长期会低估 $X^2$ 的期望误差恰好是 $t$。这个错误在滤波器发散问题分析里非常致命。还有一点容易混淆伊藤积分和Stratonovich积分给出不同结果差别就是那个 $\frac{1}{2}b^2 f_{xx}$ 项。物理文献常用Stratonovich因为它满足普通链式法则金融和控制文献常用伊藤因为它保持鞅性。选哪种不重要重要的是前后一致混用会出 bug。4.3 首次通过时间与反射原理工程中最常见的问题不是t时刻的值是多少而是它什么时候第一次超过阈值。这就是首次通过时间 $\tau_a \inf{t: W(t) a}$$a 0$。反射原理给出分布$$P\left(\max_{0 \le s \le t} W(s) \ge a\right) 2P(W(t) \ge a) 2\left(1 - \Phi\left(\frac{a}{\sqrt{t}}\right)\right).$$密度函数是 $\frac{a}{\sqrt{2\pi t^3}}\exp\left(-\frac{a^2}{2t}\right)$这是一个重尾分布属于稳定分布族中指数为 $1/2$ 的那一类。这意味着它的期望是无穷大——平均等待时间不存在。这个结论对可靠性工程冲击很大如果你的失效机制是随机游走型累积损伤那么平均失效时间这个指标本身没有定义用样本均值估计它会随着样本量增加而持续漂移。正确做法是报告分位数例如95%分位首次通过时间或固定时间窗内的通过概率而不是报均值。5. 落地应用五个领域的真实用法5.1 金融工程从布莱克-斯科尔斯到蒙特卡洛几何布朗运动假设下欧式看涨期权价格由布莱克-斯科尔斯公式给出$$C S_0 N(d_1) - Ke^{-rT}N(d_2), \quad d_1 \frac{\ln(S_0/K) (r \sigma^2/2)T}{\sigma\sqrt{T}}, \quad d_2 d_1 - \sigma\sqrt{T}.$$这个公式本质上是热传导方程的解跟维纳过程转移密度完全同源。当收益率涉及路径依赖亚式、障碍、回望公式不再存在必须走蒙特卡洛模拟 $S_T S_0\exp\left((r - \sigma^2/2)T \sigma\sqrt{T}Z\right)$求支付函数均值再按 $e^{-rT}$ 折现。我必须强调蒙特卡洛的收敛率是 $O(1/\sqrt{N})$$N$ 是路径数。要把标准误减半路径数得翻四倍。所以生产环境里更值钱的是方差缩减技术不是堆机器。对偶变量法用 $Z$ 和 $-Z$ 成对采样、控制变量法用标的资产本身或布莱克-斯科尔斯解析解做控制、重要性抽样把采样分布偏向深度实值区域这三招能把有效样本数提升几倍到几十倍。5.2 惯导与传感器随机误差建模与Allan方差惯性器件的随机误差通常用三个维纳过程叠加建模量化噪声、角度随机游走ARW也叫角随机游走、零偏不稳定性。Allan方差是识别它们的标准工具定义为$$\sigma_A^2(\tau) \frac{1}{2(N-1)}\sum_{i1}^{N-1}\left(\bar{y}_{i1}(\tau) - \bar{y}_i(\tau)\right)^2,$$其中 $\bar{y}_i(\tau)$ 是第 $i$ 个长度为 $\tau$ 的块的平均角速率。在双对数坐标下不同噪声类型表现为固定斜率噪声类型Allan方差斜率物理含义单位量化噪声-1输出量化台阶deg角度随机游走-1/2维纳过程积分到角度deg/√h零偏不稳定性0低频漂移起伏deg/h速率随机游走1/2漂移率本身是维纳过程deg/h/√h速率斜坡1确定性漂移deg/h²斜率 -1/2 那一段就是纯维纳过程的指纹。拟合出系数 $N$单位 deg/√h之后转换成离散时间噪声标准差要用 $\sigma N/\sqrt{\Delta t}$注意这里除的是平方根。我见过有团队写成 $\sigma N\cdot\sqrt{\Delta t}$方向反了导致仿真出来的漂移比实测小两个数量级。5.3 物理与化学扩散方程与爱因斯坦关系一维自由扩散中粒子位置均方位移满足 $\langle x^2 \rangle 2Dt$。它和维纳过程的关系是 $x(t) \sqrt{2D}W(t)$。爱因斯坦关系 $D \frac{k_BT}{6\pi\eta a}$ 把扩散系数和温度、黏度、颗粒半径连起来这里的$\eta$是介质黏度、$a$是颗粒半径。这套公式在胶体科学、药物质控、微流控芯片设计里天天用。实践中要注意的是有限观测窗效应。用显微镜追踪粒子采样频率有限、视场有限短时间尺度受定位噪声污染长时间尺度受视场边界截断中间那段看起来是直线的双对数区间才是有效区间。我一般建议至少覆盖两个数量级的时间宽度再去做线性拟合否则拟合出的 $D$ 偏差能到 30% 以上。5.4 信号处理与控制卡尔曼滤波的噪声模型卡尔曼滤波的状态方程 $x_{k1} Fx_k w_k$ 中$w_k$ 通常假设为白噪声$Q \mathrm{Cov}(w_k)$。当状态连续演化且受维纳过程驱动时离散化后的 $Q$ 不是简单乘以 $\Delta t$而是要做积分。对一维情形 $dx \sigma dW$$$Q_d \int_0^{\Delta t} \sigma^2 , ds \sigma^2 \Delta t.$$常见错误是按过程噪声密度填写 $Q \sigma^2$忽略 $\Delta t$结果采样率一变滤波器就发散。对于二维的位置速度模型 $dv \sigma dW$$dx v,dt$$Q_d$ 需要展开成矩阵$$Q_d \sigma^2 \begin{bmatrix} \Delta t^3/3 \Delta t^2/2 \ \Delta t^2/2 \Delta t \end{bmatrix}.$$这个矩阵可以直接用状态转移矩阵积分法推$Q_d \int_0^{\Delta t} \Phi(s) G \sigma^2 G^T \Phi(s)^T ds$。我一般写个小函数在初始化阶段算一次比手推可靠。5.5 机器学习扩散模型里的前向加噪扩散模型的加噪过程写作 $x_t \sqrt{\bar\alpha_t}x_0 \sqrt{1-\bar\alpha_t},\epsilon$$\epsilon \sim N(0,I)$。把它放到连续时间视角前向过程就是一个维纳过程驱动的随机微分方程 $dx f(x,t)dt g(t)dW$加上线性漂移后满足解析解因此才能一步跳到任意 $t$。反向过程用得分匹配学习 $\nabla_x \log p_t(x)$训练目标里的噪声预测网络实际上就是在估计 $-\epsilon/\sqrt{1-\bar\alpha_t}$。这里和维纳过程的联系不是装饰性的。噪声调度的选择线性、余弦、sigmoid本质上是在决定 $g(t)$ 的形状直接影响信号在 $t$ 时刻的信噪比分布。如果调度设计得让大部分时间都处于几乎纯噪声状态模型学到的信息就少。很多调参经验其实是在对 $\bar\alpha_t$ 曲线做工程折中理解这一点之后看论文里的调度公式就不再是玄学。6. 参数估计与检验怎么从数据反推模型6.1 用二次变差估波动率维纳过程最大的好处是参数估计有闭式解。对 $X(t) \mu t \sigma W(t)$把观测按间隔 $\Delta t$ 采样为 $X_0, X_1, \ldots, X_n$则$$\hat\sigma^2 \frac{1}{n\Delta t}\sum_{i1}^{n}(X_i - X_{i-1})^2.$$这是矩估计也是极大似然估计无偏且一致。注意分子是不除以 $n-1$ 的因为均值已知为零增量均值已由 $\mu\Delta t$ 承担。$\mu$ 的估计要难得多。由 $\hat\mu (X_n - X_0)/(n\Delta t)$它的标准误是 $\sigma/\sqrt{n\Delta t}$。当总观测时间 $n\Delta t$ 固定时提高采样频率不会降低 $\mu$ 的估计误差只有拉长观测时长才行。这是业内常说的一句话波动率靠高频估得准趋势靠长时间才估得准。我做传感器零偏趋势分析时会把数据分成长窗口做回归而不是用全部高采样率数据一次性拟合。6.2 漂移项估计的陷阱接上一条还有一个更隐蔽的陷阱如果真实的 $\mu$ 很小而 $\sigma$ 不小那么在小样本下估计出的 $\hat\mu$ 可能因为随机波动而符号都相反。这时候去做趋势判断基本等于抛硬币。解决办法是给出置信区间而不是点估计或者使用先验信息做收缩估计。另外$\hat\mu$ 和 $\hat\sigma^2$ 在有限样本下不独立联合置信区域的形状是椭圆而非矩形这在做参数敏感性分析时要注意。我通常会跑一遍参数自助法parametric bootstrap用估出来的参数生成大量仿真序列重估参数看估计量的经验分布和经验覆盖率比看渐近公式更实在。6.3 检验方法方差比、单位根与谱检验要判断一段数据是否可以用维纳过程建模可以走这几条路检验方法检验对象维纳过程下的表现局限增量正态性检验增量分布通过厚尾时会拒绝增量自相关检验增量独立性自相关应不显著对条件异方差敏感方差比检验方差随时间线性增长比值接近1需要足够长序列单位根检验是否需要差分差分后平稳功效在短样本下低二次变差稳定性路径波动累积近似线性需要高频数据方差比检验的思路很直白对间隔 $k$计算 $\mathrm{Var}(X_{tk}-X_t) / (k\cdot \mathrm{Var}(X_{t1}-X_t))$。维纳过程下这个比值等于1。如果显著小于1说明有均值回复显著大于1说明有趋势或正自相关。我做实际数据时会把这些检验串成一个流水线脚本先用ADF看平稳性再做方差比再画Allan方差最后才决定用什么模型。这个顺序是先判断有没有随机游走成分再判断有几个维纳过程叠加最后才去估参数。7. 常见坑与排查表7.1 模拟类问题坑一忘了 $\sqrt{\Delta t}$ 缩放。生成增量时写成rng.normal(0, sigma)而不是rng.normal(0, sigma*np.sqrt(dt))结果模拟路径的波动幅度与实际物理量纲不符且随步数变化而不收敛。坑二用单条路径做结论。维纳过程是随机对象单条路径的最大值、首次通过时间波动极大。报告结果时至少给均值加标准误或者直接给分位数。坑三忽略离散监控偏差。障碍类问题在离散时间点上检查是否触发与连续监控相比会低估触发概率。修正方法包括布朗桥修正在相邻两个时间点之间用布朗桥计算穿越概率或对时间栅格做平滑处理。坑四随机数种子依赖。用固定种子做对比实验时要注意不同方案若使用同一条随机数流可能引入相关性让比较结果失真。稳妥做法是每个方案独立种子或者用公共随机数法并明确说明。7.2 建模类问题坑五把有均值回复的数据硬套维纳过程。陀螺零偏、温度、利率这类量长期看都不可能是无界随机游走强行套会得到荒谬的长期预测。先用方差比或自相关函数确认。坑六伊藤修正项漏写。只要做了非线性变换取对数、平方、求倒数就必须用伊藤引理。变换越非线性漏项造成的偏差越大。坑七把采样间隔变化当成信号变化。同一物理过程在不同采样率下的离散噪声参数不同。参数在不同采样率之间转换时必须用 $\sqrt{\Delta t}$ 比例法则否则会误判设备性能。7.3 问题速查表现象可能原因排查动作滤波长期发散Q矩阵未按 $\Delta t$ 缩放检查 $Q_d \sigma^2\Delta t$ 是否正确蒙特卡洛价格偏高指数中漏了 $-\sigma^2/2$核对GBM解析解估计波动率随采样变化很大存在高频测量噪声做Allan方差定位噪声段首次通过时间均值不收敛分布重尾、均值无穷改报分位数模拟路径太光滑步长过大或误用线性插值检查步长与插值方式对数收益偏斜严重需要跳跃或随机波动率检验增量正态性参数换采样率后不匹配未做 $\sqrt{\Delta t}$ 换算核对量纲与换算公式8. 手把手实操完整跑一遍蒙特卡洛定价与误差分析8.1 代码实现下面这段代码把前面讲的东西串起来几何布朗运动模拟、期权定价、标准误估计、对偶变量方差缩减以及和解析解的对比验证。import numpy as np from math import log, sqrt, exp from scipy.stats import norm def bs_call(S0, K, r, sigma, T): d1 (log(S0 / K) (r 0.5 * sigma ** 2) * T) / (sigma * sqrt(T)) d2 d1 - sigma * sqrt(T) return S0 * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2) def mc_call_plain(S0, K, r, sigma, T, n_paths, seed0): rng np.random.default_rng(seed) Z rng.normal(sizen_paths) ST S0 * np.exp((r - 0.5 * sigma ** 2) * T sigma * sqrt(T) * Z) payoff np.maximum(ST - K, 0.0) disc exp(-r * T) * payoff return disc.mean(), disc.std(ddof1) / sqrt(n_paths) def mc_call_antithetic(S0, K, r, sigma, T, n_paths, seed0): rng np.random.default_rng(seed) half n_paths // 2 Z rng.normal(sizehalf) ST_plus S0 * np.exp((r - 0.5 * sigma ** 2) * T sigma * sqrt(T) * Z) ST_minus S0 * np.exp((r - 0.5 * sigma ** 2) * T - sigma * sqrt(T) * Z) p 0.5 * (np.maximum(ST_plus - K, 0) np.maximum(ST_minus - K, 0)) disc exp(-r * T) * p return disc.mean(), disc.std(ddof1) / sqrt(half) S0, K, r, sigma, T 100.0, 105.0, 0.03, 0.2, 1.0 print(analytical:, round(bs_call(S0, K, r, sigma, T), 4)) for n in [10000, 100000, 1000000]: m, se mc_call_plain(S0, K, r, sigma, T, n, seed42) ma, sea mc_call_antithetic(S0, K, r, sigma, T, n, seed42) print(fn{n:8d} plain{m:.4f} (se{se:.4f}) anti{ma:.4f} (se{sea:.4f}))8.2 结果验证与收敛诊断跑之前你需要知道预期结果$S_0100$$K105$$r3%$$\sigma20%$$T1$解析价格大约是 7 到 8 之间。随着路径数从1万涨到100万估计值会围绕解析值震荡标准误大致按 $1/\sqrt{n}$ 下降1万时约0.1量级100万时约0.01量级。对偶变量法在同一路径数下标准误通常比朴素法低 30% 到 50%因为 $\max(S_T^ - K, 0)$ 和 $\max(S_T^- - K, 0)$ 负相关取平均后方差下降。如果你看到对偶法的标准误反而更大八成是配对逻辑写错了比如把两个独立抽样当成一对。诊断我做三步。第一步画收敛曲线横轴 $\log n$、纵轴 $\log(\text{se})$看斜率是否接近 -0.5。第二步把解析值和蒙特卡洛值放在一起看差值的绝对值应该落在标准误的2到3倍内超出就要怀疑实现。第三步换几个种子重跑看结果分布是否与标准误一致。8.3 方差缩减技巧与选择建议除了对偶变量还有几个实用的方差缩减手段控制变量法用标的资产 $S_T$ 做控制变量。$S_T$ 的期望已知是 $S_0e^{rT}$且它与期权支付高度相关回归残差的方差远小于原始支付方差。实现上就是跑一遍回归用 $\hat\beta$ 修正估计量。重要性抽样深度虚值期权在朴素采样下几乎全是零支付方差大。把抽样分布漂移到实值区域再用似然比加权。漂移量一般按 $\ln(K/S_0)$ 量级选取。分层抽样把 $[0,1]$ 分成 $m$ 层每层抽一个均匀数反变换成正态。对一维问题效果稳定高维时会遭遇维数灾难。准蒙特卡洛Sobol序列用低差异序列替代伪随机数收敛率可提升到接近 $O(1/N)$但要注意误差估计不能再直接用经典标准误需要随机化scrambling后重复多次估计。选择顺序我一般是能解析就解析不能解析先看控制变量其次对偶再次重要性抽样最后考虑QMC。原因是控制变量实现成本低、收益稳定而且不挑支付函数形状。提示所有方差缩减方法都需要验证无偏性。验证方法很简单取一个小样本量比如1万路径用缩减前后的估计量分别跑200次比较两个经验分布的均值。如果缩减后的均值系统性偏移说明权重或控制变量用错了。9. 最后分享几条踩出来的经验第一条关于代码组织。把维纳过程的模拟、参数估计、检验分成三个独立模块不要写在一个文件里。原因是这三块的调用频率完全不同模拟要跑百万次参数估计只需要在建模阶段跑一次。我早期把这些混在一起改一个采样参数要重跑全流程浪费大量时间。第二条关于文档。维纳过程相关代码里最容易出错的是量纲和缩放因子所以我在每个噪声参数旁边都强制写注释标明单位和对应的采样间隔。比如sigma_arw 0.5 # deg/sqrt(h), valid at dt 0.01s。这条习惯后来救过我很多次因为半年后回头看代码没有单位注释基本等于重写。第三条关于验证策略。任何涉及伊藤引理的实现我都会用一个有解析解的特例做验证。最常用的是几何布朗运动的期望$E[S_T] S_0e^{\mu T}$这个式子对 $\sigma$ 完全不敏感如果模拟结果随 $\sigma$ 变化而漂移说明 $-\sigma^2/2$ 项处理错了。这个测试用例只花两分钟却能拦住最隐蔽的一类错误。第四条关于模型选择的心态。维纳过程是个强大的基准模型但不是万能的。当你发现残差有厚尾、有波动率聚集、有明显均值回复时不要硬撑着调参数而是果断升级模型跳跃扩散、随机波动率、分数布朗运动、OU过程各有各的适用场景。判断标准很简单看Allan方差或者方差比检验的曲线形状形状对不上换模型比调参有效得多。如果后续还要往下扩展我建议沿着两条线走。一条是马尔可夫过程的谱系从维纳过程到扩散过程再到跳跃过程理解它们之间的包含关系另一条是数值方法从欧拉-丸山格式到Milstein格式再到高阶强收敛格式理解收敛阶数是怎么来的。这两条线交叉的地方就是绝大多数工程问题的实际战场。
返回列表