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)选择方法。