传统资产配置里,比较两个资产「像不像」几乎只看两个数字:预期收益 μ 和波动率 σ。但 μ 和 σ 是压缩到一阶、二阶矩的摘要——两个资产完全可以 μ 相同、σ 相同,收益分布却一个是对称的、一个是左肥尾的、一个带周期性跳变。用 μ/σ 做配置,等于逼着模型只比较两个分布的「平均值和胖瘦」,看不到「形状」。
本文聊一个从最优传输(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 天然「惩罚」那种靠一次性外生事件撑起来的、不可持续的收益。
import numpy as np
def wasserstein1(x, y):
"""1-Wasserstein 距离:排序后经验 CDF 之差的均值(Earth Mover's Distance)。"""
x = np.sort(x); y = np.sort(y)
n = max(len(x), len(y))
xs = np.interp(np.linspace(0, 1, n), np.linspace(0, 1, len(x)), x)
ys = np.interp(np.linspace(0, 1, n), np.linspace(0, 1, len(y)), y)
return float(np.mean(np.abs(xs - ys)))
def soft_alloc(w, beta):
"""softmax(−β·w):离标杆越近(w 越小)权重越大;β 控制集中度。"""
z = -beta * np.asarray(w, float)
z -= z.max()
e = np.exp(z)
return e / e.sum()python这里 W1 用排序后的经验分布做线性插值再求逐点差均值,是 1-Wasserstein 的标准闭式近似(等价于两个经验 CDF 之差的 L1 范数),不需要解线性规划、跑得快。
二、数据:人工埋一个「样本内幸运」陷阱#
5 个资产的日收益:asset0 是「质量标杆」(μ 最高、σ 适中),asset1~asset3 是普通资产,asset4 我们故意在样本内前 500 天注入一串正向外生跳点(均值 +6%、概率 10%),样本外 500 天不再注入。
T, INS, N = 1000, 500, 5
rng = np.random.default_rng(20260714)
mu = np.array([0.0007, 0.0003, 0.0004, 0.0002, -0.0002])
sig = np.array([0.0080, 0.0100, 0.0120, 0.0090, 0.0090])
R = np.zeros((T, N))
for i in range(N):
R[:, i] = rng.normal(mu[i], sig[i], T)
# 仅在样本内给 asset4 注入正向外生跳点(幸运肥尾),样本外消失
spike_mask = (np.arange(T) < INS) & (rng.random(T) < 0.10)
R[spike_mask, 4] += rng.normal(0.060, 0.020, spike_mask.sum())
Rin, Roos = R[:INS], R[INS:]
target = Rin[:, 0] # 标杆 = asset0 样本内分布
W1 = np.array([wasserstein1(Rin[:, i], target) for i in range(N)])
w_ot = soft_alloc(W1, beta=300.0) # OT 软分配
w_mean = softmax(Rin.mean(0) * 4000.0) # 均值贪婪(对比组)
w_equal = np.ones(N) / Npython样本内各资产特征(注意 asset4 被肥尾抬高):
| 资产 | 样本内日均收益 | 样本内 Sharpe |
|---|---|---|
| asset0 质量标杆 | +0.0008 | 1.48 |
| asset1 低波稳健 | −0.0004 | −0.69 |
| asset2 均衡 | +0.0011 | 1.42 |
| asset3 低收益 | +0.0003 | 0.52 |
| asset4 样本内肥尾 | +0.0050 | 3.92 |
asset4 样本内 Sharpe 3.92,是标杆的 2.6 倍——肉眼看就是「冠军」。但那全是样本内跳点撑的。
三、W1 距离矩阵:谁和标杆分布像#
把 5 个资产样本内分布两两算 W1,得到距离矩阵:

asset0 到自己的距离当然是 0;asset4 到 asset0 的 W1 是 0.00539,是全部资产里最大的——因为它多了一截样本内肥尾,形状离标杆最远。asset3(W1=0.00092)反而离标杆最近。这正是 OT 要抓的信号:「形状远」≈「靠外生事件撑的、不可持续」。
四、三种分配:OT 锁标杆,均值贪婪被陷阱骗走#
把 OT 分配、均值贪婪、等权三种权重摆一起:

| 资产 | OT 分配 | 均值贪婪 | 等权 |
|---|---|---|---|
| asset0 质量标杆 | 0.341 | 0.000 | 0.20 |
| asset1 低波稳健 | 0.197 | 0.000 | 0.20 |
| asset2 均衡 | 0.136 | 0.000 | 0.20 |
| asset3 低收益 | 0.259 | 0.000 | 0.20 |
| asset4 样本内肥尾 | 0.068 | 1.000 | 0.20 |
对比极其刺眼:
- 均值贪婪完全被样本内均值骗了——asset4 样本内均值最高,权重 100% 压进去;
- OT 分配看的是分布形状:asset4 的 W1 最大,被压到 6.8%;反而把权重给了分布形状最接近标杆的 asset0(34.1%) 和 asset3(25.9%)。
这就是 W1 的「形状免疫力」:它不在乎 asset4 样本内均值多高,只在乎**「你这个高是怎么来的」**——靠外生跳点堆出来的高,形状离标杆远,权重就被打下来。
五、分布叠加:OT 组合贴着标杆,避开肥尾#
把标杆分布、陷阱 asset4 分布、OT 组合 OOS 收益分布叠在一起:

asset4 的分布(橙色)明显右拖了一条肥尾——那是样本内的外生跳点。但 OT 组合(蓝线)的 OOS 收益分布几乎贴着标杆(绿),根本没有那条肥尾:因为 OT 只给了 asset4 不到 7% 的权重,它的肥尾被稀释到几乎看不见。
六、样本外:OT 完胜均值贪婪#
四种配置在样本外(asset4 跳点消失后)的累计净值:

| 配置 | 年化收益 | 年化波动 | OOS Sharpe | 年化 CVaR5% | 最大回撤 |
|---|---|---|---|---|---|
| OT 分配 | +14.5% | 7.2% | 2.03 | 1.72 | −4.6% |
| 等权 | +10.7% | 7.1% | 1.51 | 1.71 | −4.8% |
| 均值贪婪 | −10.1% | 14.0% | −0.72 | 3.66 | −35.6% |
| 样本内冠军独仓 | −10.1% | 14.0% | −0.72 | 3.66 | −35.6% |
均值贪婪把 100% 押在陷阱上,OOS 直接腰斩、回撤 −35.6%;OT 分配不仅躲过一劫,还靠「贴着标杆」拿到了 OOS Sharpe 2.03,比等权(1.51)高出 34%。差别的源头只有一个:配置依据是「分布形状」还是「样本内均值」。
七、五类真实陷阱#
- 标杆选错,全盘错:OT 是「相对标杆的形状相似度」,标杆 Q 的质量决定一切。我们选了 asset0 的真实分布当标杆——但若你用一个被样本内噪声污染的分布当标杆,OT 会把「噪声形状」当模板,权重反而追着噪声走。实盘标杆应取长期可信的核心资产/宽基指数,且最好用 walk-forward 滚动更新,别用一段特殊行情当永恒标杆。
- β 是隐形的集中度旋钮:
softmax(−β·W1)里 β 越大越集中。β=300 时 OT 把 34% 给了 asset0;β 调小会趋近等权,调大则退化为「只买离标杆最近的那一个」。β 必须样本外调参,且警惕「在同一段历史上既选 β 又评估」的双重偷看。 - W1 对样本量敏感:经验分布用排序近似,尾部只有几十个样本时,W1 的尾部距离估计很抖。日频 500 天在小样本下尾部仍然稀疏——真实资产至少用 3~5 年日频,或用月度收益补充尾部信息,否则 W1 会过度反应少数极端点。
- 只治「形状不可持续」,不治「真 alpha」:OT 的卖点是「排除靠外生事件撑的伪冠军」,但它不会主动发现真有 alpha 的资产——一个分布形状离标杆远但样本外持续赚钱的资产,OT 也会压低它权重。OT 是「稳健的被动型配置」而非「alpha 挖掘机」,别指望它替你选股。
- 合成数据局限:本面板是「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。