halo 的技术博客

返回

传统资产配置里,比较两个资产「像不像」几乎只看两个数字:预期收益 μ 和波动率 σ。但 μ 和 σ 是压缩到一阶、二阶矩的摘要——两个资产完全可以 μ 相同、σ 相同,收益分布却一个是对称的、一个是左肥尾的、一个带周期性跳变。用 μ/σ 做配置,等于逼着模型只比较两个分布的「平均值和胖瘦」,看不到「形状」

本文聊一个从最优传输(Optimal Transport)搬来的视角:用两个收益分布之间的 Earth Mover’s Distance——也就是 1-Wasserstein 距离(W1)——来度量「分布形状差异」,并把它直接变成配置权重。核心直觉一句话:与其赌「哪个资产未来涨最多」,不如选「收益分布形状最接近我们信任的标杆」的资产——因为分布形状比单点估计稳健得多。

我们用 5 个资产的合成日收益面板验证:把「样本内冠军(asset4)」刻意设计成一段只在样本内出现的正向外生跳点(幸运肥尾),它样本内 Sharpe 3.92,但样本外跳点消失、Sharpe 直接崩到 −0.72。均值贪婪(按样本内均值定权)把 100% 仓位压进这个陷阱,OOS 最大回撤 −35.6%;而 OT 分配只给它 6.8% 权重,OOS Sharpe 2.03,显著跑赢等权的 1.51

一、为什么 μ/σ 不够,要 W1#

均值-方差框架把每个资产压成一个点 (μ, σ)。问题是:

  • μ 是单点估计,对离群极度敏感。一个资产只要在样本内蹭了几笔大跳点,μ 就被抬高,均值贪婪会疯狂加仓——哪怕那几笔跳点是一次性的、样本外再不来。
  • σ 只管二阶矩,完全看不到偏度、峰度、跳变结构。两个 σ 相同的资产,风险性质可能天差地别。

最优传输换了个角度。把资产 i 的日收益分布记作 P_i,标杆分布记作 Q(我们选「质量标杆」asset0 的样本内分布)。W1(P_i, Q) 的物理含义是:把 P_i 的整个质量挪成 Q 的形状,最少要搬多少「质量 × 距离」。它比较的是整个分布的形状,所以:

  • 一个只在样本内多了一截正肥尾的资产,它的 W1 会显著变大(要把那截多出来的质量搬走);
  • 一个只是整体平移、形状没变的资产,W1 只反映平移量,很小。

也就是说,W1 天然「惩罚」那种靠一次性外生事件撑起来的、不可持续的收益

这里 W1 用排序后的经验分布做线性插值再求逐点差均值,是 1-Wasserstein 的标准闭式近似(等价于两个经验 CDF 之差的 L1 范数),不需要解线性规划、跑得快。

二、数据:人工埋一个「样本内幸运」陷阱#

5 个资产的日收益:asset0 是「质量标杆」(μ 最高、σ 适中),asset1~asset3 是普通资产,asset4 我们故意在样本内前 500 天注入一串正向外生跳点(均值 +6%、概率 10%),样本外 500 天不再注入。

样本内各资产特征(注意 asset4 被肥尾抬高):

资产样本内日均收益样本内 Sharpe
asset0 质量标杆+0.00081.48
asset1 低波稳健−0.0004−0.69
asset2 均衡+0.00111.42
asset3 低收益+0.00030.52
asset4 样本内肥尾+0.00503.92

asset4 样本内 Sharpe 3.92,是标杆的 2.6 倍——肉眼看就是「冠军」。但那全是样本内跳点撑的。

三、W1 距离矩阵:谁和标杆分布像#

把 5 个资产样本内分布两两算 W1,得到距离矩阵:

资产间两两 1-Wasserstein 距离:谁和谁收益分布更像

asset0 到自己的距离当然是 0;asset4 到 asset0 的 W1 是 0.00539,是全部资产里最大的——因为它多了一截样本内肥尾,形状离标杆最远。asset3(W1=0.00092)反而离标杆最近。这正是 OT 要抓的信号:「形状远」≈「靠外生事件撑的、不可持续」

四、三种分配:OT 锁标杆,均值贪婪被陷阱骗走#

把 OT 分配、均值贪婪、等权三种权重摆一起:

三种分配:OT 锁定标杆,均值贪婪被样本内肥尾(asset4)骗走权重

资产OT 分配均值贪婪等权
asset0 质量标杆0.3410.0000.20
asset1 低波稳健0.1970.0000.20
asset2 均衡0.1360.0000.20
asset3 低收益0.2590.0000.20
asset4 样本内肥尾0.0681.0000.20

对比极其刺眼:

  • 均值贪婪完全被样本内均值骗了——asset4 样本内均值最高,权重 100% 压进去;
  • OT 分配看的是分布形状:asset4 的 W1 最大,被压到 6.8%;反而把权重给了分布形状最接近标杆的 asset0(34.1%) 和 asset3(25.9%)。

