☰
维纳过程:从二次变差、Itô积分到SDE模拟与扩散模型
2026/10/1 4:32:31 网站建设 项目流程

维纳过程这个名字,我第一次认真对待它不是在概率论的课堂上,而是在帮人调一段期权定价的蒙特卡洛代码的时候。对方把时间步长从 1/252 细化到 1/2520,满心以为结果会更贴近理论值,跑完发现误差只降了一点点,换个随机种子再跑,两组结果之间的差距甚至比理论误差还大。问题不在代码写错了,而在于他用的欧拉格式对维纳过程驱动的随机微分方程只有 0.5 阶强收敛——步长缩到十分之一,路径层面的误差只缩到原来的三分之一左右。这个反直觉的现象,恰恰是理解维纳过程最好的入口:它不是一个"连续版本的正态随机游走"这么简单,它的路径粗糙到让经典微积分的全部直觉失效。这篇内容我打算把它讲透,从定义为什么长成那样,到二次变差、Itô 积分,再到数值模拟的实操和它在金融、滤波、生成模型里的落地,顺带把我自己踩过的坑摆出来。有微积分和概率论基础就能读,没有的部分我用类比补齐。

1. 定义里的每一条都在排除一种想当然

1.1 三条性质,少一条都不成立

标准定义里,维纳过程是一族随机变量 W(t),t ≥ 0,同时满足下面几条:

  • W(0) = 0,几乎必然成立;
  • 增量独立:对任意 0 ≤ t₀ < t₁ < … < tₙ,各个增量 W(tᵢ) − W(tᵢ₋₁) 相互独立;
  • 增量正态:W(t) − W(s) 服从均值为 0、方差为 t − s 的正态分布,记作 N(0, t − s);
  • 路径连续:t 到 W(t) 的映射在几乎每条样本轨道上都连续。

很多人看完只记住"增量是正态的",然后把前两条丢掉。丢掉独立性和"零起点",你会得到一族完全不同的东西——比如 W(t) + 常数,它增量照样正态,但 W(0) 不是 0;或者把增量之间的相关性设计成负的,那得到的是别的过程。这三条是绑在一起起作用的,缺一条整个理论框架就搭不起来。

还有一条容易被忽略:方差等于时间差,而不是时间的某个非线性函数。这一条把维纳过程和很多看似相似的连续过程区分开了。如果方差是 (t − s)^α 且 α ≠ 1,比如 α = 1.7,那得到的是分数布朗运动,它连鞅都不是,整套随机积分理论要推倒重来。

1.2 为什么偏偏是正态分布

这里有个很自然的疑问:凭什么增量必须服从正态分布,而不是均匀分布、拉普拉斯分布或者别的什么。答案要从"中心极限"的视角看。设想一个粒子被大量微小、近似独立、方向随机的碰撞推来推去,每一小段时间内它被撞的次数非常多,每次推动的方向和大小都差不多但相互独立。根据中心极限定理,这些微小位移的总和会向正态分布收敛,而且这个收敛与单次碰撞的具体分布形状关系不大。正态分布不是因为自然界"喜欢"正态,而是因为它是一大堆独立小扰动叠加之后的极限形态。

正态分布还有一个关键特点:它的尺度是随 t 的平方根走的。也就是说,要让位移的方差翻倍,时间必须变成四倍。这个"根号时间"的比例关系贯穿维纳过程的全部应用,股票波动率年化要乘以根号 252、随机游走的典型偏离量按 √n 增长、误差随 √n 收敛,全是同一个根号在起作用。你在做模拟时如果发现某个量对时间步长的敏感度表现为平方根,基本上可以判断背后有维纳过程的影子。

1.3 从随机游走到连续极限:一次标准缩放

把维纳过程看成"随机游走的极限"最直观。设一个粒子每步以等概率左右移动,步长 Δx,每步耗时 Δt。走 n 步之后,位置的标准差是 Δx·√n,而这 n 步对应的时间是 n·Δt。要让这两个量之间产生"方差正比于时间"的关系,就必须让 Δx 正比于 √Δt。

