🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

练习

练习 1:正态分布

问题描述

  1. 编写计算正态分布MLE估计量μ和σ的函数
  1. 使用样本数据计算参数估计值
  1. 与SciPy的结果进行对比
  1. 绘制参数估计后的正态分布PDF曲线

Python答题框架

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

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

# 生成样本数据
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估计量λ的函数
  1. 使用样本数据计算参数估计值
  1. 与SciPy的结果进行对比
  1. 绘制参数估计后的指数分布PDF曲线

Python答题框架

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

# 生成样本数据
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年收益率数据
  1. 用正态分布MLE估计参数
  1. 使用Jarque-Bera检验正态性假设

Python答题框架

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 '接受原假设')

数据准备说明

# 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

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