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 收益率特征与风险归因的映射关系
3.5 收益率特征工程避坑指南
常见错误:
- 收益率口径混用: 在同一个模型中混合使用简单收益率与对数收益率,导致方差估计偏差。
- 前视偏差: 使用未来信息计算滚动特征(如用未来窗口的均值填充当前缺失值)。
- 忽略无风险利率变化: 超额收益率计算中使用固定无风险利率,忽略期限结构变化。
- 累计收益率路径依赖: 在横截面比较中使用不同起始点的累计收益率,导致不可比。
在构建风险归因训练集时,建议统一使用对数收益率作为主特征,超额收益率用于因子模型残差分析,累计收益率仅用于构造回撤类与路径依赖类特征。所有滚动特征必须使用严格的时间序列交叉验证,避免数据泄露。