4. 策略组合构建

单策略回测再漂亮,也只是一个“样本内的故事”。真实资金管理面对的是策略失效、风格切换与回撤叠加,因此需要把多个策略组合起来,用分散化换取更稳定的风险收益特征。本节围绕四个问题展开:为什么要组合、如何度量策略之间的相关性、权重怎么分配、以及组合后如何再平衡。

一、多策略组合的动机:从“单点押注”到“风险预算”

多策略组合的核心动机不是“多买几个策略”,而是通过低相关或负相关的收益流,降低组合整体波动与最大回撤,提高夏普比率和Calmar比率。常见动机包括:

  • 分散风险:趋势策略在震荡市亏损,而均值回归策略在震荡市盈利,两者叠加可平滑净值曲线。
  • 应对失效:单一策略可能因市场结构变化而失效,组合中其他策略可提供缓冲。
  • 容量管理:不同策略的资金容量不同,组合可把大资金分散到多个容量池。
  • 收益来源多元化:把Alpha来源从“一个因子”扩展为“多个逻辑”,降低对单一假设的依赖。
组合的数学本质:若两个策略收益分别为 r1、r2,权重 w1、w2,则组合方差为 w1²σ1² + w2²σ2² + 2w1w2ρσ1σ2。当相关系数 ρ 越低,组合方差越小,这就是分散化收益的来源。

二、策略相关性分析:先看收益,再看回撤

相关性分析是组合构建的“体检”。常用方法包括皮尔逊相关系数、斯皮尔曼秩相关、滚动窗口相关以及回撤同步性分析。皮尔逊相关对线性关系敏感,斯皮尔曼对非线性单调关系更稳健;滚动相关能揭示相关性是否随时间漂移。

实操中建议按以下流程执行:

  1. 对齐各策略的日频或周频收益序列,处理缺失值与停牌日。
  2. 计算全样本相关矩阵,并绘制热力图观察聚类结构。
  3. 计算滚动60日或120日相关,识别相关性突变区间。
  4. 结合回撤重叠度:若两个策略最大回撤区间高度重叠,即使相关系数不高,也需警惕。
  5. 剔除或降权高度相关的策略,保留边际分散化贡献最大的策略。
import pandas as pd
import numpy as np

# returns: DataFrame, index=date, columns=strategy
corr = returns.corr(method='pearson')
roll_corr = returns['S1'].rolling(60).corr(returns['S2'])

# 边际分散化贡献:加入新策略后组合波动下降幅度
def marginal_diversification(returns, weights, new_col):
    base_var = np.dot(weights, np.dot(returns.cov(), weights))
    new_returns = returns.copy()
    new_weights = np.append(weights * 0.9, 0.1)
    new_var = np.dot(new_weights, np.dot(new_returns.cov(), new_weights))
    return base_var - new_var

三、权重分配方法:从等权到风险平价

权重分配决定了组合的风险暴露结构。常见方法有:

  • 等权:简单稳健,适合策略数量少、相关性低的场景,但未考虑波动差异。
  • 波动率倒数:按 1/σ 分配,使各策略风险贡献接近,但对相关性不敏感。
  • 风险平价:使每个策略对组合风险的边际贡献相等,需数值优化求解。
  • 均值-方差优化:理论最优,但对预期收益估计误差极敏感,易产生极端权重。
  • 层次风险平价:先聚类再分配,适合策略数量多、相关矩阵不稳定的场景。
方法核心思想优点局限
等权每个策略相同权重简单、无估计误差忽略波动与相关性
波动率倒数权重与波动成反比风险贡献较均衡未考虑相关性
风险平价边际风险贡献相等风险分散好需优化、对协方差敏感
均值-方差最大化夏普比率理论最优估计误差大、权重极端
层次风险平价聚类后分层分配稳健、可解释实现复杂
实战建议:先用等权或波动率倒数作为基准,再用风险平价做对比。若风险平价相对等权的夏普提升不足0.1,优先选择等权,因为其换手更低、可解释性更强。

四、再平衡规则:频率、阈值与成本控制

再平衡是组合从“静态配置”走向“动态管理”的关键。常见规则包括日历再平衡(月度、季度)、阈值再平衡(偏离目标权重超过5%触发)以及两者结合。再平衡频率越高,组合越贴近目标风险,但交易成本也越高。

设计再平衡规则时需考虑:

  • 换手成本:佣金、滑点、冲击成本,尤其对小资金高频再平衡影响显著。
  • 税收与摩擦:不同账户类型下资本利得税差异。
  • 信号衰减:若策略信号本身更新慢,高频再平衡无意义。
  • 缓冲带:设置权重偏离容忍区间,减少无效交易。
# 阈值再平衡示例
target = {'S1': 0.4, 'S2': 0.3, 'S3': 0.3}
threshold = 0.05

def rebalance(current_weights, target, threshold):
    trades = {}
    for k, w in target.items():
        drift = current_weights.get(k, 0) - w
        if abs(drift) > threshold:
            trades[k] = w - current_weights.get(k, 0)
    return trades
常见误区:把再平衡当成“择时”。再平衡的目的是控制风险偏离,不是预测市场方向。若在再平衡中叠加主观择时,容易破坏组合的分散化逻辑,导致风险集中。

五、案例与复盘:一个三策略组合的构建过程

假设有三个策略:趋势跟踪(S1)、均值回归(S2)、跨品种套利(S3)。全样本相关系数矩阵显示 S1 与 S2 为 -0.15,S1 与 S3 为 0.10,S2 与 S3 为 0.05,整体相关性低。采用风险平价分配权重,得到 S1=0.38、S2=0.34、S3=0.28。再平衡规则为“季度+5%阈值”。回测显示组合最大回撤从单策略的 22% 降至 11%,夏普从 0.9 提升至 1.4。

复盘要点:第一,相关性低是组合有效的必要条件,但需滚动监控;第二,风险平价在协方差估计稳定时表现好,若策略数量增加,建议改用层次风险平价;第三,再平衡阈值不宜过小,否则交易成本会吞噬分散化收益。

多策略组合构建流程 策略池 S1/S2/S3... 相关性分析 全样本+滚动 权重分配 等权/风险平价 再平衡 季度+阈值 输入 各策略收益序列 协方差矩阵 交易成本参数 处理 剔除高相关策略 风险平价优化 阈值触发再平衡 输出 组合净值曲线 风险贡献分解 换手与成本报告 关键监控指标 滚动相关性 | 风险贡献占比 | 最大回撤重叠度 | 换手率 | 夏普/Calmar | 权重偏离度

组合构建不是一次性任务,而是持续迭代的工程。把相关性分析、权重分配与再平衡规则固化为可复用的流程,才能在策略生命周期变化时快速响应,让组合始终服务于风险预算目标。