/ / /
第13讲:最大似然估计 (Maximum Likelihood Estimation)
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

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

💡

查看全集:💎Quantopia量化分析56讲

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

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

  1. 更准确地估计风险度量
  1. 设计考虑尾部风险的配置策略
  1. 构建基于贝叶斯决策理论的交易规则

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

一、环境准备与数据获取

1.1 安装必要库

pip install yfinance scipy matplotlib numpy statsmodels

1.2 导入库

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 生成正态分布样本

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

其中:

2.3 手动实现MLE估计

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验证

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

2.5 可视化对比

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 生成指数分布样本

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

3.2 MLE公式推导

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

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

其中:

3.3 手动实现MLE估计

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

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

3.4 使用Scipy验证

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

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

4.1 获取股票数据

# 获取特斯拉股票数据
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 正态分布拟合

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

4.3 可视化分布拟合

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检验)

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 概率函数

5.2 对数似然的优势

  1. 将乘积转换为求和,便于计算
  1. 对数函数的单调性保持极值位置不变
  1. 数值稳定性更好

5.3 MLE的渐近性质

当样本量增大时:

六、练习与思考

练习1(难度:★☆☆)

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

练习2(难度:★★☆)

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

思考题

  1. 当样本量较小时,MLE估计会有什么问题?
  1. 如何比较不同分布对同一数据的拟合优度?
  1. 金融收益率数据通常表现出哪些不符合正态分布的特征?

注意事项:

  1. 实际运行时可能需要调整日期范围(某些股票可能没有早年的数据)
  1. 收益率计算部分需确保收盘价数据的正确处理
  1. 可视化参数可根据具体数据分布调整bins数量等参数

代码更新说明:

  1. 使用yfinance替代了原来的get_pricing函数
  1. 更新了matplotlib的density参数(替代已废弃的normed)
  1. 添加了随机种子设置保证结果可复现
  1. 修正了指数分布参数的解释(numpy使用scale=1/λ)
  1. 优化了可视化代码的样式和标签

附:练习合集