这就是缩放的本质。如果你天真地让步长固定、时间步长无限缩小,那么粒子在单位时间内的位移会趋于无穷,路径会变得极端剧烈而失去意义;如果你让步长随时间步长线性缩小,那扩散效应会彻底消失,路径退化成一条直线。只有 Δx ∝ √Δt 这个"临界缩放"才留下一个非平凡的极限对象,也就是维纳过程。很多人在初学时觉得这个缩放只是个技术细节,实际上它是整个连续时间随机分析能成立的原因。

2. 路径连续却几乎处处不可微,这件事到底有多反常

2.1 直觉的崩塌:ΔW 的量级是 √Δt

先做一个量级估算。因为 W(t + Δt) − W(t) 服从 N(0, Δt),它的典型大小是 √Δt。那么差商 [W(t + Δt) − W(t)] / Δt 的典型大小就是 √Δt / Δt = 1/√Δt。当 Δt 趋于 0 时,这个量发散到无穷。也就是说,在任何一点,切线斜率的候选项都冲向无穷,导数根本不存在。

这个结论的强度比一般想象的更大:维纳过程不只是"某些点不可微",而是以概率 1 在每一点都不可微。第一次看到这个定理的人通常会怀疑"那画出来的路径怎么看起来还挺光滑"。这里要分清楚,我们画图时看到的"光滑"其实是分辨率不够造成的视觉误差。当你在屏幕上把时间轴放大十倍,路径不会变得更直,而是继续暴露出新的锯齿。这是一种自相似结构,放大多少倍看到的粗糙程度都差不多。

2.2 二次变差:维纳过程真正的"第二定义"

如果要选一个最能区分"懂"和"不懂"的知识点,我会选二次变差。对一条分割 0 = t₀ < t₁ < … < tₙ = T 的路径,定义

Q = Σᵢ [W(tᵢ) − W(tᵢ₋₁)]²

当分割越来越细,这个和收敛到 T,而且是均方收敛。对比一下普通的光滑函数:对一条可微曲线,同样的平方和会趋于 0,因为每一项都是 (Δx)² 量级,加起来的量级是 Δx。维纳过程的每一项是 Δt 量级,加起来正好是 T。这就是路径粗糙性最精确的定量刻画。

这条性质带来一个被无数教材奉为口诀的公式:(dW)² = dt。它不是普通意义上的乘法,而是在"取极限的二次变差"这个意义下成立的运算规则。正确理解方式是:在随机泰勒展开里,二阶项 (dW)² 不会像经典微分里那样自动消失,它贡献了一个 dt 量级的主项。所有 Itô 型公式里那个多出来的 1/2 二阶项,源头就在这里。

用代码验证一下这个收敛:

import numpy as np def wiener(T=1.0, n=2000, paths=5000, seed=7): rng = np.random.default_rng(seed) dt = T / n dW = rng.normal(0.0, np.sqrt(dt), size=(paths, n)) W = np.concatenate([np.zeros((paths, 1)), np.cumsum(dW, axis=1)], axis=1) t = np.linspace(0.0, T, n + 1) return t, W t, W = wiener() qv = np.sum(np.diff(W, axis=1) ** 2, axis=1) print(qv.mean()) # 趋近 1.0 print(qv.std()) # 理论值 sqrt(2/n) ≈ 0.0316

如果这里只跑 100 条路径,你会看到均值在 0.95 到 1.05 之间晃。要看出收敛趋势,路径数量至少上千条。这个实验我做给过好几个同事看,他们几乎都低估了收敛所需样本量。

2.3 全变差无穷与分形维数 1.5

既然平方和收敛到一个正数,那一阶变差 Σ|ΔW| 会怎样?每一项的期望是 √(2Δt/π),一共 n 项,所以总和的期望量级是 n·√Δt = √(n·T),随 n 增大而发散。维纳路径的全变差是无穷大。这条性质直接决定了黎曼-斯蒂尔杰斯积分没法用,后面第 3 节会展开。

