返回 Expert 笔记
Expert Day 61

概率统计基础回顾 — 量化金融的数学根基

期望/方差/协方差/相关系数、大数定律 (LLN)、中心极限定理 (CLT)、矩估计 (Method of Moments)

2026-07-01
Phase 2 - 量化数学与衍生品定价 (Day 61-74)
量化概率论统计CLT矩估计

日期: 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"。


六、常见陷阱

  1. 样本方差用 $n$ 还是 $n-1$:MoM 用 $n$,无偏估计用 $n-1$。numpy np.var(x) 默认 ddof=0,金融场景应显式 ddof=1

  2. 年化波动率乘 $\sqrt{252}$ vs $\sqrt{365}$:股票用 252(交易日),加密用 365(日历日)。永续合约用 funding 周期 365×3=1095 也常见错误。

  3. JB 检验过度依赖:JB 检验对样本量敏感,n=5000 时几乎总是拒绝正态。关键不是"是否正态"而是"偏离多少"——看超额峰度数值更有意义。

  4. 均值漂移忽略:估计波动时若不去均值,方差被放大。代码中务必先 demean。

  5. 跳跃数据未清洗:闪崩日(如 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ô 引理如何成为整个连续时间金融的基石。