最大似然估计是统计学中用于参数估计的经典方法,其核心思想是:寻找能够最大化观测数据出现概率的参数值。
量化交易策略开发中,将历史数据拟合到混合分布模型,使用MLE估计参数后,可以:
-
更准确地估计风险度量
-
设计考虑尾部风险的配置策略
-
构建基于贝叶斯决策理论的交易规则
金融机构广泛使用MLE来校准内部风险模型、定价模型和评级系统,尤其在Basel框架下的风险资本计算中扮演核心角色。
一、环境准备与数据获取#
1.1 安装必要库#
pip install yfinance scipy matplotlib numpy statsmodels1.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公式推导#
对于正态分布 ,其MLE估计量为:
其中:
-
是均值参数的MLE估计量
-
是方差参数的MLE估计量
-
T 是样本量
-
是第t个观测值
-
表示从t=1到T的求和
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公式推导#
对于指数分布,其MLE估计量为:
其中:
-
是率参数λ的MLE估计量
-
是样本均值
-
指数分布的期望是,这个估计量实际上是样本均值的倒数
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 概率函数#
-
概率函数:给定参数θ时,得到观测数据x的概率
-
似然函数:给定观测数据x时,参数θ的可能性
5.2 对数似然的优势#
-
将乘积转换为求和,便于计算
-
对数函数的单调性保持极值位置不变
-
数值稳定性更好
5.3 MLE的渐近性质#
当样本量增大时:
-
一致性:估计量收敛于真实参数
-
正态性:估计量服从正态分布
-
有效性:达到Cramér-Rao下界
六、练习与思考#
练习1(难度:★☆☆)#
对苹果股票(AAPL)的收益率进行正态分布拟合,并检验其正态性
练习2(难度:★★☆)#
实现均匀分布U(a,b)的MLE估计,并验证其有效性
思考题#
-
当样本量较小时,MLE估计会有什么问题?
-
如何比较不同分布对同一数据的拟合优度?
-
金融收益率数据通常表现出哪些不符合正态分布的特征?
注意事项:
-
实际运行时可能需要调整日期范围(某些股票可能没有早年的数据)
-
收益率计算部分需确保收盘价数据的正确处理
-
可视化参数可根据具体数据分布调整bins数量等参数
代码更新说明:
-
使用yfinance替代了原来的get_pricing函数
-
更新了matplotlib的density参数(替代已废弃的normed)
-
添加了随机种子设置保证结果可复现
-
修正了指数分布参数的解释(numpy使用scale=1/λ)
-
优化了可视化代码的样式和标签