重采样效率,以 Bootstrap 方式
Michaud (1998) 和 López de Prado (2016) 的重采样效率。Bootstrap 输入、逐个优化、再求平均。一种实用的 MVO 估计误差疗法。
前面几篇文章展示了 Markowitz 不稳定性的一系列疗法:收缩、稳健优化、Black-Litterman、最小方差、CVaR。它们都有效,但都不是 Richard Michaud 提出的方案。
Michaud 1989 年的论文诊断了问题(估计误差)。他 1998 年的书 Efficient Asset Management(与 Robert Michaud 合著)提出了一个修复方案:重采样。思路在概念上很简单:对数据进行多次 bootstrap,对每个 bootstrap 样本做优化,对所得权重求平均。
这不是临时凑数的 hack,而是一种带贝叶斯色彩的处理输入不确定性的方法。每个 bootstrap 样本都是对同一潜在 的有噪声估计。对这些有噪声的最优解求平均,给出”中心”最优的更稳定估计。
本文涵盖数学(基本就是 bootstrap 和平均)、与贝叶斯推断的联系、López de Prado 2016 年的改进,以及何时重采样值得付出计算代价的实践问题。
核心流程
用样本估计的标准 MVO:
- 从历史收益计算 。
- 解 MVO 得到 。
重采样效率:
- 生成 个历史收益的 bootstrap 样本。
- 对每个 bootstrap 样本 ,计算 并解 MVO 得到 。
- 求平均:。
这就是基本流程。bootstrap 样本是”有放回”的,即从原始 个观测中有放回地抽 个。
对每个 bootstrap 样本,你得到不同的 和不同的最优权重向量 。 之间的差异反映了优化器的抽样分布。求平均给出一个方差更小的点估计。
为什么平均有效
直觉来自估计量的标准偏差-方差权衡。
每个 是”真实”最优权重 (“真实”指数据生成过程下的最优)的一个有噪声估计。bootstrap 样本是来自估计量抽样分布的独立抽样。它们的平均具有相同的期望但更小的方差。
具体地:
偏差不变(平均无法消除它)。方差缩减为 。对 ,相当于方差缩小 200 倍。
实践中,这意味着:重采样权重比朴素 MVO 权重更稳定(换手率更低、对自身的样本后跟踪误差更低)。它们也可能带来更低的收益样本外方差,但这取决于具体问题。
贝叶斯解读
平均有一种贝叶斯解读。在 上的均匀先验下,bootstrap 分布近似于数据生成参数的后验分布。每个 bootstrap 样本都是从后验中的一次抽样。
bootstrap 最优解的平均是对优化器的贝叶斯后验均值的近似:
这有时称为权重的”贝叶斯估计量”。它在平方误差下最小化后验期望损失。
这里有个微妙问题。贝叶斯最优组合(在比如均值-方差效用下)一般不等于 MVO 最优解的平均。两者只在特殊效用(风险厌恶系数为 1 的二次效用)或特定先验下才一致。Michaud 的重采样效率并不声称自己是完全贝叶斯的;它是一个实用的近似。
Michaud 的”效率”妙招
Michaud 不止于对权重求平均。他还提议对有效前沿求平均。
流程:
- 对每个 bootstrap 样本 ,计算有效前沿。
- 对平均前沿上的每一点(目标收益 ),重采样效率权重是所有以 为目标的 bootstrap 样本下的权重平均。
- 重采样效率前沿是各 bootstrap 前沿的平均。
这比对单一目标收益求平均更一般。它给出一条比任何单一 bootstrap 前沿都更平滑的完整前沿。
数学上:
这给出一条作为 函数的重采样效率前沿。实践中,算一次就可以用它来选择目标收益。
López de Prado 的改进
在 Advances in Financial Machine Learning(2018,第 16 章)以及 2016 年的一篇工作论文中,López de Prado 把 Michaud 的流程形式化,并加入了若干改进。
改进 1:基于 NumPy 的 bootstrap,关注结构性断裂。 朴素 bootstrap 假设样本独立同分布。收益存在序列相关、波动率聚集和结构性断裂。López de Prado 推荐 block bootstrap 或 stationary bootstrap 来保留部分时间序列结构。
改进 2:每个 bootstrap 内做收缩。 对每个 bootstrap 样本,在解 MVO 之前对 做 Ledoit-Wolf 收缩。这把收缩与重采样叠加,获得额外稳健性。
改进 3:按置信度加权平均。 不做等权平均,而是按每个 bootstrap 解的似然加权。 的权重正比于 ,其中 是 bootstrap 样本 对原始数据的拟合优度。
改进 4:样本外评估。 用组合式净化交叉验证(同样来自 López de Prado)来评估样本外的重采样效率。标准回测因为不考虑序列相关而高估表现。
完整的 López de Prado 流水线在 mlfinlab 中实现。约 100 行 Python 代码。
一个可运行的实现
代码层面的基本流程:
import numpy as np
from scipy.optimize import minimize
def resampled_efficiency(returns, n_bootstrap=200, target_return=0.01):
n_obs, n_assets = returns.shape
weights = np.zeros((n_bootstrap, n_assets))
for b in range(n_bootstrap):
# Bootstrap resample (with replacement)
idx = np.random.choice(n_obs, size=n_obs, replace=True)
boot = returns[idx]
mu_b = boot.mean(axis=0)
Sigma_b = np.cov(boot.T)
# Shrink Sigma for stability
Sigma_b = ledoit_wolf_shrink(boot)
# Solve MVO at target return
weights[b] = solve_mvo(mu_b, Sigma_b, target_return)
# Average across bootstraps
return weights.mean(axis=0)
对 个资产、 次 bootstrap,现代机器几秒钟跑完。对 个资产、,需要几分钟。极易并行,可以简单地跨核分配。
问题
重采样效率并不完美。三个问题。
问题 1:计算成本。 每次 bootstrap 就是一个 QP 求解。对 且频繁重新估计,成本会累加。在跨度 20 年、月度再平衡的回测中,你可能要跑 240 次重采样优化,每次 200 个 bootstrap。合计 48,000 次 QP 求解。在笔记本上要跑几个小时。
问题 2:偏差没消除。 平均降低方差但不消除偏差。如果真实 给出的权重系统性地偏离等权组合,重采样效率无法捕获。尤其是如果你的预期收益估计存在系统性偏差(这很常见;参见 Black-Litterman 那篇文章),重采样会继承这个偏差。
问题 3:bootstrap 假设。 bootstrap 假设你的历史样本能代表未来。如果未来结构性不同(状态切换、新资产类别、金融危机),bootstrap 分布就是错的。重采样效率会自信地给出错误答案。
第三点最为深刻。bootstrap 是频率派工具,它给出”在数据生成过程稳定假设下估计量的方差”。在金融中,这是一个强假设。样本外,重采样效率可能被不做此假设的简单方法压制。
与其他方法的比较
重采样效率相比替代方法表现如何?
vs. 朴素 MVO:重采样效率在样本外 Sharpe 上获胜。Michaud 原始论文在某些情况下显示年化 100-200 个基点的提升。
vs. Ledoit-Wolf 收缩:大致相当。两者都降低方差。重采样更贵但不需要选择收缩目标。
vs. Black-Litterman:目标不同。Black-Litterman 使用市场隐含先验;重采样效率使用 bootstrap 先验。Black-Litterman 允许纳入观点;重采样效率不允许。如果你有观点,Black-Litterman 更好;没有的话,两者相当。
vs. 风险平价:风险平价完全不用 。重采样效率用(通过 MVO)。风险平价对 的估计误差更稳健,但灵活性较差。
vs. 层次风险平价:HRP 不用 ,利用相关性结构进行配置。重采样效率联合使用 和 ,但不利用结构。不同问题,不同工具。
底线:重采样效率是一种体面的中等复杂度方法。比朴素 MVO 好,与收缩相当,有观点时不如 Black-Litterman,没观点时与 HRP 相当。
何时使用
粗略地说:
- 你有一个中等规模的资产集合( 到 )。
- 你对单个资产没有强烈观点。
- 你想要一个对估计误差稳健的方法。
- 你能负担计算成本。
- 你在做不允许做空的股票或均衡组合。
对没有观点层的量化多资产基金来说,这是一个不错的默认。它不适合 HFT(太慢)也不适合高度集中的选股组合(太过分散)。
理论依据
有一个潜在问题:为什么重采样有效?诚实的回答是:它在经验上有效,理论依据是局部的。
一种依据:一致性。当 且 固定时,bootstrap 分布集中在真实参数附近。所以 收敛到 (取决于 bootstrap 对真实 DGP 近似程度的偏差)。
另一种依据:通过正则化降低偏差。bootstrap 平均近似于平先验下的贝叶斯估计量。贝叶斯估计量通常比对应的频率派估计量具有更低的均方误差,特别是在有限样本下。
第三种依据(来自 López de Prado):重采样是一种元学习。通过在不同数据子集上多次求解同一问题,你学到的是优化器的结构而非任何单一样本的结构。这在精神上类似于机器学习中的 bagging。
这些都不构成完整依据。重采样效率是一个有效的启发式方法。和金融中大多数启发式方法一样,理论落后于实践。
现代视角
Michaud 的重采样效率已经在业界悄然被采用。多数大型资产管理人会跑它的某种变体,通常与其他技术结合。“重采样前沿”是机构资产配置软件(Aladdin、Axioma、BarraOne 都有变体)中的标准工具。
最常见的生产配置:重采样,然后施加组合约束(不允许做空、行业上限、换手率限制)。这就把重采样的方差缩减与约束的正则化叠加在一起。
如果你在搭建组合构造流水线,并且想要一个站得住脚的默认,重采样效率是一个合理的选择。它对任何特定问题都不是最佳,但它对很多问题都稳健。
文献综述
- Michaud (1989). “The Markowitz Optimization Enigma: Is ‘Optimized’ Optimal?” Financial Analysts Journal 45(1): 31-42. 误差放大器批评。
- Michaud & Michaud (1998). Efficient Asset Management: A Practical Guide to Stock Portfolio Optimization and Asset Allocation. Harvard Business School Press. 重采样效率方案。
- López de Prado (2016). “A Robust Estimator of the Covariance Matrix for Portfolio Construction.” Journal of Risk Model Validation 10(1): 55-72.
- López de Prado (2018). Advances in Financial Machine Learning. Wiley. 第 16 章有完整实现。ISBN: 978-1-119-48208-6.
- Scherer (2002). “Portfolio Construction with Resampled Efficient Frontiers: A Cautionary Note.” Journal of Risk 5(2): 67-78. 批评。
- Cogneau & Hübner (2009). “The (In)Famous Resampled Efficient Frontier.” Journal of Asset Management 10(1): 50-62. 另一篇批评。
- Simões, Gonçalves & Gomes (2019). “Resampled Efficient Frontier: A Comparison of Methods.” Journal of Banking and Finance 105: 169-186.
Bootstrap 分布详解
重采样效率取决于 的 bootstrap 分布。两种 bootstrap 风格。
朴素 bootstrap:从历史收益中有放回地抽样。每个样本与原始样本等长。使用样本均值和协方差作为输入。
Block bootstrap:把历史收益分成块,对块有放回抽样。每个样本保留块内的序列相关。用于具有序列依赖的时间序列。
Stationary bootstrap:block bootstrap 的变体,块长随机(几何分布)。用于具有非常数方差的时间序列。
循环 bootstrap:把时间序列首尾相接,从起点抽样,取固定长度窗口。比朴素 bootstrap 保留更多结构。
对金融收益,block bootstrap 或 stationary bootstrap 是合适的。朴素 bootstrap 破坏了真实收益的序列相关和波动率聚集。
López de Prado 的实现:
def block_bootstrap(returns, block_size=21):
"""Block bootstrap with given block size."""
T = len(returns)
n_blocks = T // block_size
samples = []
for _ in range(n_blocks):
start = np.random.randint(0, T - block_size)
samples.append(returns[start:start + block_size])
return np.vstack(samples)
这是基础的 block bootstrap。生产中,用带几何块长的 stationary bootstrap。
贝叶斯 bootstrap
频率派 bootstrap 的贝叶斯替代方案。不做有放回的重抽样,而是给每个历史观测分配一个 Dirichlet 分布的权重:
“合成”样本均值是 ,“合成”协方差是 。
贝叶斯 bootstrap 比频率派 bootstrap 具有更好的频率派性质。它对抽样分布给出更平滑的估计。
对重采样效率,贝叶斯 bootstrap 可以替代频率派 bootstrap。数学相似,但所得权重更平滑。
与 Bagging 的联系
重采样效率本质上是 bagging(bootstrap aggregating)应用于 MVO。在机器学习中,bagging 已知能在不增加偏差的前提下降低方差。
对决策树,bagging 降低过拟合。对 MVO,bagging 降低优化器在输入不确定性下的方差。数学相同:对同一潜在函数的有噪声估计求平均。
随机森林是 bagging + 随机特征选择。MVO 中”特征选择”的类比是对每个 bootstrap 选择资产的子集。这就是”集成 MVO”或”bagged asset selection”。
López de Prado 2018 年的书详细讨论了这一点。重采样与资产子集选择的组合比单独任一种都更稳健。
收敛性与一致性
当 且 固定时,重采样效率如何收敛?
如果 bootstrap 是一致的(对 i.i.d. 样本成立),bootstrap 分布收敛到真实抽样分布。 收敛到真实最优 (加上 bootstrap 近似真实情况所带来的偏差)。
收敛速度取决于 和 。对 固定、,收敛是参数级的(阶数 )。对 随 增长,收敛可能更慢。
实践中,这意味着:随着历史样本增大,重采样效率越来越接近真实最优。60 个月度数据、50 个资产的情况下,你处在重采样帮助很大的有限样本状态。
重采样效率与 Black-Litterman
一种自然的组合:重采样,但用 Black-Litterman 来设 而不是用样本均值。
对每个 bootstrap 样本:
- 从 bootstrap 样本估计 。
- 用 把 设为 Black-Litterman 后验。
- 解 MVO 得到 。
跨 bootstrap 样本求平均。
这叠加了两种方差缩减技术:Black-Litterman( 的贝叶斯收缩)和重采样(bootstrap 方差缩减)。组合比单独任一种都更稳健。
在生产中,对大多数应用这属于过度工程。单用 Black-Litterman 通常就够。但对高赌注的应用(主权财富基金、大型养老金),这种组合是站得住脚的。
重采样效率与风险平价
另一种组合:用重采样稳定协方差矩阵,然后在稳定后的估计上解风险平价。
对每个 bootstrap 样本:
- 计算 。
- 跨样本求平均:。
这是一种带贝叶斯色彩的协方差估计量。它与 Ledoit-Wolf 收缩类似,但使用 bootstrap 分布而非结构化目标。
然后在 上解 ERC。结果比样本协方差上的 ERC 更稳定。
重要的实现细节
生产中有三件事要做对。
细节 1:约束处理。 对每个 bootstrap 样本施加相同约束。不要让某些样本产生无约束最优而其他样本产生有约束最优,否则求平均会混合不兼容的解。
细节 2:数值稳定性。 使用稳健的 QP 求解器。一些 bootstrap 样本会有接近奇异的协方差矩阵。在求解前给 加上一个小的对角项:
Sigma_b = Sigma_b + 1e-8 * np.eye(N)
细节 3:随机种子。 设置种子以保证可复现性。不同 bootstrap 样本给出不同平均。你希望在相同数据上得到相同平均。
重采样无效的情形
三种状态下重采样效率跑输单次方法。
状态 1:强信号。 如果你有一个强而可靠的 alpha 信号,样本均值就是一个好的估计。重采样只是在真实值周围增加噪声。单次 MVO 干净地捕获信号。
状态 2:非平稳数据。 如果潜在分布正在变化,bootstrap 抽样自过去。若未来不同,重采样分布就是错的。每次再平衡都重新估计 和 的单次方法可能适应得更好。
状态 3:样本极小。 如果 极小(比如 ),bootstrap 分布不可靠。在小样本上重采样只是给一个不可靠的估计再增加更多有噪声估计。
对多数机构应用,这些状态都不适用。你有足够的数据,信号没有那么强,数据大致平稳。重采样效率没问题。
要点回顾
重采样效率就是 bootstrap MVO。有放回地抽样,逐个优化,求平均。把权重方差缩小为 。
它是对 MVO 估计误差的实用疗法。Michaud 的原始方案。López de Prado 把它形式化,并加入了 block bootstrap、每次 bootstrap 内做收缩、按置信度加权平均。
计算成本是主要缺点。每次再平衡 100-1000 次 QP 求解。极易并行,跨核分配。
它稳健但对任何特定问题都不是最佳。当你没观点、想要一个合理默认时用它。
它可以与 Black-Litterman、风险平价和收缩组合以获得额外稳健性。生产中,你通常把重采样效率作为更大流水线中的一环。
它在强信号、非平稳数据或极小样本的状态下帮不上忙。要了解它的局限。
下一篇文章:因子组合构造,从因子而非资产出发构建组合。