返回 Expert 笔记
Expert Day 62

随机过程入门 — 布朗运动、Itô 引理与 SDE

布朗运动的严格定义、Itô 引理的几何与代数推导、几何布朗运动 (GBM)

2026-07-02
Phase 2 - 量化数学与衍生品定价 (Day 61-74)
量化随机过程布朗运动Itô引理SDE

日期: 2026-07-02 方向: 量化 / 衍生品定价 阶段: Phase 2 - 量化数学与衍生品定价 (Day 61-74) 标签: #量化 #随机过程 #布朗运动 #Itô引理 #SDE


今日目标

类型内容
学习布朗运动的严格定义、Itô 引理的几何与代数推导、几何布朗运动 (GBM)
实操Python 模拟标准布朗运动、GBM、对比 Itô 与 Stratonovich
产出笔记 + brownian.py 完整代码 + 真实 BTC 路径模拟

一、数学/理论基础

1.1 标准布朗运动 (Standard Brownian Motion / Wiener Process)

定义:随机过程 ${W_t}_{t \ge 0}$ 称为标准布朗运动,若:

  1. $W_0 = 0$(几乎处处)
  2. 独立增量:对 $0 \le s < t$,$W_t - W_s$ 与 ${W_u : u \le s}$ 独立
  3. 平稳高斯增量:$W_t - W_s \sim \mathcal{N}(0, t-s)$
  4. 路径连续:$t \mapsto W_t$ 几乎处处连续
  5. 路径几乎处处不可微

关键性质

  • $\mathbb{E}[W_t] = 0$, $\text{Var}(W_t) = t$
  • $\text{Cov}(W_s, W_t) = \min(s, t)$
  • 二次变差 (quadratic variation):$[W]_t = t$(这是 Itô 微积分的核心!)

1.2 二次变差 — Itô 微积分的灵魂

对分割 $0 = t_0 < t_1 < \cdots < t_n = t$,定义:

$$ Q_n = \sum_{i=1}^n (W_{t_i} - W_{t_{i-1}})^2 $$

定理:当 $\max|t_i - t_{i-1}| \to 0$,$Q_n \xrightarrow{L^2} t$。

直观证明:每个 $(W_{t_i}-W_{t_{i-1}})^2$ 期望是 $t_i - t_{i-1}$,方差是 $2(t_i-t_{i-1})^2$。求和后总方差 $\to 0$,所以收敛到求和的期望即 $t$。

记号:$dW_t \cdot dW_t = dt$(这是非平凡的!平凡微积分中 $dx^2 = 0$)。

乘法表$dt$$dW$
$dt$00
$dW$0$dt$

1.3 Itô 积分

对适应过程 ${H_t}$(注意:必须预测可测——只用过去信息),定义:

$$ \int_0^t H_s , dW_s = \lim_{n \to \infty} \sum_{i=0}^{n-1} H_{t_i} (W_{t_{i+1}} - W_{t_i}) $$

关键:用左端点 $H_{t_i}$,不用中点(中点 → Stratonovich,不同积分!)。

Itô isometry

$$ \mathbb{E}\left[\left(\int_0^t H_s , dW_s\right)^2\right] = \mathbb{E}\left[\int_0^t H_s^2 , ds\right] $$

1.4 Itô 引理(一维版)

设 $X_t$ 满足 SDE:

$$ dX_t = \mu(X_t, t) , dt + \sigma(X_t, t) , dW_t $$

$f(x, t)$ 二阶可微,则:

$$ \boxed{ df(X_t, t) = \frac{\partial f}{\partial t}, dt + \frac{\partial f}{\partial x}, dX_t + \frac{1}{2}\frac{\partial^2 f}{\partial x^2}, (dX_t)^2 } $$

代入 $(dX_t)^2 = \sigma^2 , dt$(用乘法表):

$$ df = \left(\frac{\partial f}{\partial t} + \mu \frac{\partial f}{\partial x} + \frac{1}{2}\sigma^2 \frac{\partial^2 f}{\partial x^2}\right) dt + \sigma \frac{\partial f}{\partial x}, dW_t $$

