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))
一句话总结: 混合策略不是简单地把策略堆在一起。权重分配要讲科学,动态调整要讲节奏,相关性分析要讲「极端情况」,风险度量要讲「回撤深度」。这四个环节缺一不可。
好了,这一章的内容就到这儿。记住:混合策略的核心不是「多」,而是「稳」。权重、调整、相关性、风险——把这四个维度管好了,你的组合才能经得起市场的考验。