4. 均值插补在股票收益率数据中的应用
任务目标
给定一段包含缺失值的股票日收益率序列,使用均值插补法填充缺失值,并对比插补前后数据的均值、标准差与分布形态变化,以评估插补对数据统计特性的影响。
数据与依赖
使用Python 3.8+,依赖pandas、numpy、scipy。以下代码构造了含10%随机缺失的日收益率序列(模拟数据,非真实行情),并完成插补与评估。
关键完整代码
import pandas as pd
import numpy as np
from scipy import stats
# 1. 构造含缺失值的日收益率序列(模拟)
np.random.seed(42)
n = 200
returns = pd.Series(np.random.normal(0.0005, 0.02, n))
missing_idx = np.random.choice(n, size=20, replace=False)
returns_with_na = returns.copy()
returns_with_na.iloc[missing_idx] = np.nan
# 2. 均值插补
mean_val = returns_with_na.mean()
returns_imputed = returns_with_na.fillna(mean_val)
# 3. 统计特性对比
def stats_report(s, name):
return {
"数据集": name,
"样本量": len(s),
"缺失值数": int(s.isna().sum()),
"均值": round(s.mean(), 6),
"标准差": round(s.std(), 6),
"偏度": round(stats.skew(s.dropna()), 4),
"峰度": round(stats.kurtosis(s.dropna()), 4)
}
df_compare = pd.DataFrame([
stats_report(returns_with_na, "插补前(含缺失)"),
stats_report(returns_imputed, "插补后")
])
# 4. 正态性检验(插补前后对比)
_, p_before = stats.shapiro(returns_with_na.dropna())
_, p_after = stats.shapiro(returns_imputed)
df_compare["Shapiro-p值"] = [round(p_before, 4), round(p_after, 4)]
print("=== 插补前后统计特性对比 ===")
print(df_compare.to_string(index=False))
# 5. 验证:插补后无缺失且均值等于原序列均值
assert returns_imputed.isna().sum() == 0, "插补后仍有缺失值"
assert abs(returns_imputed.mean() - mean_val) < 1e-10, "插补后均值应等于插补值"
print("\n验证通过:插补后无缺失,均值等于插补所用均值。")
运行方式
将代码保存为mean_imputation.py,在终端执行:
python mean_imputation.py
验证方法与判定标准
- 缺失值清零:程序断言插补后
isna().sum()==0,通过即说明填充完整。 - 均值保持:插补后序列均值应严格等于插补所用均值(断言误差<1e-10),验证插补逻辑正确。
- 统计特性变化观察:对比输出表中插补前后标准差、偏度、峰度及Shapiro检验p值。由于缺失值被替换为均值,插补后标准差通常会减小(本例中因缺失比例10%,标准差下降约5%~10%),偏度值可能降低,Shapiro p值变化反映分布偏离正态的程度。若p值<0.05则拒绝正态性假设。
预期输出示例(基于固定随机种子,结果可复现):
=== 插补前后统计特性对比 ===
数据集 样本量 缺失值数 均值 标准差 偏度 峰度 Shapiro-p值
插补前(含缺失) 200 20 0.000drawn 0.0198 -0.1234 -0.2345 0.4567
插补后 200 0 0.000drawn 0.0189 -0.0987 -0.1876 0.5123
验证通过:插补后无缺失,均值等于插补所用均值。
实际数值以运行输出为准,上述仅为格式示例。判定通过条件:程序无异常退出,断言全部通过,且对比表中插补后标准差小于插补前(因缺失值被均值替代,方差被压缩),Shapiro p值变化不超过0.1(若原数据接近正态)。
常见问题
- 均值插补的适用性:本例仅用于教学演示。实际金融收益率序列常存在波动率聚集和尖峰厚尾,均值插补会低估波动率并扭曲相关性,应优先考虑时间序列插补(如前向填充、线性插值)或模型方法。
- 缺失比例影响:当缺失率超过20%时,均值插补会严重压缩方差,导致后续风险度量(如VaR)失真。建议结合缺失机制(MCAR/MAR/MNAR)选择方法。