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())
多变量组合衍生流程架构图 多变量组合衍生流程架构 原始变量 A 原始变量 B 原始变量 C 组合运算层 A + B(加法) A - B(减法) A × B(乘法) A / B(除法) 衍生因子输出层 比率因子(标准化) 差分因子(动态变化) 变化率因子(加速度) 后处理:MAD截尾 / Rank标准化 / 分箱离散化 → 进入因子库或机器学习模型

4.4 实战案例:多变量组合在选股因子中的应用

以下展示一个完整的组合衍生流程,从原始数据到最终因子:

  1. 原始变量: 日收益率(ret)、日换手率(turn)、市值(mkt_cap)、账面市值比(bm)。
  2. 减法组合: 短期动量 = ret_5d - ret_20d(捕捉短期反转效应)。
  3. 除法组合: 流动性调整动量 = ret_20d / turn_20d(剔除流动性噪音的动量)。
  4. 乘法组合: 规模-价值交互 = mkt_cap × bm(捕捉小盘价值股的协同效应)。
  5. 差分组合: 换手率加速度 = 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
讲师提示:组合衍生是因子挖掘的“炼金术”,但必须警惕过拟合。建议每次组合衍生后,使用 时间序列交叉验证 检验因子的稳定性,并记录衍生逻辑对应的经济假说。无逻辑的穷举组合通常无法通过样本外测试。
差分与变化率的时间序列示意图 差分与变化率:从原始序列到动态因子 原始价格序列 时间 → 一阶差分(ΔP) 时间 → ΔP = P_t - P_{t-1}(绝对变化) ROC = ΔP / P_{t-1}(百分比变化)

4.5 组合衍生的常见陷阱与解决方案

陷阱 表现 解决方案
分母为零或负值 除法因子出现 Inf 或 NaN,或负分母导致比率含义反转 分母加极小常数(1e-8);对负分母单独处理或使用 Rank 变换
极端值放大 乘法组合产生数量级巨大的异常值,破坏模型稳定性 衍生前对原始变量进行 Winsorize(1%/99% 截尾);衍生后使用 MAD 截尾
多重共线性 组合因子与原始变量高度相关,导致回归模型系数不稳定 计算相关系数矩阵,剔除相关性 > 0.95 的冗余因子;使用 PCA 降维
未来信息泄露 差分或变化率使用了未来数据(如用 t+1 期数据计算 t 期因子) 严格使用 shift() 确保只使用历史数据;回测时使用 Expanding Window
经济含义缺失 组合运算无金融逻辑支撑,纯统计挖掘导致过拟合 每个组合因子必须记录“为什么这个运算有意义”;优先使用文献中已验证的公式
关键提醒:多变量组合衍生是因子研究中最容易“创造”大量因子的环节,但也是过拟合的重灾区。建议遵循“先有假说,后有运算”的原则,每个组合因子都应能讲出一个金融故事。在因子库中,建议为每个衍生因子添加 元数据标签(运算类型、原始变量、金融含义、创建日期),便于后续审计与归因分析。