跳到主内容
研究主线统计估计与回归基础 · 第6–13讲8/8模块导览 →
讲义

第13讲:最大似然估计 (Maximum Likelihood Estimation)

从似然函数出发估计正态与其他分布参数,比较数值优化和解析结果,并用诊断检验评估分布假设。

完成状态保存在当前浏览器,可随时取消。

最大似然估计是统计学中用于参数估计的经典方法,其核心思想是:寻找能够最大化观测数据出现概率的参数值

量化交易策略开发中,将历史数据拟合到混合分布模型,使用MLE估计参数后,可以:

  1. 更准确地估计风险度量

  2. 设计考虑尾部风险的配置策略

  3. 构建基于贝叶斯决策理论的交易规则

金融机构广泛使用MLE来校准内部风险模型、定价模型和评级系统,尤其在Basel框架下的风险资本计算中扮演核心角色。

一、环境准备与数据获取#

1.1 安装必要库#

code
pip install yfinance scipy matplotlib numpy statsmodels

1.2 导入库#

code
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats
import yfinance as yf
from statsmodels.stats.stattools import jarque_bera

二、正态分布的MLE估计#

2.1 生成正态分布样本#

code
TRUE_MEAN = 40    # 真实均值
TRUE_STD = 10     # 真实标准差
np.random.seed(2023)  # 固定随机种子保证可重复性
X = np.random.normal(TRUE_MEAN, TRUE_STD, 1000)

2.2 MLE公式推导#

对于正态分布 N(μ,σ2)N(μ,σ2),其MLE估计量为:

μ^=1Tt=1TXt σ^2=1Tt=1T(Xtμ^)2\hat{\mu} = \frac{1}{T}\sum_{t=1}^T X_t \ \hat{\sigma}^2 = \frac{1}{T}\sum_{t=1}^T (X_t - \hat{\mu})^2

其中:

  • μ^\hat{\mu}是均值参数的MLE估计量

  • σ^2\hat{\sigma}^2 是方差参数的MLE估计量

  • T 是样本量

  • XtX_t 是第t个观测值

  • t=1T\sum_{t=1}^T 表示从t=1到T的求和

2.3 手动实现MLE估计#

code
def normal_mu_MLE(X):
    return np.mean(X)

def normal_sigma_MLE(X):
    return np.std(X, ddof=0)  # ddof=0表示除以n而不是n-1

print("均值估计(手动):", normal_mu_MLE(X))
print("标准差估计(手动):", normal_sigma_MLE(X))

2.4 使用Scipy验证#

code
mu, std = scipy.stats.norm.fit(X)
print("Scipy均值估计:", mu)
print("Scipy标准差估计:", std)

2.5 可视化对比#

code
x = np.linspace(0, 80, 100)
plt.hist(X, bins=30, density=True, alpha=0.7)
plt.plot(x, scipy.stats.norm.pdf(x, mu, std), 'r-', lw=2)
plt.title('正态分布拟合结果')
plt.legend(['MLE拟合曲线', '样本分布'])
plt.show()

三、指数分布的MLE估计#

3.1 生成指数分布样本#

code
TRUE_LAMBDA = 5
np.random.seed(2023)
X = np.random.exponential(1/TRUE_LAMBDA, 1000)  # 注意numpy参数为scale=1/λ

3.2 MLE公式推导#

对于指数分布f(x;λ)=λeλxf(x;λ)=λe−λx,其MLE估计量为:

λ^=1Xˉ\hat{\lambda} = \frac{1}{\bar{X}}

其中:

  • λ^\hat{\lambda}是率参数λ的MLE估计量

  • Xˉ\bar{X}是样本均值

  • 指数分布的期望是1/λ1/λ,这个估计量实际上是样本均值的倒数

3.3 手动实现MLE估计#

code
def exp_lambda_MLE(X):
    return 1 / np.mean(X)

print("Lambda估计(手动):", exp_lambda_MLE(X))

3.4 使用Scipy验证#

code
_, l = scipy.stats.expon.fit(X, floc=0)  # 固定位置参数为0
print("Scipy Lambda估计:", 1/l)  # Scipy返回的是scale参数=1/λ

四、实战:股票收益分布拟合#

4.1 获取股票数据#

code
# 获取特斯拉股票数据
data = yf.download('TSLA', start='2014-01-01', end='2015-01-01')

# 计算日收益率
close_prices = data['Close'].values
returns = np.diff(close_prices) / close_prices[:-1]

4.2 正态分布拟合#

code
mu, std = scipy.stats.norm.fit(returns)
print(f"收益率均值: {mu:.4f}")
print(f"收益率标准差: {std:.4f}")

4.3 可视化分布拟合#

code
plt.figure(figsize=(10,6))
plt.hist(returns, bins=50, density=True, alpha=0.6)
x = np.linspace(-0.2, 0.2, 100)
plt.plot(x, scipy.stats.norm.pdf(x, mu, std), 'r-')
plt.title('股票收益率正态分布拟合')
plt.xlabel('日收益率')
plt.ylabel('概率密度')
plt.show()

4.4 正态性检验(Jarque-Bera检验)#

code
jb_value, p_value, skewness, kurtosis = jarque_bera(returns)
print(f"JB统计量: {jb_value:.2f}")
print(f"P值: {p_value:.2e}")
print(f"偏度: {skewness:.2f}")
print(f"峰度: {kurtosis:.2f}")

五、关键概念解析#

5.1 似然函数 vs 概率函数#

  • 概率函数:给定参数θ时,得到观测数据x的概率

  • 似然函数:给定观测数据x时,参数θ的可能性

5.2 对数似然的优势#

  1. 将乘积转换为求和,便于计算

  2. 对数函数的单调性保持极值位置不变

  3. 数值稳定性更好

5.3 MLE的渐近性质#

当样本量增大时:

  • 一致性:估计量收敛于真实参数

  • 正态性:估计量服从正态分布

  • 有效性:达到Cramér-Rao下界

六、练习与思考#

练习1(难度:★☆☆)#

对苹果股票(AAPL)的收益率进行正态分布拟合,并检验其正态性

练习2(难度:★★☆)#

实现均匀分布U(a,b)的MLE估计,并验证其有效性

思考题#

  1. 当样本量较小时,MLE估计会有什么问题?

  2. 如何比较不同分布对同一数据的拟合优度?

  3. 金融收益率数据通常表现出哪些不符合正态分布的特征?


注意事项:

  1. 实际运行时可能需要调整日期范围(某些股票可能没有早年的数据)

  2. 收益率计算部分需确保收盘价数据的正确处理

  3. 可视化参数可根据具体数据分布调整bins数量等参数

代码更新说明:

  1. 使用yfinance替代了原来的get_pricing函数

  2. 更新了matplotlib的density参数(替代已废弃的normed)

  3. 添加了随机种子设置保证结果可复现

  4. 修正了指数分布参数的解释(numpy使用scale=1/λ)

  5. 优化了可视化代码的样式和标签