这就是 W1 的「形状免疫力」:它不在乎 asset4 样本内均值多高,只在乎**「你这个高是怎么来的」**——靠外生跳点堆出来的高,形状离标杆远,权重就被打下来。

五、分布叠加:OT 组合贴着标杆,避开肥尾#

把标杆分布、陷阱 asset4 分布、OT 组合 OOS 收益分布叠在一起:

分布叠加:OT 组合 OOS 收益贴着标杆,避开了 asset4 的肥尾

asset4 的分布(橙色)明显右拖了一条肥尾——那是样本内的外生跳点。但 OT 组合(蓝线)的 OOS 收益分布几乎贴着标杆(绿),根本没有那条肥尾:因为 OT 只给了 asset4 不到 7% 的权重,它的肥尾被稀释到几乎看不见。

六、样本外:OT 完胜均值贪婪#

四种配置在样本外(asset4 跳点消失后)的累计净值:

样本外累计净值:OT 分配接近标杆,均值贪婪被陷阱拖垮

配置年化收益年化波动OOS Sharpe年化 CVaR5%最大回撤
OT 分配+14.5%7.2%2.031.72−4.6%
等权+10.7%7.1%1.511.71−4.8%
均值贪婪−10.1%14.0%−0.723.66−35.6%
样本内冠军独仓−10.1%14.0%−0.723.66−35.6%

均值贪婪把 100% 押在陷阱上,OOS 直接腰斩、回撤 −35.6%;OT 分配不仅躲过一劫,还靠「贴着标杆」拿到了 OOS Sharpe 2.03,比等权(1.51)高出 34%。差别的源头只有一个:配置依据是「分布形状」还是「样本内均值」

七、五类真实陷阱#

  1. 标杆选错,全盘错:OT 是「相对标杆的形状相似度」,标杆 Q 的质量决定一切。我们选了 asset0 的真实分布当标杆——但若你用一个被样本内噪声污染的分布当标杆,OT 会把「噪声形状」当模板,权重反而追着噪声走。实盘标杆应取长期可信的核心资产/宽基指数,且最好用 walk-forward 滚动更新,别用一段特殊行情当永恒标杆。
  2. β 是隐形的集中度旋钮softmax(−β·W1) 里 β 越大越集中。β=300 时 OT 把 34% 给了 asset0;β 调小会趋近等权,调大则退化为「只买离标杆最近的那一个」。β 必须样本外调参,且警惕「在同一段历史上既选 β 又评估」的双重偷看。
  3. W1 对样本量敏感:经验分布用排序近似,尾部只有几十个样本时,W1 的尾部距离估计很抖。日频 500 天在小样本下尾部仍然稀疏——真实资产至少用 3~5 年日频,或用月度收益补充尾部信息,否则 W1 会过度反应少数极端点。
  4. 只治「形状不可持续」,不治「真 alpha」:OT 的卖点是「排除靠外生事件撑的伪冠军」,但它不会主动发现真有 alpha 的资产——一个分布形状离标杆远但样本外持续赚钱的资产,OT 也会压低它权重。OT 是「稳健的被动型配置」而非「alpha 挖掘机」,别指望它替你选股。
  5. 合成数据局限:本面板是「4 普通 + 1 样本内肥尾」的自洽合成,只为干净演示 W1 的形状免疫力。真实资产收益有厚尾、波动聚集、相关性时变;分布距离会随 regime 漂移,OT 权重要滚动重算并监控权重 PSI,分布突变时重新审视标杆与 β。

八、结语#

最优传输给资产配置提供了一个比 μ/σ 更「看形状」的尺子:

  • W1(Earth Mover’s Distance) 比较整个分布的形状,天然惩罚「靠一次性外生事件堆出来的高收益」;
  • softmax(−β·W1) 把距离直接变成权重,离标杆分布越近权重越大,且 β 平滑可控;
  • 在我们的合成里,它把样本内「幸运肥尾」陷阱的权重从均值贪婪的 100% 压到 6.8%,OOS Sharpe 从 −0.72 拉回 2.03

和之前聊过的风险平价、最小方差、鲁棒优化放一起看:风险平价/最小方差管的是「波动与相关性」,OT 管的是「分布形状的可持续性」——它不预测方向,只筛掉「形状不可信」的资产。落地时把它当作配置层的正则项(例如和风险平价结果做凸组合),而不是独立决策,工程上最稳。

注:本文收益面板为自洽合成数据(asset4 含仅在样本内出现的外生跳点),用于演示 W1 对「形状不可持续收益」的免疫力;真实资产需 3~5 年日频、标杆取长期可信核心资产、权重滚动重算并监控 PSI。

最优传输(Wasserstein)资产配置:用 Earth Mover's Distance 把分布差异变成权重
https://blog.halo26812.eu.org/blog/optimal-transport-portfolio
Author halo
Published at 2026年7月14日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