3. 收益率口径详解:绝对收益率、对数收益率、超额收益率、累计收益率
在量化回测中,收益率的口径选择直接影响标签的分布形态、统计推断的有效性以及模型训练的目标设定。不同口径的收益率适用于不同的分析场景,混淆使用会导致回测结果失真。本节将系统梳理四种核心收益率口径的定义、计算公式、适用场景及相互转换关系。
3.1 四种收益率口径对比
| 口径 | 定义 | 计算公式 | 取值范围 | 核心特性 |
|---|---|---|---|---|
| 绝对收益率 | 资产价格变动的百分比 | \( R_{abs} = \frac{P_t - P_{t-1}}{P_{t-1}} \) | [-1, +∞) | 直观,可解释性强,但分布右偏 |
| 对数收益率 | 价格取自然对数后的差分 | \( R_{log} = \ln(P_t) - \ln(P_{t-1}) \) | (-∞, +∞) | 时间可加性,近似正态分布 |
| 超额收益率 | 资产收益率减去无风险利率 | \( R_{ex} = R_{asset} - R_f \) | (-∞, +∞) | 剥离资金成本,衡量主动收益 |
| 累计收益率 | 多期收益率的复合乘积 | \( R_{cum} = \prod_{i=1}^{n}(1+R_i) - 1 \) | [-1, +∞) | 反映真实财富变化,不可直接加总 |
关键提示:在回测标签构建中,对数收益率是机器学习模型的首选输入口径,因其统计特性更接近正态分布,有利于梯度下降和损失函数收敛;而累计收益率常用于最终绩效评估和资金曲线绘制。
3.2 绝对收益率与对数收益率:核心差异与转换
绝对收益率(简单收益率)和对数收益率是量化分析中最基础的两种口径,二者之间存在明确的数学转换关系,但在统计特性和应用场景上有本质区别。
3.2.1 数学转换关系
# 绝对收益率 → 对数收益率
R_log = np.log(1 + R_abs)
# 对数收益率 → 绝对收益率
R_abs = np.exp(R_log) - 1
# 多期转换(假设收益率较小)
R_abs ≈ R_log + 0.5 * R_log^2 # 二阶泰勒展开近似
3.2.2 统计特性对比
| 特性 | 绝对收益率 | 对数收益率 |
|---|---|---|
| 分布形态 | 右偏,下限-1,上限无界 | 近似对称,接近正态分布 |
| 时间可加性 | 不可直接相加(需复利) | 可直接相加(对数差分) |
| 横截面可加性 | 可加权平均(组合收益) | 不可直接加权平均 |
| 小收益率近似 | 与对数收益率接近 | 与绝对收益率接近 |
| 极端值影响 | 对暴跌敏感(-100%封顶) | 对暴涨暴跌均敏感 |
模型训练建议:当收益率绝对值小于5%时,绝对收益率与对数收益率差异可忽略;当日收益率超过10%(如加密货币、杠杆ETF),必须使用对数收益率以避免标签分布严重偏态。
3.3 超额收益率:剥离无风险收益
超额收益率是资产收益率与无风险利率之间的差值,用于衡量投资组合或策略相对于无风险资产的主动收益。在回测标签构建中,超额收益率是评估策略α能力的关键口径。
3.3.1 计算方式
# 日频超额收益率
R_excess_daily = R_asset_daily - R_f_daily
# 年化超额收益率(CAPM框架)
R_excess_annual = (R_asset_annual - R_f_annual)
# 使用对数收益率的超额计算(推荐)
R_excess_log = R_log_asset - R_log_f
3.3.2 无风险利率选择标准
| 市场 | 常用无风险利率代理 | 频率 | 注意事项 |
|---|---|---|---|
| A股 | SHIBOR 隔夜 / 国债回购利率 | 日频 | 注意节假日调整 |
| 美股 | US Treasury Bill 3个月 | 日频 | 使用插值获取日频数据 |
| 加密货币 | USDT 借贷利率 / 0(无风险) | 日频 | 市场无统一标准,建议注明假设 |
| 期货 | 保证金利率 / 国债利率 | 日频 | 考虑保证金占用成本 |
常见陷阱:在回测中直接使用资产绝对收益率作为标签,而未扣除无风险利率,会导致模型在高利率环境下高估策略表现。建议在构建分类标签(涨/跌)时,使用超额收益率的符号作为类别依据。
3.4 累计收益率:真实财富变化曲线
累计收益率反映从初始时刻到当前时刻的总收益,是回测绩效评估的最终输出口径。与单期收益率不同,累计收益率通过复利计算,真实反映资金的时间价值。
3.4.1 累计收益率计算
import numpy as np
# 方法1:从绝对收益率序列计算
def cumulative_return(returns_abs):
"""returns_abs: 绝对收益率序列(小数形式)"""
cum_ret = np.cumprod(1 + np.array(returns_abs)) - 1
return cum_ret
# 方法2:从对数收益率序列计算
def cumulative_return_from_log(log_returns):
"""log_returns: 对数收益率序列"""
cum_ret = np.exp(np.cumsum(log_returns)) - 1
return cum_ret
# 示例
daily_returns = [0.01, -0.005, 0.02, 0.015, -0.01]
cum_ret = cumulative_return(daily_returns)
print(f"累计收益率: {cum_ret[-1]:.4f}") # 输出: 0.0301
3.4.2 累计收益率 vs 平均收益率
| 指标 | 计算方式 | 适用场景 | 局限性 |
|---|---|---|---|
| 累计收益率 | 复利乘积 | 资金曲线、绩效归因 | 受初始时间点影响大 |
| 算术平均收益率 | 单期收益率简单平均 | 单期收益估计 | 忽略复利效应,高估收益 |
| 几何平均收益率 | 累计收益率的年化 | 年化收益比较 | 计算复杂,需多期数据 |
3.5 回测标签口径选择策略
在回测标签构建中,收益率口径的选择需要根据模型类型、预测目标和数据频率综合决策。以下给出不同场景下的推荐口径:
| 模型类型 | 预测目标 | 推荐收益率口径 | 理由 |
|---|---|---|---|
| 回归模型 | 预测收益率大小 | 对数收益率(标准化) | 分布对称,利于MSE损失 |
| 二分类模型 | 预测涨/跌方向 | 超额收益率(符号) | 剥离无风险收益,聚焦α |
| 多分类模型 | 预测收益区间 | 绝对收益率(分箱) | 分箱边界直观可解释 |
| 时序模型 | 预测多期收益 | 累计对数收益率 | 时间可加性,便于序列建模 |
| 强化学习 | 优化累计回报 | 累计收益率(折扣) | 与奖励函数设计一致 |
最佳实践:在回测框架中,建议同时保留绝对收益率和对数收益率两个字段。绝对收益率用于组合权重计算和绩效展示,对数收益率用于模型训练和统计检验。超额收益率应在模型训练前动态计算,避免使用固定无风险利率导致标签偏移。
3.6 常见口径错误与修正
- 混淆绝对收益率与对数收益率的可加性:将多期绝对收益率直接相加计算累计收益,导致结果偏差。修正:使用
np.cumprod(1 + R_abs) - 1或np.exp(np.cumsum(R_log)) - 1。 - 超额收益率中无风险利率频率不匹配:使用年化无风险利率直接减去日频资产收益率。修正:将无风险利率按交易日换算为日频:
R_f_daily = (1 + R_f_annual)^(1/252) - 1。 - 累计收益率回填时忽略分红和拆股:使用复权价格计算收益率时,需确认是前复权还是后复权,不同复权方式影响累计收益率的绝对值。
- 对数收益率在组合层面错误加权:组合的对数收益率不等于成分对数收益率的加权平均。修正:先计算组合的绝对收益率,再转换为对数收益率。
# 错误示例:组合对数收益率直接加权
# 错误:portfolio_log_return = w1 * log_r1 + w2 * log_r2
# 正确做法:
portfolio_abs_return = w1 * (np.exp(log_r1) - 1) + w2 * (np.exp(log_r2) - 1)
portfolio_log_return = np.log(1 + portfolio_abs_return)
模型训练警告:当使用绝对收益率作为回归标签时,若数据包含极端值(如单日涨幅超过20%),建议进行截尾处理(winsorize)或使用Huber损失函数,避免异常值主导梯度更新。对数收益率天然对极端值有压缩作用,是更稳健的选择。