另一个有意思的量化指标是分形维数。维纳过程图像的盒计数维数是 1.5,介于光滑曲线(1)和填满平面(2)之间。一些做信号处理的人会拿这个指标做特征提取:把传感器的时间序列用 Higuchi 或者 DFA 方法估一个分形维数出来,估出来接近 1.5 的,往往确实带有扩散型噪声特征;明显低于 1.5 的,通常意味着信号里有平滑成分或者高频噪声被滤掉了。这个方法不精细,但作为快速筛查手段挺好用。

3. Itô 积分:为什么不能照搬黎曼那一套

3.1 黎曼-斯蒂尔杰斯在这里撞墙

想定义 ∫₀ᵀ f(t) dW(t),最自然的做法是取分割求和 Σ f(τᵢ)[W(tᵢ) − W(tᵢ₋₁)],然后让分割变细。对普通的有界变差函数,这个极限存在且唯一。但维纳路径的全变差是无穷的,黎曼-斯蒂尔杰斯的成立条件直接不满足。

更要命的是,即使极限存在,它大概率会依赖于 τᵢ 怎么选。这一点让很多人第一次接触时非常不适应,因为我们在确定性的世界里习惯了下积分和上积分趋于同一个值。现在情况变了:取左端点、右端点、中点,会得到三个不同的结果。这不是技术瑕疵,而是维纳过程粗糙性带来的本质后果。于是数学上必须做选择,把不同选择固化成不同的积分定义。

3.2 Itô 与 Stratonovich:不是对错,是用途

两种最常用的选择是:

积分类型求和时取值点链式法则主要使用场景
Itô取区间左端点多出 1/2 二阶项金融定价、鞅理论、滤波
Stratonovich取区间中点与经典链式法则一致物理建模、噪声近似、几何随机分析

Itô 积分的关键优点在于:被积函数在区间左端取值,与当前增量独立,这使得积分结果保持鞅性,期望计算非常干净。金融里之所以几乎一边倒地用 Itô,就是因为无套利定价的核心是鞅,一旦破坏鞅性,风险中性测度和定价公式全都要重新推导。

Stratonovich 积分的优势是它保留经典微积分的规则,处理物理方程时心里负担小。它和 Itô 积分之间有明确的换算关系,对一维情形相差一个修正项,具体形式取决于被积函数与扩散系数的乘积导数。实操中最容易出错的场景是:从论文里抄来一个 SDE,没有确认它是哪种解释,直接扔进数值求解器。欧拉格式天然逼近 Itô 解,米尔斯泰因格式也是,如果原文的 SDE 是 Stratonovich 形式的,你必须先转成 Itô 形式再离散,否则会得到一个系统性的偏差,步长越细偏差越"稳定"地存在,让你误以为结果收敛得很好。

3.3 Itô 引理的手把手推导

设 f(x) 二阶连续可微,对 f(W(t)) 做泰勒展开:

df = f′(W) dW + (1/2) f″(W) (dW)² + 高阶项

经典微积分里 (dW)² 是二阶小量,直接丢掉。但前面已经验证过 (dW)² = dt,所以这一项要保留,得到

df(W(t)) = f′(W(t)) dW(t) + (1/2) f″(W(t)) dt

这个多出来的 (1/2)f″ dt 项就是 Itô 引理的全部秘密。它有个很好的物理解读:它衡量的是函数 f 的凸性如何被路径的抖动转化为一个确定性的漂移。如果 f 是凸函数,f″ > 0,抖动会带来正的漂移;如果 f 是凹函数,会带来负漂移。这一点在期权定价里直接体现为对数价格比价格本身多了一个 −σ²/2 的修正,下面第 5 节会细讲。

多变量版本同样重要。对 f(t, x) 有

df = (∂f/∂t) dt + (∂f/∂x) dW + (1/2)(∂²f/∂x²) dt

