大类ETF-DRO组合优化-不确定集、扰动逻辑优化
由bq9e696k创建,最终由bq9e696k 被浏览 12 用户
一、引言
在量化投资中,组合优化的鲁棒性直接影响策略的实战表现。近期我们对基于 Wasserstein 距离的分布式鲁棒优化(DRO)策略进行了迭代,看似细微的调整背后,其实藏着对组合稳定性和资产适配性的深度考量。下面就来详细说说第二个版本(代码 2)到底改了什么、为什么改以及如何实现的。
开头先放回测表现
二、基于 Wasserstein 距离阈值定义 “扰动分布集合”,而非单个扰动分布
简化版的DRO 常通过固定比例缩放收益率模拟扰动(如 “所有收益率乘以 1+ε”),但这种单一情景无法覆盖市场的多维不确定性。本版本 通过 Wasserstein 距离阈值定义 “合理扰动范围”,让模型考虑所有可能的不利分布。
\
- 改动对比
-
代码 1(简化版):通过
epsilon
对收益率进行固定缩放(如
shifted_dist = empirical_distributions[asset] * (1 + epsilon)
本质是 “模拟单个特定扰动分布”。
-
代码 2(升级后):将扰动定义为 “与经验分布的 Wasserstein 距离≤ε 的所有可能分布的集合”,目标函数需考虑这个集合中 “最坏情况分布” 的损失,而非单一情景。
-
- 改动原因
- 市场不确定性是多维的:收益率分布可能同时发生 “均值下移、波动率扩大、尾部变厚” 等变化,单一缩放无法覆盖(例如,2008 年金融危机中,美股不仅收益率均值转负,波动率还扩大 3 倍,尾部风险骤增)。
- Wasserstein 距离(地球移动距离)可量化两个分布的 “整体差异”(类似 “将一个分布改造成另一个的搬运成本”),基于其阈值定义的 “扰动集合” 能更全面地囊括 “合理范围内的所有不利变化”。
- 实现思路
-
在
generate_perturbed_distributions
函数中,通过
wasserstein_distance(emp_portfolio, pert_portfolio)
计算组合层面的分布差异(而非单资产距离),仅保留距离≤ε 的扰动分布。
-
目标函数中,所有满足 “距离≤ε” 的
perturbed_distributions
均被纳入考虑,优化目标变为 “最小化这些分布中最坏情况的损失”(例如,同时应对 “均值下移”“尾部加厚” 等多种不利情景)。
-
三、从 “单资产独立扰动” 升级为 “组合层面联合扰动”
单资产独立扰动会忽略资产联动风险(如股票与商品可能同时暴跌),导致对组合整体风险的低估。代码 2 通过组合层面的联合扰动建模,直接捕捉资产联动下的极端情景。
- 改动对比
-
代码 1(简化版):对每个资产的分布单独扰动(如逐个计算
shifted_dist
未考虑资产间扰动的联动性,本质是 “假设资产风险独立”。
-
代码 2(升级后):在组合收益率层面建模扰动,即先计算组合整体的收益率分布
emp_portfolio = np.dot(emp_returns, ref_weights)
再对组合分布进行联合扰动,捕捉资产间扰动的协同效应。
-
- 改动原因
- 真实市场中,资产扰动是 “联合发生” 的:例如加息周期中,股票下跌与债券收益率上行可能同步出现,单资产独立扰动会严重低估组合损失(实际组合损失 = 股票下跌损失 + 债券收益缩水损失,远大于两者独立损失的加权和)。
- 组合层面的扰动能直接反映 “资产联动下的最坏情景”,让优化结果更贴近实际风险(例如,“沪深 300 暴跌 5%+ 国债 ETF 收益缩水 2%” 的组合损失,需通过组合整体扰动才能准确计算)。
- 实现思路
-
在
generate_perturbed_distributions
函数中,先基于参考权重(如等权)计算经验组合收益率
emp_portfolio
和扰动组合收益率
pert_portfolio
再通过两者的 Wasserstein 距离校验扰动合理性
group_Wasserstein <= epsilon
-
目标函数中,直接基于扰动后的组合收益率分布
pert_portfolio
计算损失(均值损失、极端损失、分位数损失),而非先扰动单资产再合成组合风险。
-
四、扰动方式从 “简单缩放” 升级为 “均值 + 波动率 + 尾部联合扰动”
传统 DRO 的 “简单缩放” 仅能模拟收益率整体放大 / 缩小,无法区分 “均值下移”“波动扩大”“尾部变厚” 等不同风险。代码 2 通过三维扰动,更精准地刻画市场的多维不确定性。
\
- 改动对比
-
代码 1(简化版):采用 “简单缩放”
shifted_dist = empirical_distributions[asset] * (1 + epsilon)
仅能模拟收益率 “整体放大 / 缩小” 的单一情景。
-
代码 2(升级后):对收益率分布进行三维扰动:
-
均值扰动:降低收益率中枢如
mean_shifts = np.random.uniform(-epsilon, epsilon, n_assets) * emp_means
;
-
波动率扰动:扩大波动幅度(如
std_scales = np.random.uniform(1-epsilon, 1+epsilon, n_assets));
-
尾部扰动:加厚极端损失概率(如对 10% 的极端负值乘以放大系数)。
skew_scales = np.random.uniform(1-epsilon, 1+epsilon, n_assets)
-
-
- 改动原因
- 市场风险是多维的:均值下移直接降低收益,波动率扩大增加日常波动风险,尾部变厚提升黑天鹅事件损失(例如,2022 年美联储加息中,美股不仅均值下跌,波动率扩大 2 倍,且单日跌幅超 3% 的天数是往年的 3 倍)。
- 简单缩放无法区分这些风险:例如,“均值 - 5%+ 波动率 10%” 与 “均值 0%+ 波动率 15%” 是完全不同的风险结构,缩放处理会将其混为一谈。
- 实现思路
-
在
generate_perturbed_distributions
函数中,分三步生成扰动分布:
-
均值扰动:对每个资产的收益率序列叠加向下的随机偏移
shifted = empirical_data[i] + mean_shifts[i]
;
-
波动率扰动:对偏移后的序列进行缩放,扩大波动幅度
scaled = (shifted - np.mean(shifted)) * std_scales[i] + np.mean(shifted)
;
-
尾部扰动:对 10% 的极端负值放大
lower_tail = sorted_data[:int(n*0.1)] * (1 + tail_weight * 0.5)
,模拟黑天鹅风险。
-
-
五、优化对比
5.1 同配置、相同标的池子 2015年股灾表现对比
优化前:
优化后:
以2015年的股灾极端情况作为例子分析,优化后的组合优化表现有一定提升,最大回撤从11.12%降低为9.78%
六、资金池更新
初版:
新版:
七、策略链接
https://bigquant.com/square/ai/f65b4897-d76e-fbcd-946f-f875881d3955