4. 多变量组合衍生:加减乘除组合、比率构建、差分与变化率
单变量衍生只能捕捉个体特征,而多变量组合衍生通过变量间的代数运算,揭示资产间的相对强弱、价差结构、动量加速度与风险调整后的收益特征。本节将系统讲解加减乘除组合、比率构建以及差分与变化率三大类方法,并给出实战中的避坑指南。
核心原则:组合衍生不是盲目穷举,而是基于金融逻辑(如无套利、风险溢价、均值回复)构造有经济含义的因子。每新增一个组合特征,都应能解释“为什么这个运算能捕捉到新的风险或收益维度”。
4.1 加减乘除组合:基础代数运算的因子含义
四则运算是最直观的组合方式,但不同运算对应不同的市场行为假设:
| 运算 | 典型公式 | 金融含义 | 常见应用场景 |
|---|---|---|---|
| 加法 | X + Y |
综合得分、总规模、总风险暴露 | 市值 + 账面价值 → 综合规模因子;动量 + 质量 → 复合选股得分 |
| 减法 | X - Y |
价差、偏离度、套利空间 | 短期均线 - 长期均线 → 价格动量;行业收益率 - 市场收益率 → 行业超额 |
| 乘法 | X × Y |
交互效应、协同放大、风险乘积 | 波动率 × 换手率 → 流动性风险交互;Beta × 市场收益 → 系统风险贡献 |
| 除法 | X / Y |
比率、标准化、效率度量 | 净利润 / 营收 → 利润率;市值 / 账面价值 → 估值倍数 |
实战避坑:除法运算需警惕分母接近零或为负的情况。建议在分母绝对值小于阈值(如 1e-6)时填充为 NaN 或使用 Winsorize 处理。乘法运算容易放大异常值,衍生后应配合分箱或截尾处理。
4.2 比率构建:标准化与相对价值度量
比率是量化金融中最常用的组合衍生方式,其核心价值在于消除规模效应,使不同量纲的资产具有可比性。常见的比率构建分为三类:
- 财务比率:PE(市值/净利润)、PB(市值/净资产)、ROE(净利润/股东权益)、Debt/Equity(负债/权益)。这些因子直接反映公司基本面的相对估值与盈利能力。
- 市场比率:换手率(成交量/流通股本)、Amihud非流动性指标(日收益率绝对值/日成交额)、相对强弱指标RSI(平均上涨幅度/平均下跌幅度)。
- 风险调整比率:夏普比率(超额收益/波动率)、信息比率(主动收益/跟踪误差)、Calmar比率(年化收益/最大回撤)。
# Python 示例:构建风险调整后的动量因子
import pandas as pd
import numpy as np
def build_risk_adjusted_momentum(returns, window=21):
"""
构建夏普比率类动量因子:过去 window 天的平均收益 / 收益波动率
"""
mean_ret = returns.rolling(window).mean()
std_ret = returns.rolling(window).std()
# 避免除零:波动率极小值替换
std_ret = std_ret.replace(0, np.nan)
sharpe_momentum = mean_ret / std_ret
return sharpe_momentum
# 示例数据
dates = pd.date_range('2023-01-01', periods=500, freq='D')
returns = pd.Series(np.random.randn(500) * 0.02, index=dates)
factor = build_risk_adjusted_momentum(returns)
print(factor.tail())
注意:比率因子的分布通常呈现厚尾或偏态特征。例如 PE 因子在亏损公司处为负值,且可能出现极端大值。建议在比率构建后,对因子进行 MAD(中位数绝对偏差)截尾 或 Rank 标准化,再进入后续建模。
4.3 差分与变化率:捕捉动态趋势与加速度
差分和变化率用于从时间序列中提取动态信息,是动量、反转和趋势因子的基础。根据金融数据的特点,通常分为以下三种形式:
| 类型 | 公式 | 含义 | 适用场景 |
|---|---|---|---|
| 一阶差分 | ΔX = X_t - X_{t-1} |
绝对变化量,反映短期变动幅度 | 价格变化、持仓变化、流动性变化 |
| 对数差分 | ΔlnX = ln(X_t) - ln(X_{t-1}) |
连续复利收益率,近似百分比变化 | 收益率计算、波动率建模、平稳化处理 |
| 变化率 | (X_t - X_{t-1}) / X_{t-1} |
百分比变化,直观反映增长/衰减速度 | 营收增长率、利润增长率、市值增长率 |
更高级的衍生包括 二阶差分(变化率的变化率,即加速度)和 多期差分(如 5 日、20 日变化率),用于捕捉趋势的拐点和持续性。
# Python 示例:多周期变化率与加速度因子
def multi_period_roc(series, periods=[5, 10, 20]):
"""生成多周期变化率因子"""
roc_dict = {}
for p in periods:
roc_dict[f'roc_{p}d'] = series.pct_change(periods=p)
return pd.DataFrame(roc_dict)
def acceleration(series, short=5, long=20):
"""加速度 = 短期变化率 - 长期变化率(类似MACD思想)"""
roc_short = series.pct_change(short)
roc_long = series.pct_change(long)
return roc_short - roc_long
# 示例:使用收盘价序列
price = pd.Series(np.cumprod(1 + np.random.randn(200) * 0.01) * 100,
index=pd.date_range('2023-01-01', periods=200))
roc_features = multi_period_roc(price, periods=[5, 20, 60])
accel = acceleration(price, short=5, long=20)
print(roc_features.head())
print(accel.head())
4.4 实战案例:多变量组合在选股因子中的应用
以下展示一个完整的组合衍生流程,从原始数据到最终因子:
- 原始变量: 日收益率(ret)、日换手率(turn)、市值(mkt_cap)、账面市值比(bm)。
- 减法组合: 短期动量 = ret_5d - ret_20d(捕捉短期反转效应)。
- 除法组合: 流动性调整动量 = ret_20d / turn_20d(剔除流动性噪音的动量)。
- 乘法组合: 规模-价值交互 = mkt_cap × bm(捕捉小盘价值股的协同效应)。
- 差分组合: 换手率加速度 = turn_5d - turn_10d(识别资金流入/流出的加速信号)。
# 完整组合衍生示例
def multi_variate_combination(df):
"""
df 需包含列:ret_5d, ret_20d, turn_5d, turn_20d, mkt_cap, bm
返回衍生因子 DataFrame
"""
factors = pd.DataFrame(index=df.index)
# 减法:短期动量反转
factors['momentum_reversal'] = df['ret_5d'] - df['ret_20d']
# 除法:流动性调整动量
factors['liq_adj_momentum'] = df['ret_20d'] / (df['turn_20d'] + 1e-8)
# 乘法:规模-价值交互
factors['size_value_interact'] = df['mkt_cap'] * df['bm']
# 差分:换手率加速度
factors['turn_acceleration'] = df['turn_5d'] - df['turn_10d']
# 后处理:MAD截尾(3倍中位数绝对偏差)
for col in factors.columns:
median = factors[col].median()
mad = (factors[col] - median).abs().median()
upper = median + 3 * mad
lower = median - 3 * mad
factors[col] = factors[col].clip(lower, upper)
return factors
讲师提示:组合衍生是因子挖掘的“炼金术”,但必须警惕过拟合。建议每次组合衍生后,使用 时间序列交叉验证 检验因子的稳定性,并记录衍生逻辑对应的经济假说。无逻辑的穷举组合通常无法通过样本外测试。
4.5 组合衍生的常见陷阱与解决方案
| 陷阱 | 表现 | 解决方案 |
|---|---|---|
| 分母为零或负值 | 除法因子出现 Inf 或 NaN,或负分母导致比率含义反转 | 分母加极小常数(1e-8);对负分母单独处理或使用 Rank 变换 |
| 极端值放大 | 乘法组合产生数量级巨大的异常值,破坏模型稳定性 | 衍生前对原始变量进行 Winsorize(1%/99% 截尾);衍生后使用 MAD 截尾 |
| 多重共线性 | 组合因子与原始变量高度相关,导致回归模型系数不稳定 | 计算相关系数矩阵,剔除相关性 > 0.95 的冗余因子;使用 PCA 降维 |
| 未来信息泄露 | 差分或变化率使用了未来数据(如用 t+1 期数据计算 t 期因子) | 严格使用 shift() 确保只使用历史数据;回测时使用 Expanding Window |
| 经济含义缺失 | 组合运算无金融逻辑支撑,纯统计挖掘导致过拟合 | 每个组合因子必须记录“为什么这个运算有意义”;优先使用文献中已验证的公式 |
关键提醒:多变量组合衍生是因子研究中最容易“创造”大量因子的环节,但也是过拟合的重灾区。建议遵循“先有假说,后有运算”的原则,每个组合因子都应能讲出一个金融故事。在因子库中,建议为每个衍生因子添加 元数据标签(运算类型、原始变量、金融含义、创建日期),便于后续审计与归因分析。