1. MCMC基础概念:从马尔可夫链到蒙特卡洛

大家好,欢迎来到这门课的第一章。说实话,MCMC这个名字听起来挺唬人的——马尔可夫链蒙特卡洛,六个字里三个专有名词。但别被它吓到,拆开来看,每个部分其实都不难理解。

我最早接触MCMC是在做期权定价的时候。当时有个复杂的随机波动率模型,解析解根本算不出来。导师丢给我一句:「去跑个MCMC吧。」我愣了半天,心想这玩意儿到底是什么?后来啃了几篇论文,踩了不少坑,才算真正搞明白。今天我就把这些经验分享给你。

1.1 马尔可夫链:有记忆,但只记上一秒

先说说马尔可夫链。这个概念其实很生活化。

你想想看,明天的天气跟什么有关?跟今天有关,跟昨天也有关,甚至跟大前天都有关。但马尔可夫链做了一个简化:未来只依赖于现在,与过去无关。用数学语言说就是:

P(X_{t+1} | X_t, X_{t-1}, ..., X_0) = P(X_{t+1} | X_t)

嗯,这就是「马尔可夫性」。说白了,就是「活在当下」。

我在做高频交易策略时,经常用马尔可夫链来建模订单流的状态。比如当前是「密集成交」还是「稀疏挂单」,下一时刻的状态只跟当前有关。这个假设虽然简单,但在很多场景下够用了。

核心要点:马尔可夫链是一个随机过程,它的未来状态只依赖于当前状态,不依赖于更早的历史。

一个马尔可夫链由三要素组成:

  • 状态空间:所有可能的状态集合,比如{牛市, 熊市, 震荡市}
  • 转移概率矩阵:从状态i到状态j的概率,记作P(i→j)
  • 初始分布:最开始处于各个状态的概率

举个例子,一个简单的两状态马尔可夫链:

# 状态:0=上涨,1=下跌
# 转移概率矩阵
P = [[0.7, 0.3],   # 今天上涨,明天70%继续涨,30%跌
     [0.4, 0.6]]   # 今天下跌,明天40%涨,60%继续跌

1.2 平稳分布:链子跑久了会稳定吗?

好,现在问题来了:如果我们让这个马尔可夫链一直跑下去,状态分布会变成什么样?

答案是:在满足一定条件下,它会收敛到一个稳定的分布,这个分布就叫平稳分布

数学上,平稳分布π满足:

π = π · P

也就是说,把平稳分布乘以转移矩阵,得到的还是它自己。这就像是一个「不动点」。

我记得有一次做资产配置的模拟,需要从后验分布中采样。当时我手动算了一下平稳分布,发现它跟历史数据的经验分布非常接近。那一刻我才真正体会到:马尔可夫链不是瞎跑,它是有目标的。

个人经验:判断一个链是否达到平稳,我通常会看多个链的收敛情况(Gelman-Rubin诊断),而不是只看一条链。单链容易骗人。

1.3 细致平衡条件:平稳分布的「通行证」

那么,怎么保证一个马尔可夫链有平稳分布?或者说,怎么设计转移概率,让链收敛到我们想要的分布?

这里就要提到细致平衡条件了:

π(i) · P(i→j) = π(j) · P(j→i)

这个公式的意思是:从状态i到j的概率流,等于从j到i的概率流。系统处于「微观平衡」状态。

满足细致平衡条件的马尔可夫链,一定有一个平稳分布π。反过来不一定成立,但细致平衡是构造MCMC算法的核心工具。

我曾经在实现Metropolis-Hastings算法时,因为没仔细检查细致平衡条件,结果采样出来的分布完全不对。排查了两天才发现是提议分布的对称性没处理好。嗯,这个坑我替你踩过了。

注意:细致平衡是充分条件,不是必要条件。但几乎所有实用的MCMC算法都基于它来设计。

1.4 蒙特卡洛方法:用随机数解决确定性问题

聊完马尔可夫链,我们来说说蒙特卡洛。