注意 dt 项里同时有显式时间导数和二阶空间导数两块,它们在推导偏微分方程时会被合并到一起,这也是 Fokker-Planck 方程里出现二阶导的原因。

3.4 一个能亲手算的例子

拿最经典的 ∫₀ᵀ W dW 来练手。取 f(x) = x²/2,由 Itô 引理:

d(W²) = 2W dW + dt

整理得 W dW = (1/2)[d(W²) − dt],两边从 0 到 T 积分:

∫₀ᵀ W dW = (W(T)² − T) / 2

对比一下如果按普通微积分的直觉,你会写成 W(T)²/2,两者差了 T/2。这个差额在 T = 1 时是 0.5,在方差量级上完全不能忽略。取期望验证:E[W(T)²] = T,所以右边期望是 0;而直接按经典公式会得到 T/2。Itô 积分保持零均值这一性质,正是它在金融里好用的原因。

4. 把连续对象搬进计算机:模拟维纳过程的实操与坑

4.1 欧拉-马鲁山格式的收敛阶

考虑一般形式的 SDE:dX = a(X) dt + b(X) dW。最简单的离散化是

Xₙ₊₁ = Xₙ + a(Xₙ) Δt + b(Xₙ) √Δt · Zₙ,Zₙ ~ N(0,1)

这就是欧拉-马鲁山格式。它的强收敛阶是 0.5,意思是路径层面的误差按 √Δt 缩小;弱收敛阶是 1.0,意思是矩的误差按 Δt 缩小。这两个数字的差别非常关键,它解释了很多实际现象:

  • 如果你只关心最终时刻的期望、方差这类统计量,用欧拉格式是够的,误差按 Δt 走,相对便宜;
  • 如果你关心的是路径依赖的收益,比如障碍期权、回望期权、首达时间,误差按 √Δt 走,成本急剧上升;
  • 想把路径误差降低 10 倍,步数要增加 100 倍,这才是开头那个朋友实验失败的真正原因。

如果你的 SDE 是乘性噪声形式,用米尔斯泰因格式可以把强收敛阶提到 1.0,代价是需要计算 b 的导数项。什么时候值得上米尔斯泰因?我的经验是:计算 b′(x) 的成本如果低于 10 倍步数带来的开销,换格式更划算;如果 b 是查表得到的、导数不解析,宁可加步数。

4.2 生成维纳路径的正确姿势

import numpy as np def wiener(T=1.0, n=2000, paths=5000, seed=7): """生成 paths 条维纳路径,时间网格 n+1 个点。""" rng = np.random.default_rng(seed) dt = T / n dW = rng.normal(0.0, np.sqrt(dt), size=(paths, n)) W = np.concatenate([np.zeros((paths, 1)), np.cumsum(dW, axis=1)], axis=1) t = np.linspace(0.0, T, n + 1) return t, W

两个细节值得强调。第一,增量必须先按 √dt 缩放再累加,我见过太多代码写成np.random.randn(n)直接累加,结果时间尺度完全错了,图形看着像但不满足方差正比于时间的性质。第二,用np.cumsum而不是 Python 循环累加,性能差好几个数量级,而且 numpy 的向量化在生成 5000 条路径时几乎是免费的。

4.3 用三条性质反查代码对不对

写完模拟代码不要急着往下跑业务,先做三个自检。

自检一:终点分布。W(T) 应该服从 N(0, T)。取 50000 条路径的终点,均值应该在 0 附近,标准差应该在 √T 附近。经验上,样本量 50000 时均值落在 ±0.03(T=1)范围内是正常的;超出这个范围要怀疑随机数生成器或者缩放写错了。

自检二:二次变差。前面那段验证代码跑一遍,均值和标准差要对得上。

自检三:首达时间。令 Tₐ 为首次触及水平 a > 0 的时刻,理论上有

P(Tₐ ≤ T) = 2(1 − Φ(a/√T))

其中 Φ 是标准正态分布函数。a = 1、T = 1 时这个概率约 0.3173。蒙特卡洛估计:

