概率统计基础回顾 — 量化金融的数学根基
期望/方差/协方差/相关系数、大数定律 (LLN)、中心极限定理 (CLT)、矩估计 (Method of Moments)
日期: 2026-07-01 方向: 量化 / 衍生品定价 阶段: Phase 2 - 量化数学与衍生品定价 (Day 61-74) 标签: #量化 #概率论 #统计 #CLT #矩估计
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | 期望/方差/协方差/相关系数、大数定律 (LLN)、中心极限定理 (CLT)、矩估计 (Method of Moments) |
| 实操 | numpy 实现矩估计,对比 BTC/ETH/SOL 日收益率分布与正态分布的差异 |
| 产出 | 笔记 + moments.py 完整代码 + 真实数据案例 |
一、数学/理论基础
1.1 期望与方差 — 严格定义
对于随机变量 $X$,其期望 (expectation) 与方差 (variance) 定义为:
$$ \mathbb{E}[X] = \int_{-\infty}^{\infty} x , f_X(x) , dx, \quad \text{Var}(X) = \mathbb{E}[(X - \mathbb{E}[X])^2] = \mathbb{E}[X^2] - (\mathbb{E}[X])^2 $$
关键性质(推导请掌握):
- 线性:$\mathbb{E}[aX + bY] = a\mathbb{E}[X] + b\mathbb{E}[Y]$(无论独立与否)
- 方差非线性:$\text{Var}(aX + bY) = a^2 \text{Var}(X) + b^2 \text{Var}(Y) + 2ab ,\text{Cov}(X, Y)$
推导 $\text{Var}(X+Y)$:
$$ \begin{aligned} \text{Var}(X+Y) &= \mathbb{E}[(X+Y - \mu_X - \mu_Y)^2] \ &= \mathbb{E}[(X - \mu_X)^2] + \mathbb{E}[(Y - \mu_Y)^2] + 2\mathbb{E}[(X-\mu_X)(Y-\mu_Y)] \ &= \text{Var}(X) + \text{Var}(Y) + 2\text{Cov}(X, Y) \end{aligned} $$
1.2 协方差与相关系数
$$ \text{Cov}(X, Y) = \mathbb{E}[(X - \mu_X)(Y - \mu_Y)], \quad \rho_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} \in [-1, 1] $$
Cauchy-Schwarz 推论:$|\text{Cov}(X, Y)| \le \sigma_X \sigma_Y$,所以 $|\rho| \le 1$。这是相关系数有界的根本原因。
1.3 大数定律 (LLN)
弱大数定律 (Weak LLN, Khintchine):若 $X_1, X_2, \ldots, X_n$ 独立同分布 (i.i.d.) 且 $\mathbb{E}[X_i] = \mu$ 存在,则:
$$ \bar{X}n = \frac{1}{n}\sum{i=1}^n X_i \xrightarrow{P} \mu, \quad n \to \infty $$
直觉:样本均值会"收敛"到总体均值。这是矩估计的理论依据。
强大数定律 (Strong LLN, Kolmogorov):在相同条件下,$\bar{X}_n \xrightarrow{a.s.} \mu$,几乎处处收敛(更强的收敛模式)。
1.4 中心极限定理 (CLT)
设 $X_1, \ldots, X_n$ i.i.d.,$\mathbb{E}[X_i] = \mu$,$\text{Var}(X_i) = \sigma^2 < \infty$,则:
$$ Z_n = \frac{\bar{X}_n - \mu}{\sigma / \sqrt{n}} \xrightarrow{d} \mathcal{N}(0, 1), \quad n \to \infty $$
核心含义:无论 $X_i$ 是什么分布,标准化后的样本均值近似服从标准正态分布。这就是为什么 BS 模型可以从离散二叉树极限过渡到连续高斯过程。
收敛速度 — Berry-Esseen 定理:
$$ \sup_x |F_{Z_n}(x) - \Phi(x)| \le \frac{C , \mathbb{E}[|X - \mu|^3]}{\sigma^3 \sqrt{n}} $$
含义:收敛速度是 $O(1/\sqrt{n})$,且与第三阶矩(峰度/偏度)有关。这是为什么加密资产 CLT 收敛慢——尾部太厚。
1.5 矩估计 (Method of Moments, MoM)
设 $X$ 有参数 $\theta = (\theta_1, \ldots, \theta_k)$。理论矩为 $\mu_j(\theta) = \mathbb{E}[X^j]$,样本矩为 $\hat{\mu}_j = \frac{1}{n}\sum_i X_i^j$。
MoM 思想:解方程组 $\hat{\mu}_j = \mu_j(\theta)$ 得到 $\hat{\theta}$。
例:估计正态分布 $\mathcal{N}(\mu, \sigma^2)$:
$$ \hat{\mu} = \bar{X}, \quad \hat{\sigma}^2 = \frac{1}{n}\sum_i (X_i - \bar{X})^2 $$
注意:MoM 估计的方差是有偏的(除以 $n$),无偏估计要除以 $n-1$(Bessel correction)。
二、直觉解释
Q: 为什么我们如此重视 CLT?
CLT 是"高斯分布无处不在"的根本原因。它告诉我们:无论底层数据生成过程多么复杂,只要是大量独立小冲击的累加,结果就近似正态。BS 模型的核心假设——股价对数收益服从正态——本质上就是 CLT 在"许多小价格变动"上的应用。
Q: 为什么加密资产收益率"看起来"不像正态?
- 跳跃 (jumps):黑天鹅事件(如 Luna 崩盘、FTX 暴雷)违反"小冲击"假设
- 波动聚集 (volatility clustering):违反 i.i.d. 假设(GARCH 效应)
- 时间不连续:周末事件(虽然加密 24/7,但流动性有结构性差异)
Q: 矩估计 vs 极大似然 (MLE) 怎么选?
- MoM:简单、无需知道分布形式,但效率低
- MLE:渐进有效(达到 Cramér-Rao 下界),但需要知道似然函数
- 加密量化中常用:先用 MoM 快速估计起点,再用 MLE/数值优化精修
三、代码实现
"""
moments.py - 矩估计 + 加密资产收益率分析
依赖: numpy, scipy, pandas, requests, matplotlib
运行: python moments.py
"""
import numpy as np
import pandas as pd
import requests
from scipy import stats
import matplotlib.pyplot as plt
# ====== 1. 基础统计量计算 ======
def basic_stats(x: np.ndarray) -> dict:
"""计算样本的基本矩估计量"""
n = len(x)
mean = np.mean(x)
var_biased = np.mean((x - mean)**2) # MoM (有偏)
var_unbiased = np.var(x, ddof=1) # Bessel 修正
skew = np.mean((x - mean)**3) / var_biased**1.5
kurt = np.mean((x - mean)**4) / var_biased**2 - 3 # excess kurtosis
return {
"n": n,
"mean": mean,
"std_unbiased": np.sqrt(var_unbiased),
"skewness": skew,
"excess_kurtosis": kurt,
}
# ====== 2. CLT 数值验证 ======
def clt_demo(dist_sampler, n_samples=10000, sample_size=30):
"""
验证 CLT: 从任意分布抽样, 样本均值近似正态
dist_sampler: 函数, 调用 dist_sampler(size) 返回样本
"""
sample_means = np.array([
np.mean(dist_sampler(sample_size)) for _ in range(n_samples)
])
# 标准化
z = (sample_means - np.mean(sample_means)) / np.std(sample_means)
# KS 检验是否符合标准正态
ks_stat, p_value = stats.kstest(z, 'norm')
return {"ks_statistic": ks_stat, "p_value": p_value, "z_samples": z}
# ====== 3. 矩估计: 拟合正态分布参数 ======
def mom_normal(x: np.ndarray) -> tuple:
"""对正态分布 N(mu, sigma^2) 做矩估计"""
mu_hat = np.mean(x)
sigma_hat = np.sqrt(np.mean((x - mu_hat)**2)) # MoM 用 n, 非 n-1
return mu_hat, sigma_hat
# ====== 4. 真实数据: Binance 日 K 线 ======
def fetch_binance_klines(symbol="BTCUSDT", interval="1d", limit=500):
"""
从 Binance 拉日 K 线
API: https://api.binance.com/api/v3/klines
返回字段索引: [0]openTime [1]open [2]high [3]low [4]close [5]volume ...
"""
url = "https://api.binance.com/api/v3/klines"
params = {"symbol": symbol, "interval": interval, "limit": limit}
r = requests.get(url, params=params, timeout=10)
r.raise_for_status()
data = r.json()
df = pd.DataFrame(data, columns=[
"openTime", "open", "high", "low", "close", "volume",
"closeTime", "quoteVolume", "trades", "takerBuyBase",
"takerBuyQuote", "ignore"
])
df["close"] = df["close"].astype(float)
df["openTime"] = pd.to_datetime(df["openTime"], unit="ms")
df["log_return"] = np.log(df["close"] / df["close"].shift(1))
return df.dropna().reset_index(drop=True)
# ====== 5. 主流程 ======
def main():
# 拉取真实数据
print("=" * 60)
print("加密资产收益率矩估计 vs 正态假设")
print("=" * 60)
for symbol in ["BTCUSDT", "ETHUSDT", "SOLUSDT"]:
try:
df = fetch_binance_klines(symbol, "1d", 500)
r = df["log_return"].values
stats_dict = basic_stats(r)
mu, sigma = mom_normal(r)
jb_stat, jb_p = stats.jarque_bera(r)
print(f"\n[{symbol}] n={stats_dict['n']}")
print(f" mean (annualized): {stats_dict['mean']*365:+.4f}")
print(f" std (annualized): {stats_dict['std_unbiased']*np.sqrt(365):.4f}")
print(f" skewness: {stats_dict['skewness']:+.4f}")
print(f" excess kurtosis: {stats_dict['excess_kurtosis']:+.4f}")
print(f" Jarque-Bera p: {jb_p:.6f} ({'rejects' if jb_p<0.05 else 'fails to reject'} normality)")
except Exception as e:
print(f"[{symbol}] error: {e}")
# CLT 数值验证 (从均匀分布抽样)
print("\n" + "=" * 60)
print("CLT 数值验证: 均匀分布的样本均值")
print("=" * 60)
for n in [5, 30, 100]:
result = clt_demo(lambda s: np.random.uniform(0, 1, s), 5000, n)
print(f" sample_size={n:3d}: KS p-value = {result['p_value']:.4f}")
if __name__ == "__main__":
main()
预期输出(示例):
[BTCUSDT] n=499
mean (annualized): +0.4523
std (annualized): 0.6231
skewness: -0.4218
excess kurtosis: +5.6731
Jarque-Bera p: 0.000000 (rejects normality)
四、真实数据/案例
数据来源
- Binance Klines API:
https://api.binance.com/api/v3/klines- 字段:
[openTime, open, high, low, close, volume, closeTime, quoteVolume, trades, ...] - 限速:1200 weight/min,klines 每次 weight=1
- 字段:
- Deribit Public API:
https://www.deribit.com/api/v2/public/get_book_summary_by_currency?currency=BTC&kind=option
经验观察
| Symbol | 年化收益 | 年化波动率 | 偏度 | 超额峰度 | JB 检验 |
|---|---|---|---|---|---|
| BTC | ~50% | ~62% | -0.4 | +5.7 | 拒绝正态 |
| ETH | ~70% | ~75% | -0.3 | +4.8 | 拒绝正态 |
| SOL | ~120% | ~95% | -0.5 | +7.2 | 拒绝正态 |
关键发现:所有主流加密资产都呈现显著左偏 + 厚尾特征。这意味着用 BS 模型直接定价 OTM Put 会严重低估真实风险。
五、加密市场特化
5.1 24/7 市场对统计估计的影响
传统股市每年 ~252 个交易日,加密 365 天交易。年化系数:
$$ \sigma_{\text{annual}} = \sigma_{\text{daily}} \cdot \sqrt{365}, \quad \text{(crypto)} $$
而非 $\sqrt{252}$。陷阱:很多教科书代码沿用 252 会低估约 8% 的年化波动。
5.2 收益分布的"分布相变"
在低波动区(如 2024 年 Q3)BTC 日收益接近正态,超额峰度可能 < 1。但在高波动区(Luna 崩盘、3AC 暴雷),单日 -20% 事件违反 6-σ 假设(正态下概率 ~$10^{-9}$),实际频率远高。
5.3 跨交易所统计差异
同一资产在 Binance vs Coinbase vs Kraken 价格略有差异,导致 mean/var 估计有偏。机构量化通常用VWAP across CEX top-5作为"true price"。
六、常见陷阱
-
样本方差用 $n$ 还是 $n-1$:MoM 用 $n$,无偏估计用 $n-1$。numpy
np.var(x)默认 ddof=0,金融场景应显式ddof=1。 -
年化波动率乘 $\sqrt{252}$ vs $\sqrt{365}$:股票用 252(交易日),加密用 365(日历日)。永续合约用 funding 周期 365×3=1095 也常见错误。
-
JB 检验过度依赖:JB 检验对样本量敏感,n=5000 时几乎总是拒绝正态。关键不是"是否正态"而是"偏离多少"——看超额峰度数值更有意义。
-
均值漂移忽略:估计波动时若不去均值,方差被放大。代码中务必先 demean。
-
跳跃数据未清洗:闪崩日(如 2025-08-12 BTC 单日 -22%)直接计入会爆炸性放大方差估计。机构做法:用 winsorization 或 Huber 估计器。
七、关键速查
| 公式 | 表达式 |
|---|---|
| 期望线性 | $\mathbb{E}[aX+bY] = a\mathbb{E}[X]+b\mathbb{E}[Y]$ |
| 方差和 | $\text{Var}(X+Y) = \text{Var}(X)+\text{Var}(Y)+2\text{Cov}(X,Y)$ |
| 相关系数 | $\rho = \text{Cov}(X,Y)/(\sigma_X\sigma_Y)$ |
| CLT | $\sqrt{n}(\bar{X}-\mu)/\sigma \to \mathcal{N}(0,1)$ |
| 矩估计正态 | $\hat\mu=\bar X$, $\hat\sigma^2=\frac{1}{n}\sum(X_i-\bar X)^2$ |
| 年化(crypto) | $\sigma_{\text{ann}}=\sigma_{\text{daily}}\sqrt{365}$ |
| numpy 函数 | 用途 |
|---|---|
np.mean(x) | 样本均值 |
np.var(x, ddof=1) | 无偏方差 |
scipy.stats.skew(x) | 偏度 |
scipy.stats.kurtosis(x) | 超额峰度(默认) |
scipy.stats.jarque_bera(x) | JB 正态性检验 |
八、面试题
Q1: 加密资产日收益率的偏度是 -0.4,超额峰度是 +6,用 Black-Scholes 定价 OTM Put 会高估还是低估隐含波动率?为什么?
A: 低估真实下行风险,因此市场报的 IV 会比 BS 模型校准的 IV 高——这就是 IV smile(实际是 skew)的来源。BS 假设正态分布,但真实分布厚尾导致 OTM Put 的真实定价 > BS 价。
Q2: 为什么样本方差除以 $n-1$ 而不是 $n$?
A: 因为样本均值 $\bar X$ 本身用了一个自由度。$\mathbb{E}[\sum(X_i-\bar X)^2] = (n-1)\sigma^2$,所以 $\frac{1}{n-1}\sum(X_i-\bar X)^2$ 才是 $\sigma^2$ 的无偏估计(Bessel correction)。
Q3: 在估计 BTC 30 天波动率时,你会用 EWMA、GARCH(1,1)、还是简单滚动标准差?为什么?
A: 三者都用,做交叉验证。简单滚动 SD 在波动突变后反应慢;EWMA $\sigma_t^2 = \lambda\sigma_{t-1}^2 + (1-\lambda)r_t^2$(RiskMetrics, $\lambda=0.94$)反应快;GARCH 显式建模波动聚集与均值回复。机构常用 EWMA 做 1-day VaR,GARCH 做长期波动预测。
Q4: CLT 在加密市场失效的最常见原因是什么?
A: (1) 独立性破坏——日收益有自相关(尤其 funding 重置时刻);(2) 同分布破坏——波动 regime 切换;(3) 二阶矩有限性——极端 tail event 让方差实际上"无穷"。
Q5: 给 1000 个 BTC 日收益样本,用 MoM 估计了 $\hat\sigma=0.04$,但 GARCH 拟合给出条件波动 0.06。两者矛盾吗?
A: 不矛盾。MoM 是无条件方差(unconditional),GARCH 是条件方差(conditional)。当下条件波动可能高于长期均值,因为最近发生波动冲击。不矛盾的关系是 $\sigma_{\text{uncond}}^2 = \omega/(1-\alpha-\beta)$。
九、明日预告
Day 62: 随机过程入门 — 布朗运动 (Brownian Motion)、Itô 引理、随机微分方程 (SDE)。明天我们将从离散随机变量推广到连续时间随机过程,为 BS 推导铺路。重点是:为什么 $dW^2 = dt$,以及 Itô 引理如何成为整个连续时间金融的基石。