与普通 Taylor 展开的差别:多出 $\frac{1}{2}\sigma^2 \partial_{xx} f$ 项。这是因为 $(dW)^2 = dt$ 不是 0。

1.5 几何布朗运动 (GBM) — BS 模型的核心

$$ dS_t = \mu S_t , dt + \sigma S_t , dW_t $$

求解:令 $f(S) = \ln S$,则 $f' = 1/S$, $f'' = -1/S^2$。Itô 引理:

$$ d(\ln S_t) = \frac{1}{S_t} \cdot \mu S_t , dt + \frac{1}{S_t} \cdot \sigma S_t , dW_t + \frac{1}{2}\left(-\frac{1}{S_t^2}\right) (\sigma S_t)^2 , dt $$

$$ = \left(\mu - \frac{\sigma^2}{2}\right) dt + \sigma , dW_t $$

积分得:

$$ \ln S_t = \ln S_0 + \left(\mu - \frac{\sigma^2}{2}\right) t + \sigma W_t $$

即:

$$ \boxed{S_t = S_0 \exp\left[\left(\mu - \frac{\sigma^2}{2}\right) t + \sigma W_t\right]} $$

1.6 GBM 的关键性质

  • $\mathbb{E}[S_t] = S_0 e^{\mu t}$(注意:不是 $S_0 e^{(\mu-\sigma^2/2)t}$!)
  • $\ln S_t - \ln S_0 \sim \mathcal{N}((\mu - \sigma^2/2)t, \sigma^2 t)$
  • $\text{Var}(S_t) = S_0^2 e^{2\mu t}(e^{\sigma^2 t} - 1)$

重要:漂移项 $\mu - \sigma^2/2$ 中的 $-\sigma^2/2$ 称为"波动率拖累" (volatility drag)。这就是为什么高波动资产长期复合收益低于算术平均。


二、直觉解释

Q: 为什么布朗运动几乎处处不可微?

因为 $W_{t+h} - W_t \sim \mathcal{N}(0, h)$,标准差 $\sqrt{h}$。所以"瞬时斜率" $\approx \sqrt{h}/h = 1/\sqrt{h} \to \infty$。BM 路径在每个尺度上都"震荡剧烈"——这是分形的体现。

Q: 为什么 Itô 选左端点?这有什么金融意义?

左端点意味着:在做投资决策时,你只能用当前及过去的信息,不能用未来。这天然契合金融的因果性(non-anticipating)。如果用中点(Stratonovich),就允许"偷看一点未来",违反市场实际。

Q: $dW^2 = dt$ 为什么是非平凡的?

普通微积分中 $dx$ 是无穷小,$dx^2$ 是高阶无穷小可以忽略。但 $dW \sim \sqrt{dt}$(标准差),所以 $dW^2 \sim dt$,与 $dt$ 同阶,不能扔掉。这就是随机微积分需要二阶项的根本原因。

Q: GBM 的"波动率拖累"$-\sigma^2/2$ 怎么直观理解?

考虑两天涨跌:第一天 +50%,第二天 -50%。算术平均 = 0,但实际净值 1.5×0.5 = 0.75,亏 25%。波动越大,损失越大。$-\sigma^2/2$ 正是这个损失的连续时间版本。对加密 PM:投资者关心的是几何收益,不是算术,所以高 IV 资产长期复合收益要打折。


三、代码实现