from scipy.stats import norm a, T = 1.0, 1.0 t, W = wiener(T=T, n=2000, paths=20000, seed=42) dt = T / 2000 hit = W >= a idx = np.argmax(hit, axis=1) never = ~hit.any(axis=1) # 关键:过滤从未触及的路径 tau = np.where(never, np.nan, idx * dt) tau = tau[~np.isnan(tau)] print(tau.size / 20000) # 未触及比例应约 0.6827 print(2 * (1 - norm.cdf(a / np.sqrt(T))))

这里有个坑我必须单独说。np.argmax在整行全为 False 时返回 0,如果不过滤,那批从未触及水平的路径会被记成"在时刻 0 就触及了",估计出来的首达时间会被严重拉低。我第一次写这段代码就被坑了,估出来的概率比理论值高了将近 0.1,查了半天以为随机数有问题。

4.4 一份踩过的坑清单

问题现象根本原因处理方式
路径图形正常但方差不对增量没乘 √dt检查缩放,用终点分布自检
换种子结果跳变很大路径数不足或 Monte Carlo 误差未评估用标准误 std/√paths 给出置信区间
细化步长收益极小欧拉格式只有 0.5 阶强收敛换米尔斯泰因或改用解析解采样
首达时间估计明显偏低未过滤从未触及的路径用hit.any(axis=1)掩码
结果不可复现用了全局随机状态一律使用default_rng(seed)实例
参考值附近反复微调仍不收敛SDE 是 Stratonovich 形式先做 Itô 转换再离散

最后一条尤其隐蔽。转换本身只涉及一个修正项,但如果你不知道要做,就会一直以为是自己步长不够、路径不够,白白浪费机器时间。

5. 几何布朗运动:维纳过程最出名的落地场景

5.1 为什么建模对象是收益率而不是价格

直接把价格建成维纳过程 S(t) = S(0) + μt + σW(t) 会带来两个致命问题。第一,正态分布取值可以到负无穷,价格变成负数在多数场景下没有意义。第二,这个模型假设价格的绝对波动幅度与价格水平无关,100 元的资产和 10 元的资产日波动都是 1 元,这与实际观察完全不符。

换成对数收益率就都解决了。设 S(t) = S(0) exp(X(t)),其中 X 是带漂移的维纳过程。价格天然为正,而且波动以比例形式表达,10% 的日波动对应任何价格水平都一样。这就是几何布朗运动的标准形式:

dS = μ S dt + σ S dW

参数 μ 是瞬时收益率,σ 是波动率。这个模型当然不完美,真实市场有波动率聚集、跳跃、胖尾,但它是所有后续模型的基准,理解它才能理解后面那些修正。

5.2 从 SDE 到闭式解,以及那个 −σ²/2 从哪来

对 ln S 用 Itô 引理。取 f(x) = ln x,则 f′ = 1/x,f″ = −1/x²,代入:

d(ln S) = (1/S) dS − (1/(2S²)) (dS)²

把 dS = μS dt + σS dW 代进去,(dS)² = σ²S² dt(因为 (dW)² = dt,dt 的更高阶项丢掉),于是

d(ln S) = (μ − σ²/2) dt + σ dW

积分得

S(t) = S(0) · exp[(μ − σ²/2) t + σ W(t)]

那个 −σ²/2 就是 Itô 引理带来的凸性修正。它的实际含义是:价格的对数期望增长率比 μ 低 σ²/2。举例来说,μ = 8%、σ = 20% 时,对数增长率只有 0.08 − 0.02 = 0.06。这解释了一个常见困惑——一个策略的年化算术平均收益是 8%,但它的几何平均收益只有 6% 左右,差值约等于方差的一半。做长期复利测算时用错这个量,几十年下来差得非常远。

模拟时要点是直接在对数空间采样,而不是用欧拉格式迭代价格:

def gbm(S0=100.0, mu=0.08, sigma=0.2, T=1.0, n=252, paths=200000, seed=11): rng = np.random.default_rng(seed) dt = T / n Z = rng.standard_normal((paths, n)) logret = (mu - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * Z logS = np.log(S0) + np.cumsum(logret, axis=1) S = np.concatenate([np.full((paths, 1), S0), np.exp(logS)], axis=1) return S S = gbm() print(S[:, -1].mean()) # 应接近 100 * exp(0.08) ≈ 108.33

这里之所以能直接用精确解,是因为几何布朗运动有闭式解,没必要承受离散化误差。有解析解就不要用数值格式,这是我做了几年模拟之后总结出的第一条原则。只有那些没有闭式解的过程,比如带跳跃的、带随机波动率的,才需要退回到欧拉或米尔斯泰因。

5.3 参数估计:漂移项几乎估不准

波动率估计相对直接。给定日频收盘价序列,取对数收益 rᵢ = ln(Sᵢ/Sᵢ₋₁),则

σ̂ = sqrt( Σ(rᵢ − r̄)² / ((n − 1) · Δt) ),Δt = 1/252

注意分母是 (n − 1) 而不是 n。用 n 会引入一个 (n−1)/n 量级的低估,样本量 252 时低估约 0.2%,看似不大,但如果你的标的是波动率敏感型策略,这点偏差在长期会被放大。

漂移项就麻烦多了。理论上的估计误差量级约为 σ/√T(T 以年计)。σ = 20%、用一年数据时,μ 的标准误约 0.2,比 μ 本身(0.08 量级)还大。换句话说,用一年日频数据估出来的漂移项,符号都可能是反的。这不是数据质量问题,也不是方法问题,是信息量的硬约束。所以实务中很少去估 μ,短线用当前无风险利率或市场隐含的假设值,长线则把重点放在 σ 和波动率结构上。

还有几个我实际踩过的细节。停牌和缺失值要用前值填充还是删除,会明显影响 σ 估计,前者低估、后者高估,我倾向于删除并在报告里注明。隔夜跳空是否纳入,取决于你建模的是连续交易还是持仓收益,别混着用。时间尺度选择上,日频数据估的 σ 和 5 分钟频数据估的 σ 常常差 10% 以上,后者更容易受微观结构噪声影响,用之前先做自相关检验。

6. 同一个过程,在物理、滤波和生成模型里的不同面孔

6.1 从 Fokker-Planck 到热方程

维纳过程的概率密度 p(x, t) 满足 Fokker-Planck 方程(也叫前向 Kolmogorov 方程)。对 dX = a dt + b dW,一般形式是

∂p/∂t = −∂(a p)/∂x + (1/2) ∂²(b² p)/∂x²

对标准维纳过程 a = 0、b = 1,方程退化成 ∂p/∂t = (1/2) ∂²p/∂x²,也就是扩散系数为 1/2 的热方程。这个联系非常有价值:所有关于热传导的直觉都可以直接搬过来理解扩散。初始时刻集中在一点的分布随时间摊开成高斯峰,峰宽按 √t 增长,峰值按 1/√t 下降。如果你在做异常检测,发现某个传感器的残差分布宽度按 √t 增长,那就说明系统处于纯扩散状态,没有任何回复力在起作用。

反过来,加入回复力的过程(比如 Ornstein-Uhlenbeck 过程)对应的是有阻尼的热方程,分布会收敛到一个平稳形态。这个区分在很多工程问题里是判断建模方向的第一步:数据是按 √t 无限摊开,还是摊开到一定程度就停住?

6.2 卡尔曼滤波里的过程噪声

卡尔曼滤波的状态方程通常写成

xₖ = F xₖ₋₁ + wₖ,wₖ ~ N(0, Q)

这个 wₖ 就是维纳过程在离散时间下的增量近似。协方差矩阵 Q 的物理含义是"单位时间内状态不确定性增长多少",所以 Q 应该随时间步长线性缩放。这一点经常被忽略:有人换采样频率之后忘了同步调 Q,滤波结果立刻变得迟钝或者抖动。Q 和 Δt 是线性关系,不是平方根关系,因为它是方差而不是标准差。这个区别容易搞混,我的记法是:涉及随机扰动幅度的量按 √Δt 走,涉及方差和协方差的量按 Δt 走。

Q 的调参经验是:Q 太小,滤波器过度信任模型,真实状态发生突变时跟不上,残差序列会出现明显的自相关;Q 太大,滤波器过度信任观测,噪声全部透传,输出抖动。一个实用的排查方法是看残差的归一化平方和(NIS),如果长期偏离理论自由度,就是对 Q 或 R 的判断出问题了。

6.3 扩散生成模型的前向加噪

近两年大火的扩散生成模型,前向过程本质上是维纳过程的一个时间重参数化版本。连续形式写出来是

dx = −(1/2) β(t) x dt + √(β(t)) dW

离散化之后就是你熟悉的加噪公式 xₜ = √ᾱₜ x₀ + √(1 − ᾱₜ) ε。这里 ε 是标准正态噪声,系数 √(1 − ᾱₜ) 的角色就相当于维纳过程在时刻 t 的标准差 √t,只不过被缩放到了一个有界的调度区间上。理解了维纳过程的方差随时间单调增长这件事,整个噪声调度设计(linear、cosine、sigmoid 等)就不难理解了:它们都是在控制"方差增长曲线"的形状。

这里有个实践中的观察。噪声调度设计不当的表现,往往和随机过程本身的某个性质有关。如果前期加噪太快,方差增长曲线在低 t 区域过于陡峭,模型在细节恢复上会吃力;如果后期加噪太慢,终点分布没有充分接近标准正态,采样时的初始状态就不对,生成结果会系统性地偏向训练分布。做调参的时候,我会把 √(1 − ᾱₜ) 这条曲线单独画出来看形状,比看损失曲线更有信息量。

6.4 什么时候维纳过程不够用

维纳过程是基准,但真实世界经常偏离它,知道偏离在哪很重要。

带约束的场景。如果过程必须从某个值出发并回到某个值(比如已知期初和期末的资产价格路径),应该用布朗桥而不是原始维纳过程。构造很简单:B(t) = W(t) − (t/T) W(T),这条路径在 0 和 T 两端都是 0。做路径依赖的模拟时用布朗桥方差更低,同样的路径数能用更小的误差。

带记忆的场景。如果增量之间存在长期正相关,维纳过程的独立增量假设就不成立,需要用分数布朗运动,赫斯特指数 H > 1/2 表示持续性,H < 1/2 表示反持续性。注意分数布朗运动不是半鞅,前面讲的 Itô 积分理论整套不适用,处理起来要格外小心。

带跳跃的场景。股灾、订单流里的巨额成交、网络流量的突发,都不是连续扩散能刻画的。通常做法是在维纳过程的扩散项上叠加一个复合泊松过程,得到跳跃扩散模型。加了跳跃之后,虽然过程仍然在半鞅框架内,但模拟时跳跃时点的抽样和扩散部分的抽样要分开处理,而且跳跃强度参数的估计极易受极端样本影响。

重尾的场景。如果观测到的极端值远比正态分布预测的多,同时又不希望引入明显跳跃,可以考虑 α 稳定过程。不过它的二阶矩可能是无穷的,方差这个工具直接失效,做参数估计和风险度量都得换方法。

从维纳过程出发把这些都走一遍,我对"模型能力边界"这件事的感受是:大部分建模失败不是数学不够复杂,而是在偏离假设的地方没做检验。拿到一份数据,先看增量的自相关、看极端值的频率、看方差随时间的增长曲线,这三件事花不了半小时,但能省掉后面几天的返工。

最后分享一个我自己常用的小技巧。当你怀疑一段代码里的随机部分有问题,但不方便直接打印路径时,用二次变差和终点分布这两个指标做快速体检:前者检验增量的方差是否与时间步长同阶,后者检验累积缩放是否一致。这两个指标对参数错误、缩放错误、单位错误特别敏感,几十行代码就能跑完,比盯着路径图看半天有效率得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询