3. 收益率计算:简单收益率、对数收益率、超额收益率、累计收益率的计算与特征提取

收益率是量化风险归因中最基础的输入变量。不同的收益率定义对应不同的统计假设与计算场景,在特征工程阶段需要根据模型目标选择正确的收益率口径,并提取其分布特征与时间序列特征。

3.1 四种收益率定义与适用场景

收益率类型 计算公式 统计假设 典型应用场景
简单收益率 Rt = (Pt − Pt−1) / Pt−1 线性加总,多期累加不精确 单期绩效归因、组合权重调整
对数收益率 rt = ln(Pt / Pt−1) 时间可加性,近似正态分布 风险模型、波动率估计、回测
超额收益率 ERt = Rt − Rf,t 剥离无风险收益,聚焦主动风险 Alpha 剥离、因子模型残差
累计收益率 CRT = ∏(1+Rt) − 1 复利效应,路径依赖 净值曲线、最大回撤、持有期收益
特征工程要点: 对数收益率在时间序列建模中具有对称性与可加性优势,是风险归因训练集的标准输入;超额收益率用于剥离市场因子后的残差分析;累计收益率用于构造回撤类与路径依赖类特征。

3.2 收益率计算流程与特征提取

以下代码展示了从价格序列到四种收益率的完整计算流程,并提取关键统计特征:

import numpy as np
import pandas as pd

# 模拟价格序列
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=252, freq='D')
prices = 100 * np.exp(np.cumsum(np.random.normal(0.0005, 0.015, 252)))
df = pd.DataFrame({'price': prices}, index=dates)

# 1. 简单收益率
df['simple_ret'] = df['price'].pct_change()

# 2. 对数收益率
df['log_ret'] = np.log(df['price'] / df['price'].shift(1))

# 3. 超额收益率(假设无风险利率年化3%)
rf_daily = 0.03 / 252
df['excess_ret'] = df['simple_ret'] - rf_daily

# 4. 累计收益率
df['cum_ret'] = (1 + df['simple_ret']).cumprod() - 1

# 特征提取:滚动窗口统计
window = 20
features = pd.DataFrame(index=df.index)
features['ret_mean'] = df['log_ret'].rolling(window).mean()
features['ret_std'] = df['log_ret'].rolling(window).std()
features['ret_skew'] = df['log_ret'].rolling(window).skew()
features['ret_kurt'] = df['log_ret'].rolling(window).kurt()
features['cum_max'] = df['cum_ret'].rolling(window).max()
features['drawdown'] = df['cum_ret'] - features['cum_max']

3.3 收益率特征提取清单

在构建风险归因训练集时,建议从以下维度提取收益率特征:

  • 集中趋势特征: 滚动均值、加权均值(指数衰减权重)
  • 离散度特征: 滚动标准差、半标准差(仅负收益)、下行波动率
  • 分布形态特征: 偏度、峰度、Jarque-Bera 统计量
  • 尾部风险特征: VaR (95%/99%)、CVaR、最大回撤、回撤持续时间
  • 自相关特征: 滞后1/5/20期自相关系数、Ljung-Box Q 统计量
  • 相对强度特征: 滚动夏普比率、信息比率、超额收益均值
实践建议: 对数收益率的偏度与峰度对尾部风险敏感,建议在特征工程中同时保留原始收益率与去偏度/去峰度后的标准化收益率,以增强模型对极端行情的泛化能力。

3.4 收益率特征与风险归因的映射关系

收益率特征 → 风险归因映射 简单收益率 对数收益率 超额收益率 累计收益率 特征提取层 滚动均值 | 滚动标准差 | 偏度 | 峰度 | VaR | CVaR | 自相关系数 | 夏普比率 最大回撤 | 回撤持续时间 | 下行波动率 | 半标准差 | 指数加权均值 因子暴露归因 风险预算分解 尾部风险归因 组合风险归因训练集(特征矩阵 + 标签)

3.5 收益率特征工程避坑指南

常见错误:
  • 收益率口径混用: 在同一个模型中混合使用简单收益率与对数收益率,导致方差估计偏差。
  • 前视偏差: 使用未来信息计算滚动特征(如用未来窗口的均值填充当前缺失值)。
  • 忽略无风险利率变化: 超额收益率计算中使用固定无风险利率,忽略期限结构变化。
  • 累计收益率路径依赖: 在横截面比较中使用不同起始点的累计收益率,导致不可比。

在构建风险归因训练集时,建议统一使用对数收益率作为主特征,超额收益率用于因子模型残差分析,累计收益率仅用于构造回撤类与路径依赖类特征。所有滚动特征必须使用严格的时间序列交叉验证,避免数据泄露。