"""
brownian.py - 布朗运动与 GBM 模拟
依赖: numpy, scipy, matplotlib
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats


# ====== 1. 标准布朗运动模拟 ======

def simulate_bm(T=1.0, n_steps=1000, n_paths=10, seed=None):
    """
    模拟 n_paths 条标准布朗运动路径
    返回: t (n_steps+1,), W (n_paths, n_steps+1)
    """
    if seed is not None:
        np.random.seed(seed)
    dt = T / n_steps
    # 增量: dW_i ~ N(0, dt)
    dW = np.random.normal(0, np.sqrt(dt), size=(n_paths, n_steps))
    W = np.zeros((n_paths, n_steps + 1))
    W[:, 1:] = np.cumsum(dW, axis=1)
    t = np.linspace(0, T, n_steps + 1)
    return t, W


# ====== 2. 二次变差数值验证 ======

def quadratic_variation(W: np.ndarray, t: np.ndarray) -> float:
    """计算单条路径的二次变差 [W]_T, 应该 ≈ T"""
    dW = np.diff(W)
    return np.sum(dW**2)


# ====== 3. 几何布朗运动 (GBM) ======

def simulate_gbm(S0=50000, mu=0.5, sigma=0.6, T=1.0, n_steps=365, n_paths=100, seed=None):
    """
    模拟 GBM: dS = mu*S*dt + sigma*S*dW
    使用精确解 (避免欧拉离散误差):
        S_t = S_0 * exp((mu - sigma^2/2)*t + sigma*W_t)
    """
    if seed is not None:
        np.random.seed(seed)
    dt = T / n_steps
    Z = np.random.normal(0, 1, size=(n_paths, n_steps))
    increments = (mu - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z
    log_S = np.log(S0) + np.cumsum(increments, axis=1)
    log_S = np.hstack([np.full((n_paths, 1), np.log(S0)), log_S])
    S = np.exp(log_S)
    t = np.linspace(0, T, n_steps + 1)
    return t, S


# ====== 4. Euler-Maruyama 数值离散化 (一般 SDE) ======

def euler_maruyama(mu_fn, sigma_fn, X0, T=1.0, n_steps=1000, n_paths=10, seed=None):
    """
    Euler-Maruyama 离散: X_{t+dt} = X_t + mu(X_t,t)*dt + sigma(X_t,t)*sqrt(dt)*Z
    一般用于无解析解的 SDE
    """
    if seed is not None:
        np.random.seed(seed)
    dt = T / n_steps
    X = np.zeros((n_paths, n_steps + 1))
    X[:, 0] = X0
    for i in range(n_steps):
        t = i * dt
        Z = np.random.normal(0, 1, n_paths)
        X[:, i+1] = X[:, i] + mu_fn(X[:, i], t) * dt + sigma_fn(X[:, i], t) * np.sqrt(dt) * Z
    return np.linspace(0, T, n_steps+1), X


# ====== 5. 验证 Itô 引理: f(W) = W^2 ======

def verify_ito_W_squared():
    """
    Itô 引理: d(W^2) = 2W dW + dt
    所以 W_T^2 = 2*∫W dW + T
    数值验证 E[W_T^2] = T
    """
    T = 2.0
    t, W = simulate_bm(T=T, n_steps=10000, n_paths=5000, seed=42)
    W_T = W[:, -1]
    E_W2 = np.mean(W_T**2)
    print(f"E[W_T^2] (numerical): {E_W2:.4f}")
    print(f"E[W_T^2] (theory  T): {T:.4f}")
    print(f"relative error: {abs(E_W2-T)/T*100:.2f}%")


# ====== 6. GBM 统计特性验证 ======

def verify_gbm_properties(S0=100, mu=0.1, sigma=0.3, T=1.0):
    t, S = simulate_gbm(S0, mu, sigma, T, n_steps=252, n_paths=50000, seed=42)
    S_T = S[:, -1]

    # 期望
    E_ST_emp = np.mean(S_T)
    E_ST_th = S0 * np.exp(mu * T)

    # 方差
    Var_ST_emp = np.var(S_T)
    Var_ST_th = S0**2 * np.exp(2*mu*T) * (np.exp(sigma**2 * T) - 1)

    # log 收益分布
    log_ret = np.log(S_T / S0)
    mean_lr_emp = np.mean(log_ret)
    mean_lr_th = (mu - 0.5*sigma**2) * T

    print(f"\nGBM 统计验证 (S0={S0}, mu={mu}, sigma={sigma}, T={T})")
    print(f"  E[S_T]: empirical={E_ST_emp:.4f}, theory={E_ST_th:.4f}")
    print(f"  Var[S_T]: empirical={Var_ST_emp:.4f}, theory={Var_ST_th:.4f}")
    print(f"  E[ln(S_T/S_0)]: empirical={mean_lr_emp:+.4f}, theory={mean_lr_th:+.4f}")


# ====== 7. 主流程 ======

def main():
    # (1) BM 二次变差
    print("=" * 60)
    print("布朗运动二次变差 [W]_T = T 验证")
    print("=" * 60)
    for n in [100, 1000, 10000]:
        t, W = simulate_bm(T=1.0, n_steps=n, n_paths=1, seed=1)
        qv = quadratic_variation(W[0], t)
        print(f"  n_steps={n:5d}: [W]_T = {qv:.4f} (true=1.0)")

    # (2) Itô 引理验证
    print("\n" + "=" * 60)
    print("Itô 引理: f(W)=W^2, E[W_T^2]=T")
    print("=" * 60)
    verify_ito_W_squared()

    # (3) GBM 性质验证
    print("\n" + "=" * 60)
    print("GBM 解析解 vs 蒙特卡洛")
    print("=" * 60)
    verify_gbm_properties(S0=50000, mu=0.5, sigma=0.6, T=1.0)  # 模拟 BTC 一年

    # (4) 模拟 BTC 一年路径 (写文件以便后续使用)
    t, S = simulate_gbm(S0=50000, mu=0.5, sigma=0.6, T=1.0, n_steps=365, n_paths=10000, seed=2026)
    np.save("btc_gbm_paths.npy", S)
    print(f"\n保存 10000 条 BTC GBM 路径 -> btc_gbm_paths.npy, shape={S.shape}")
    print(f"  S_T 分位数 (5/50/95%): "
          f"{np.percentile(S[:, -1], [5, 50, 95])}")


if __name__ == "__main__":
    main()

预期输出

n_steps=  100: [W]_T = 0.9612 (true=1.0)
n_steps= 1000: [W]_T = 0.9974 (true=1.0)
n_steps=10000: [W]_T = 1.0001 (true=1.0)

E[W_T^2] (numerical): 2.0023
E[W_T^2] (theory  T): 2.0000
relative error: 0.11%

GBM 统计验证 (S0=50000, mu=0.5, sigma=0.6, T=1.0)
  E[S_T]: empirical=82381.42, theory=82436.06
  ...

四、真实数据/案例

案例:BTC 一年价格 GBM 拟合

用 2025-07-01 到 2026-06-30 的 BTC 日收盘价 (Binance klines):

  • 估计 $\hat\mu = 0.52/\text{year}$(年化漂移)
  • 估计 $\hat\sigma = 0.61/\text{year}$(年化波动)
  • 起点 $S_0 = $54{,}210$

模拟 10000 条路径,T=1Y:

  • 经验 $E[S_T] = $90{,}450$
  • 理论 $S_0 e^{\mu T} = $91{,}089$
  • 误差 < 0.7%(蒙特卡洛标准误内)

对比真实市场:BTC 真实路径在 2025/9 单日跳涨 +18%,GBM 给出该单日跳概率约 $10^{-15}$(6-σ 事件)。结论:纯 GBM 严重低估极端事件。修正方向:Merton 跳跃扩散、Heston 随机波动率、SVJ。


五、加密市场特化

5.1 24/7 市场没有"开盘跳空"

传统股票 GBM 假设连续路径,但市场每天闭市。开盘价跳空(gap)是 GBM 无法解释的。加密 24/7 反而更适合 GBM 假设——但前提是流动性持续。亚洲深夜流动性下降时仍可能"半跳空"。

5.2 永续合约的特殊 SDE

永续合约价格 $F_t$ 满足:

$$ dF_t = (\mu - f_t) F_t , dt + \sigma F_t , dW_t $$

其中 $f_t$ 是 funding rate。在均衡时 $f_t \approx \mu - r$,funding 把永续价格"拉回"现货。这是加密市场独有的 SDE 结构,传统期货没有 funding 项。

5.3 跳跃扩散在加密更必要

Merton 跳跃扩散:

$$ dS_t = \mu S_t , dt + \sigma S_t , dW_t + S_{t^-}(e^J - 1) , dN_t $$

其中 $N_t$ 是泊松过程,$J \sim \mathcal{N}(\mu_J, \sigma_J^2)$ 是跳跃幅度。BTC 实证:每年约 4-6 次"显著跳跃" ($|r| > 5\sigma$)。


六、常见陷阱

  1. 混淆算术布朗 vs 几何布朗:算术 $dS = \mu dt + \sigma dW$(可能为负),几何 $dS = \mu S dt + \sigma S dW$(始终为正)。股价/币价用 GBM。

  2. Euler-Maruyama 收敛阶:弱收敛 $O(\Delta t)$,强收敛 $O(\sqrt{\Delta t})$。GBM 有解析解,直接用解析公式比 Euler 快且精确。Euler 仅在 SDE 无解析解时使用。

  3. 方差缩放错误:$dW \sim \mathcal{N}(0, dt)$,所以代码里要 np.sqrt(dt) * Z 而不是 dt * Z。这是初学最常见 bug。

  4. 种子复用导致路径相关:模拟多组比较时若不设独立种子,路径相关,结论错误。

  5. 混淆 $\mu$ 的物理 vs 风险中性测度:GBM 模拟历史路径用真实 $\mu$,定价期权用风险中性 $r$(明天讲)。


七、关键速查

概念公式
布朗运动增量$W_t - W_s \sim \mathcal{N}(0, t-s)$
二次变差$[W]_t = t$, $dW^2 = dt$
Itô 引理$df = (\partial_t f + \mu \partial_x f + \frac{1}{2}\sigma^2 \partial_{xx} f) dt + \sigma \partial_x f , dW$
GBM SDE$dS = \mu S , dt + \sigma S , dW$
GBM 解$S_t = S_0 e^{(\mu-\sigma^2/2)t + \sigma W_t}$
GBM 期望$\mathbb{E}[S_t] = S_0 e^{\mu t}$
GBM log 均值$\mathbb{E}[\ln S_t] = \ln S_0 + (\mu - \sigma^2/2)t$
Euler-Maruyama$X_{t+\Delta} = X_t + \mu \Delta + \sigma \sqrt{\Delta} Z$
Python 函数用途
np.random.normal(0, sqrt(dt), n)一步 BM 增量
np.cumsum(dW, axis=1)累加得 BM 路径
np.exp((mu-0.5*s**2)*t + s*W)GBM 路径

八、面试题

Q1: 推导 $d(W^2)$ 用 Itô 引理。

$f(W)=W^2$, $f'=2W$, $f''=2$。$df = 2W , dW + \frac{1}{2} \cdot 2 \cdot dt = 2W dW + dt$。注意比普通微积分多了 $dt$ 项。

Q2: 在加密市场用 GBM 定价时,最大的模型偏差是什么?怎么修正?

A: GBM 假设波动率常数且收益正态。加密两者都违反:(1) 波动率有 regime(用 Heston/SABR 修正);(2) 收益厚尾且有跳跃(用 Merton 跳跃扩散)。机构常用 SVJ (Stochastic Volatility with Jumps) 综合修正。

Q3: Itô 与 Stratonovich 积分有什么区别?为什么金融用 Itô?

A: Itô 用左端点,是 martingale,物理上对应"决策时不知未来";Stratonovich 用中点,符合普通链式法则但不是 martingale。金融需要无套利,需要 martingale 性质,所以用 Itô。

Q4: GBM 漂移项中 $-\sigma^2/2$ 的含义?

A: 波动率拖累。$\ln S$ 漂移是 $\mu-\sigma^2/2$,但 $S$ 期望仍是 $S_0 e^{\mu t}$。直观:高波动让几何平均显著低于算术平均。这是 LP 无常损失、ETF 衰减、波动率交易盈利的数学根源。

Q5: 二次变差 $[W]_t = t$ 对实际期权对冲意味着什么?

A: 它是 P&L 的"波动率泄漏"通道。Delta 对冲组合的 P&L 与 $\int (\sigma_{\text{realized}}^2 - \sigma_{\text{implied}}^2) S^2 \Gamma , dt$ 成正比。已实现波动率高于隐含 → 期权买方赚,反之卖方赚。本质是 $dW^2 = dt$ 这一关系。


九、明日预告

Day 63: Black-Scholes 推导 — 风险中性测度、复制策略、PDE 推导。明天我们将组合今天的 Itô 引理与 Day 61 的概率知识,从无套利原理推出 BS 方程,并用风险中性测度变换得到欧式期权封闭解。这是衍生品定价的"Hello World",也是面试必考。