3、策略混合框架:多策略权重分配、动态权重调整、策略相关性分析、组合风险度量

好,咱们进入正题。策略混合,说白了就是「别把鸡蛋放在一个篮子里」。但量化交易里的「篮子」怎么分、怎么调、怎么防着它们一起摔碎,这里头门道不少。我早年自己写策略的时候,就吃过「多策略看似分散,实则一荣俱荣一损俱损」的亏。今天咱们把这四个核心模块拆开揉碎了讲。

3.1 多策略权重分配:从「拍脑袋」到「有章法」

权重分配,是混合框架的起点。你手上有三五个策略,每个策略表现不一样,怎么给它们分配资金?

最朴素的方法:等权分配。 每个策略分 1/N 的资金。简单、稳健,但说实话,有点浪费。强势策略赚了钱,弱势策略拖后腿,整体收益就被平均了。

进阶方法:基于风险贡献的分配。 我个人习惯用「风险平价」的思路——让每个策略对组合总风险的贡献度相等。举个例子:

# 假设三个策略的日收益率标准差(风险)分别为:
# 策略A: 0.02, 策略B: 0.015, 策略C: 0.025
# 目标:每个策略的风险贡献 = 总风险 / 3

import numpy as np

risks = np.array([0.02, 0.015, 0.025])
target_risk_contrib = 1.0 / 3

# 简单解法:权重与风险成反比
weights = (1.0 / risks) / np.sum(1.0 / risks)
print("风险平价权重:", weights)
# 输出示例: [0.3158, 0.4211, 0.2632]

你看,风险越大的策略(C),权重反而越小。这符合直觉——别让一个「暴脾气」的策略占了太多仓位。

核心原则: 权重分配不是看谁赚得多,而是看谁「闹腾」得厉害。波动大的策略,少给点钱。

3.2 动态权重调整:让系统「活」起来

静态权重分配完了就完事了吗?当然不是。市场在变,策略的表现也在变。你想想看,一个去年表现很好的趋势跟踪策略,今年在震荡市里可能亏成狗。这时候还给它同样的权重,不是傻吗?

我常用的方法:滚动窗口 + 绩效衰减。 具体来说:

  • 取过去 N 天(比如 60 天)的收益率数据
  • 计算每个策略的夏普比率或收益风险比
  • 给近期数据更高的权重(指数衰减)
  • 根据这个「动态评分」重新分配权重

嗯,这里要注意:调整频率不能太高。我曾经试过每天调一次权重,结果手续费和滑点把收益全吃掉了。后来我改成每周调一次,效果好了很多。

# 动态权重调整示例(伪代码)
def dynamic_weights(strategy_returns, lookback=60, decay=0.98):
    # strategy_returns: 各策略历史收益率矩阵 [天数, 策略数]
    # decay: 衰减因子,越近权重越高
    
    n_days = len(strategy_returns)
    time_weights = np.array([decay ** (n_days - i - 1) for i in range(n_days)])
    time_weights /= time_weights.sum()
    
    # 计算加权夏普
    weighted_sharpe = []
    for s in range(strategy_returns.shape[1]):
        ret = strategy_returns[:, s]
        mean_ret = np.average(ret, weights=time_weights)
        std_ret = np.sqrt(np.average((ret - mean_ret)**2, weights=time_weights))
        weighted_sharpe.append(mean_ret / std_ret if std_ret != 0 else 0)
    
    # 根据夏普分配权重
    weights = np.array(weighted_sharpe)
    weights = np.maximum(weights, 0)  # 负夏普的策略权重设为0
    return weights / weights.sum() if weights.sum() > 0 else np.ones_like(weights) / len(weights)

避坑指南: 我曾经遇到过两个策略同时「失效」,权重被动态调整到极端值(比如 90% 押在一个策略上)。后来我加了权重上下限(比如 5%~40%),防止系统过度集中。

3.3 策略相关性分析:别让「假分散」骗了你

这是最容易被忽视的一环。你以为你买了五个策略,结果它们都在做类似的事情——比如都是追涨杀跌的动量策略。市场一反转,五个策略一起亏。这叫「伪分散」。

怎么分析? 我一般看两个指标:

  • 收益率相关系数矩阵: 两两策略之间的线性相关性。超过 0.7 就要警惕了。
  • 尾部相关性: 极端行情下(比如市场大跌 5%),策略之间是否同时亏损。这个比普通相关系数更重要。

举个例子,我做过一个实盘组合,里面有两个策略:一个做商品期货的跨期套利,一个做股指期货的期现套利。平时相关系数只有 0.2,看起来挺分散。但 2015 年股灾的时候,两个策略同时因为流动性枯竭而亏损——尾部相关性高达 0.9。这就是「平时看着好,一打仗就露馅」。

策略对 普通相关系数 尾部相关系数(5%分位) 结论
策略A vs 策略B 0.15 0.10 ✅ 真分散
策略A vs 策略C 0.65 0.80 ⚠️ 伪分散,需警惕
策略B vs 策略C 0.30 0.25 ✅ 可接受

注意: 相关性是动态的。牛市里低相关的策略,熊市里可能变成高相关。建议每季度重新计算一次相关性矩阵,并剔除那些「平时低相关、极端行情高相关」的伪分散策略。

3.4 组合风险度量:别只看收益,要看「回撤有多深」

最后,我们得给整个组合算一笔「风险账」。常用的指标有:

  • 组合波动率: 各策略波动率的加权平方和,再考虑相关性。公式:σ_p = sqrt(w^T Σ w),其中 Σ 是协方差矩阵。
  • 最大回撤: 组合净值从高点跌到低点的最大幅度。我个人觉得这个比波动率更「疼」——波动大但回撤小,还能忍;回撤大,心态就崩了。
  • VaR(在险价值): 给定置信度下,未来 N 天可能的最大亏损。比如 95% VaR 是 -5%,意思是有 95% 的概率,未来一天亏损不超过 5%。

我习惯把这三个指标放在一张图上,每天监控。一旦组合波动率超过某个阈值(比如年化 20%),或者最大回撤接近历史极值,我就启动「风控模式」——降低整体仓位,或者暂停某些高风险的子策略。

# 组合风险度量示例
def portfolio_risk(weights, cov_matrix):
    # weights: 权重向量
    # cov_matrix: 策略收益率的协方差矩阵
    portfolio_var = np.dot(weights.T, np.dot(cov_matrix, weights))
    portfolio_vol = np.sqrt(portfolio_var)
    return portfolio_vol

# 假设三个策略的协方差矩阵
cov = np.array([
    [0.0004, 0.0001, 0.0002],
    [0.0001, 0.0003, 0.00015],
    [0.0002, 0.00015, 0.0005]
])
w = np.array([0.4, 0.35, 0.25])
print("组合年化波动率:", np.sqrt(252) * portfolio_risk(w, cov))

一句话总结: 混合策略不是简单地把策略堆在一起。权重分配要讲科学,动态调整要讲节奏,相关性分析要讲「极端情况」,风险度量要讲「回撤深度」。这四个环节缺一不可。

策略混合框架 多策略权重分配 动态权重调整 策略相关性分析 组合风险度量 四个模块相互关联,共同构成完整的策略混合体系

好了,这一章的内容就到这儿。记住:混合策略的核心不是「多」,而是「稳」。权重、调整、相关性、风险——把这四个维度管好了,你的组合才能经得起市场的考验。

专注资料整理