蒙特卡洛方法的核心思想很简单:用大量随机样本来近似计算复杂问题

比如,你想计算一个不规则图形的面积。解析几何搞不定?没关系,往里面随机撒点,数一数落在图形内的比例,乘以总面积就得到了近似值。这就是蒙特卡洛。

在金融里,蒙特卡洛最常见的应用是期权定价:

import numpy as np

def monte_carlo_option_price(S0, K, T, r, sigma, n_sim=100000):
    """蒙特卡洛模拟欧式看涨期权价格"""
    np.random.seed(42)
    Z = np.random.standard_normal(n_sim)
    ST = S0 * np.exp((r - 0.5 * sigma**2) * T + sigma * np.sqrt(T) * Z)
    payoff = np.maximum(ST - K, 0)
    price = np.exp(-r * T) * np.mean(payoff)
    return price

# 试试看
price = monte_carlo_option_price(100, 105, 1, 0.05, 0.2)
print(f"期权价格 ≈ {price:.2f}")

你看,代码很简单。但问题是:当我们需要从复杂的高维分布中采样时,普通的蒙特卡洛就失效了。这时候,MCMC就登场了。

1.5 MCMC的核心思想:让马尔可夫链帮你采样

好,现在我们把两个概念串起来。

MCMC的核心思想是:构造一个马尔可夫链,让它的平稳分布等于我们想要采样的目标分布,然后运行这个链,收集样本

说白了就是三步:

  1. 设计:构造一个转移核,使得目标分布π是它的平稳分布
  2. 运行:从某个初始状态开始,按照转移核一步步跳转
  3. 收集:扔掉前期的「热身」样本(burn-in),用后面的样本做估计

为什么要扔掉前期的样本?因为刚开始链还没收敛到平稳分布,那些样本是有偏的。我一般会扔掉前20%-50%的样本,具体比例看收敛速度。

一句话总结:MCMC = 马尔可夫链(保证收敛到目标分布) + 蒙特卡洛(用样本做近似计算)

下面这张图展示了MCMC的整体流程:

MCMC核心流程 目标分布 π(x) 我们想采样但采不了 构造 马尔可夫链 平稳分布 = π(x) 运行 样本序列 x₁, x₂, ..., xₙ 丢弃 Burn-in 样本 前20%-50%的样本不要 用剩余样本做估计 均值、方差、分位数... 图1:MCMC从目标分布出发,构造马尔可夫链,运行并采样,最终得到近似样本

1.6 为什么金融领域需要MCMC?

你可能要问:传统的蒙特卡洛方法不也能采样吗?为什么非要搞个MCMC?

原因很简单:很多金融模型的后验分布是高维的、非标准的、甚至没有解析形式。比如:

  • 随机波动率模型的参数估计
  • 信用风险中的违约概率推断
  • 贝叶斯统计中的后验分布采样
  • 因子模型中的隐状态推断

在这些场景下,普通的蒙特卡洛方法根本无从下手。而MCMC可以灵活地处理任意复杂的分布——只要你能写出它的概率密度函数(最多差一个常数倍)。

我的建议:刚开始学MCMC时,不要一上来就搞复杂的金融模型。先拿一个简单的一维高斯分布练手,把Metropolis-Hastings算法跑通,再逐步增加难度。这样出了问题也好排查。

1.7 本章小结

好了,第一章的内容就到这里。我们覆盖了:

概念 一句话理解 金融应用场景
马尔可夫链 未来只依赖现在 状态转换建模、订单流预测
平稳分布 链跑久了会稳定下来的分布 资产配置的长期权重
细致平衡 微观上正反概率流相等 构造MCMC算法的核心条件
蒙特卡洛 用随机数做近似计算 期权定价、风险度量
MCMC 用马尔可夫链帮你采样 贝叶斯推断、隐状态估计

下一章,我们会深入最经典的MCMC算法——Metropolis-Hastings。我会带着你一步步实现它,并告诉你我在实际项目中踩过的那些坑。


公众号:蓝海资料掘金营,微信deep3321