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

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

推导并实现正态、指数分布的似然估计,比较估计值与样本统计,再检查优化收敛和正态性。

← 返回本讲讲义
完成状态保存在当前浏览器,可随时取消。

练习 1:正态分布#

问题描述#

  1. 编写计算正态分布MLE估计量μ和σ的函数

  2. 使用样本数据计算参数估计值

  3. 与SciPy的结果进行对比

  4. 绘制参数估计后的正态分布PDF曲线

Python答题框架#

code
# 正态分布参数估计函数框架
def normal_mu(X):
    # 在此处实现μ的计算逻辑
    raise NotImplementedError

def normal_sigma(X):
    # 在此处实现σ的计算逻辑
    raise NotImplementedError

# 生成样本数据
TRUE_MEAN = 40
TRUE_STD = 10
X = np.random.normal(TRUE_MEAN, TRUE_STD, 10000000)

# 计算参数估计值
mu = normal_mu(X)
std = normal_sigma(X)

# SciPy参数估计对比
scipy_mu, scipy_std = scipy.stats.norm.fit(X)

# 绘制分布图
x = np.linspace(0, 80, 80)
plt.hist(X, bins=x, density=True)
plt.plot(scipy.stats.norm.pdf(x, loc=mu, scale=std), color='red')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.legend(['Fitted PDF', 'Observed Data']);

练习 2:指数分布#

问题描述#

  1. 编写计算指数分布MLE估计量λ的函数

  2. 使用样本数据计算参数估计值

  3. 与SciPy的结果进行对比

  4. 绘制参数估计后的指数分布PDF曲线

Python答题框架#

code
# 指数分布参数估计函数框架
def exp_lambda(X):
    # 在此处实现λ的计算逻辑
    raise NotImplementedError

# 生成样本数据
TRUE_LAMBDA = 5
X = np.random.exponential(TRUE_LAMBDA, 1000)

# 计算参数估计值
lam = exp_lambda(X)

# SciPy参数估计对比
_, scipy_lambda = scipy.stats.expon.fit(X)

# 绘制分布图
x = range(0, 80)
plt.hist(X, bins=x, density=True)
plt.plot(scipy.stats.expon.pdf(x, scale=scipy_lambda), color='red')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.legend(['Fitted PDF', 'Observed Data']);

练习 3:使用MLE拟合金融数据#

问题描述#

  1. 使用yfinance获取SPY的2014-2015年收益率数据

  2. 用正态分布MLE估计参数

  3. 使用Jarque-Bera检验正态性假设

Python答题框架#

code
import yfinance as yf

# 获取数据
start = '2014-01-01'
end = '2015-01-01'
data = yf.download('SPY', start=start, end=end)
prices = data['Close']
returns = prices.pct_change().dropna()

# 参数估计
def normal_mu(X): ...
def normal_sigma(X): ...

mu = normal_mu(returns)
std = normal_sigma(returns)

# 绘制拟合结果
x = np.linspace(returns.min(), returns.max(), 1000)
plt.hist(returns, bins=50, density=True)
plt.plot(scipy.stats.norm.pdf(x, loc=mu, scale=std), color='red')
plt.show()

# 正态性检验
alpha = 0.05
stat, pval = scipy.stats.mstats.normaltest(returns)
print(f'P值: {pval:.6f}')
print('拒绝原假设' if pval < alpha else '接受原假设')

数据准备说明#

code
# yfinance数据获取示例
import yfinance as yf
import pandas as pd

# 获取多资产数据
symbols = ['AAPL', 'MSFT']
start = '2014-01-01'
end = '2015-01-01'
data = yf.download(symbols, start=start, end=end)

# 数据结构说明
print(data.head())
# 列结构为MultiIndex: ['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'] × symbols

注意:实际使用时请根据需求调整时间范围和资产列表,分钟级数据可能需要特殊权限。

完成练习后,自评一次

建议先独立作答,再展开参考答案进行核对。

模块收束 · 0/8 已完成

把知识收束成可复核的研究产物

完成后应该能够

  • 能够实现 OLS/MLE 并诊断估计波动
  • 能够区分相关关系、条件关系与因果结论

交付物

  • 一份包含参数稳定性图和回归结果的研究 Notebook

本模块已有 0/8 个主要学习单元完成。 本模块没有待复习项。