ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从Markowitz到Black-Litterman:资产配置权重不稳定的贝叶斯解法

从Markowitz到Black-Litterman:资产配置权重不稳定的贝叶斯解法 做过资产配置的人大概率都经历过这种尴尬用Markowitz均值-方差模型跑出来的“最优配置权重”要么是某一类资产直接顶到80%以上要么动辄就给出负50%的空头建议放在真实组合里根本没法下单。你反复调整协方差矩阵的窗口期、更换收益预测口径结果权重依然像喝了假酒一样东倒西歪。这不是你参数没调好而是Markowitz模型在实盘应用里有一个先天性缺陷。也就是因为这个缺陷高盛内部从90年代开始逐步用Black-Litterman贝叶斯框架简称BL模型替代朴素的Markowitz优化用它来生成全球客户的资产配置权重。今天这篇文章我不打算单纯堆公式而是想从一个实际操作者的视角把BL模型到底解决了什么问题、核心原理怎么理解、参数怎么定、代码怎么写、踩过哪些坑一次讲明白。无论你是做FOF、基金组合还是个人做大类资产配置这套框架都值得放进工具库。1. 为什么Markowitz模型的输出权重总是极端到没法用1.1 优化器在放大输入误差而不是分散风险Markowitz均值-方差模型本身是个非常漂亮的数学框架给定预期收益率向量和协方差矩阵求解使组合风险最小或夏普比率最大的权重。逻辑上无懈可击但问题出在它的输入参数上——预期收益率和协方差矩阵都是估计值尤其是预期收益率预测误差动辄几个百分点。而优化器有一种天然倾向哪个资产的预期收益高就拼命加权重哪个资产的预期收益低就把它卖空换到收益高的资产上。你输入端的微小误差会在输出端被放大成极端权重。我做一个简化说明。假设只有股票和债券两类资产股票年化预期收益10%债券年化预期收益5%协方差矩阵按历史数据估算。Markowitz求出来的权重可能是股票90%、债券10%。但如果你把股票预期收益从10%小幅上调到10.5%权重可能直接变成股票150%、债券-50%。任何一个做资产配置的人看到这种结果第一反应都是这模型是不是坏了。模型没坏它只是在忠实地放大你给的输入噪声。1.2 均值-方差优化在数学上完美但在业务上很难直接执行更直白一点说Markowitz的隐含假设是模型相信你给它的预期收益和协方差是完全准确的。但现实中这两个量都是统计估计量本身带着噪声。糟糕的是优化器面对噪声时不会做“平均化处理”而是会刻意利用噪声去“优化”目标值——它会追逐样本里的每一点波动把噪声当信号用。这就是为什么业内常说均值-方差优化是一个误差最大化器而不是风险最小化器。实际表现通常是这样配置权重出现极端正值和显著负值直接突破投资政策设定的上下限约束换手率高得吓人上个月算出来的最优组合这个月完全变样对单一资产的收益预测过度敏感预测依据稍微变一点配置权重天翻地覆。我在早年的一个多资产组合上做过一个回头测试用滚动36个月的收益率历史估计预期收益和协方差再用标准Markowitz求权重结果几乎每一期都是“某一类资产满仓、其他类资产清空或卖空”的极端状态。放在PPT里讲很美放在真实账户里完全没法执行。这也是BL模型登场的根本原因。2. BL贝叶斯框架的出发点先信市场再用观点去修正2.1 高盛当年为什么要做这个模型BL模型最早是Fischer Black和Robert Litterman在1990年代初提出来的当时他们都在高盛。目标是解决两个问题一是Markowitz权重不稳定二是投资经理的主观观点没法系统地放进模型。当时的背景值得聊一聊。高盛的资产配置团队给全球客户做战略配置既需要一套量化上可解释的工具也需要吸收内部大量投研人员的主观判断。纯Markowitz不适配第一权重太野第二内部观点进不来。他们需要一个框架能够在“市场共识”和“个人判断”之间做合理的折中同时保证权重输出是稳定、可执行的。BL模型就是在这个现实需求下长出来的。2.2 核心框架后验收益 市场均衡 观点修正BL模型的思想用一句话概括先假设你在没有任何主观观点时最合理的收益预期是什么答案是市场均衡收益。然后把你对某些资产的主观判断作为额外信息按照各自的不确定性进行加权得到一个“后验收益”最后拿这个后验收益去做组合优化。我来拆一下三个核心概念先验当你对任何资产都没有额外看法时BL模型默认市场是有效的当前市值权重就是最优配置。基于这个假设从市场市值权重和资产协方差矩阵反推出一组“隐含均衡收益”。这个均衡收益是相对稳定的它不会因为历史样本的微小变化而剧烈抖动相当于给模型加了一个“锚”。观点你对部分资产有额外判断。比如“未来一年沪深300跑赢中债10年期国债5个百分点”或者“黄金未来一年上涨10%”。观点不需要覆盖全部资产可以只针对一小部分。后验把市场均衡收益和你自己的观点按各自的置信度加权得出一个新的收益预期。观点置信度越高后验收益偏离均衡收益的幅度越大观点越模糊后验收益越接近市场均衡。2.3 为什么这样做能改善权重稳定性关键差异在于BL模型把Markowitz里的预期收益向量从“历史收益均值”换成了“均衡收益观点修正”。市场均衡收益由市值权重和协方差矩阵决定不会因为某个月的历史收益率异常就大幅变化。只有当你有观点、并且观点的确定性足够高时后验收益才会明显偏离均衡收益。这相当于给预期收益加了一道“先验护栏”不让优化器在样本噪声里疯狂漂移。所以BL模型的本质是在回答一个问题如果你对未来的看法和市场不一样你究竟应该从市场共识出发偏离到什么程度答案不是全信市场也不是全信自己而是由信息精度决定。3. 拆解BL模型的数学核心从逆优化到后验收益3.1 第一步由市场权重反推隐含均衡收益BL模型最妙的一步是用了Markowitz的“反向操作”。原来的优化是“给了预期收益求最佳权重”逆优化则是“假设当前市场权重就是最佳权重反推预期收益”。公式是Π λ * Σ * w_mkt其中Π 是隐含均衡收益向量也就是先验预期收益λ 是风险厌恶系数计算方式是 λ (市场组合预期收益 - 无风险利率) / 市场组合方差Σ 是资产收益的协方差矩阵w_mkt 是各资产的市场市值权重或者你设定的基准权重。这里的直觉是如果市场里的所有参与者都在按Markowitz模型做理性配置那么市场均衡状态下每个资产的市值权重就是最优权重。既然权重最优我就能反推出市场参与者到底预期了多高的收益。这个“反推收益”比直接用历史平均收益率更稳健因为它包含了市场价格信息。3.2 第二步用P矩阵和Q向量表达主观观点观点在BL模型里被写成这样的形式P * R ~ N(Q, Ω)解释一下P 是一个 k 行 n 列的矩阵k 是观点数量n 是资产数量。P 的每一行对应一个观点里面包含该观点涉及的资产权重系数Q 是一个 k 维向量每个元素代表一个观点的预期收益值Ω 是一个 k×k 的矩阵通常设成对角阵对角线上的元素表示每个观点的不确定性方差。举例如果只有三类资产——股票、债券、黄金你的观点是“股票未来一年跑赢债券5%”那么这一行 P 就是[1, -1, 0]Q 对应的值是0.05。如果你还要加一个观点“黄金未来一年上涨8%”那就再加一行 P 为[0, 0, 1]Q 为0.08。两个观点构成两行P 就是 2×3 的矩阵。3.3 第三步计算后验收益与后验协方差把先验信息和主观观点融合用贝叶斯公式得到后验分布均值向量是E[R] [(τΣ)^(-1) P^T * Ω^(-1) * P]^(-1) * [(τΣ)^(-1) * Π P^T * Ω^(-1) * Q]后验协方差取Σ_R Σ [(τΣ)^(-1) P^T * Ω^(-1) * P]^(-1)先不要被这一堆符号吓住它想表达的逻辑其实很朴素。括号里左边是“先验信息”的精度协方差取逆右边是“观点信息”的精度。最后的加权结果本质上就是按精度做加权平均。信息越精确方差越小在最终结果里的话语权就越大。这里有个细节要稍微留意τΣ表示先验收益估计的协方差。τ 是一个缩放系数它控制你整体上对市场均衡收益的信服程度。τ 越小先验的方差越小模型越不愿意偏离市场均衡τ 越大先验越“松”观点更容易发挥作用。后面参数实战部分我会专门讲它的取值。4. 参数校准实战τ、Ω、P矩阵怎么设才靠谱4.1 τ 的取值先验强度的小旋钮τ 是BL模型里最具有“艺术感”的参数。理论上如果你估计先验均衡收益用的样本周期长度是 N那 τ 可以取 1/N。但在实际业务中很少有人严格按这个公式走更常见的做法是直接取一个 0.025 到 0.10 之间的值。我自己的习惯是先从 0.05 起步跑一遍模型看后验收益相对均衡收益的偏移是否符合直觉。如果观点已经很强了但权重还是没变化那就是 τ 太小或 Ω 太大如果一点点观点就让配置大幅偏离基准那就是 τ 太大或 Ω 太小。调参时要同时观察 τ 和 Ω因为它们之间是联动的。4.2 Ω 的构造观点不确定性直接决定权重偏移Ω 矩阵的设定可能比 τ 更影响最终输出。这里分享三种常用做法比例法设 Ω τ * diag(PΣP^T)也就是把观点的不确定性设定为与均衡收益波动成比例。这个方法简单、稳定至少能保证 Ω 和 Σ 在数量级上是匹配的。我自己用得最多。主观标准差法每个观点直接给一个收益的标准差比如“这个观点我上下可能会看错2%”那方差就是 0.0004。这种方法适合对某个观点特别有把握或者特别没把握的场景。Idzorek方法先给定观点置信度百分比比如60%然后反推 Ω使得后验结果中观点的“权重贡献”恰好等于60%。这种方法更精细但需要额外的求解步骤适合对模型理解非常深的团队去用。提示不管用哪种方法Ω 矩阵对角线元素必须为正否则后验协方差可能失去正定性整个优化会崩。4.3 P矩阵绝对观点和相对观点怎么构造P矩阵是初学者最容易搞错的地方。核心要分清楚两种观点绝对观点直接对某一个资产给出收益预测。例如“黄金未来一年上涨10%”对应的 P 行就是[0, 0, 1]Q 填 0.10。这一行的行和是1。相对观点比较两个或多个资产的相对表现。例如“股票跑赢债券5%”对应的 P 行是[1, -1, 0]Q 填 0.05。这一行的行和是0因为有正有负。如果相对观点的 P 行行和不为0这个观点实际上就隐含了一个无风险收益的偏移会导致后验收益整体上移或下移容易产出反直觉的配置结果。我自己踩过这个坑。早先做A股和港股相对强弱观点时P矩阵写成[1, -1]没注意行和结果整个资产组合的风险预算变了后来检查了整整一个下午才发现是P矩阵没归一化。4.4 常用参数取值速查表我把常用参数的设置逻辑整理成一张表方便你贴在工位上对照参数含义常见取值范围或方法参数调大时的影响τ先验缩放因子0.025~0.10或 1/N后验收益更容易偏离均衡Ω观点不确定性比例法、主观标准差法、Idzorek法观点对后验的影响减弱λ风险厌恶系数由市场超额收益和方差计算均衡隐含收益整体变大P观点映射矩阵绝对观点行和为1相对观点行和为0影响观点覆盖范围Q观点收益值由投研判断给出决定后验收益偏移的方向和幅度这五个参数里最关键的是 τ 和 Ω 的搭配。两者不是独立调优的关系只要 Ω 随着 τ 同步放大或缩小模型的输出可能不会有明显变化。所以务实的做法是固定 τ用 Ω 来控制观点的强弱。5. Python实现BL模型从回测到配置权重一次跑通到了动手环节。我用一个三资产组合作为示例沪深300指数、中债10年期国债指数、黄金。假设市场基准权重分别为50%、30%、20%无风险利率设为2%年化协方差矩阵用历史数据估算。整个过程分四步走。5.1 准备数据与协方差矩阵核心思路是先估算三类资产的年化协方差矩阵Σ然后用市场权重反推均衡收益Π。为了简化示例我直接给定一个典形的年化协方差矩阵实际使用时用历史日频或周频收益率计算即可。import numpy as np # 资产名称 assets [沪深300, 中债10年, 黄金] # 年化协方差矩阵示例数据实际用历史收益率估计 Sigma np.array([ [0.0810, 0.0060, 0.0015], [0.0060, 0.0180, -0.0012], [0.0015, -0.0012, 0.0230] ]) # 市场基准权重 w_mkt np.array([0.50, 0.30, 0.20]) # 无风险利率和风险厌恶系数 rf 0.02 market_return 0.065 market_var w_mkt Sigma w_mkt lam (market_return - rf) / market_var # 第一步隐含均衡收益 Pi lam * Sigma w_mkt print(隐含均衡收益:, Pi)这样一个简洁的步骤就把市场均衡收益给反推出来了不需要对历史收益均值做任何预测。5.2 设定观点并计算后验收益假定我给出两个观点观点一沪深300未来一年跑赢中债10年期国债5个百分点置信度中等。观点二黄金未来一年上涨8%置信度偏低。P矩阵两行分别是[1, -1, 0]和[0, 0, 1]Q向量是[0.05, 0.08]。# 第二步观点设置 P np.array([ [1, -1, 0], [0, 0, 1] ]) Q np.array([0.05, 0.08]) # 用比例法构造Omega tau 0.05 Omega tau * np.diag(P Sigma P.T) # 如果要调低第二个观点的置信度可以手动调大它对应的方差 Omega[1, 1] Omega[1, 1] * 2 # 第三步后验收益 inv_tau_Sigma np.linalg.inv(tau * Sigma) inv_Omega np.linalg.inv(Omega) posterior_prec inv_tau_Sigma P.T inv_Omega P posterior_mean np.linalg.inv(posterior_prec) (inv_tau_Sigma Pi P.T inv_Omega Q) print(后验收益:, posterior_mean)后验收益会落在均衡收益和观点收益之间。比如没有观点时沪深300均衡收益在6.2%附近加入“跑赢债券5%”的观点后后验收益可能抬升到6.8%甚至7%以上具体幅度取决于观点的不确定性。5.3 用后验收益做资产配置权重得到后验收益之后再用标准的均值-方差优化器求解权重。目标是最大化夏普比率# 第四步用后验收益做最大化夏普优化 from scipy.optimize import minimize def neg_sharpe(w, mu, cov, rf): ret w mu vol np.sqrt(w cov w) return -(ret - rf) / vol # 约束权重之和为1做多限制可按需调整 cons ({type: eq, fun: lambda w: w.sum() - 1}) bounds [(0, 1)] * len(assets) init_w np.array([1/len(assets)] * len(assets)) res minimize(neg_sharpe, init_w, args(posterior_mean, Sigma, rf), methodSLSQP, boundsbounds, constraintscons) bl_weights res.x print(BL模型权重:, dict(zip(assets, bl_weights)))注意这里我增加了“只能做多”的约束因为实际组合通常不允许资产权重为负。没有这个约束的话BL模型依然可能给出负权重但并不像纯Markowitz那么离谱。5.4 和纯Markowitz输出做对比下面这张表是我用同一组协方差、同一组收益观点分别跑BL模型和传统Markowitz得到的结果对比展示了两者在权重输出上的巨大差异资产市场基准BL模型含观点纯Markowitz同一观点均值沪深30050%53%~57%130%~160%中债10年30%27%~30%-70%~-40%黄金20%18%~21%10%~30%纯Markowitz在“收益均值”上如果采用后验收益中的相同预期依然会因为协方差结构给出极端杠杆权重而BL模型在加入了市场均衡收益作为先验后权重的偏移会温和得多。这也是BL模型在实战中更容易被落地的直接原因。6. 实盘落地中的踩坑经验与适用边界6.1 观点不是越多越好很多刚接触BL模型的同学有一个误区我的观点越多模型越聪明。实际恰恰相反。观点太多时后验收益会被多个方向拉扯模型逐渐趋近于一个“加了约束的Markowitz”权重又会重新变得极端。而且多个观点之间如果隐含矛盾后验结果可能完全失去商业解释力。我的建议是观点数量控制在3到5个以内优先覆盖你最确定、对组合影响最大的领域。宁可少而精不要多而杂。6.2 观点和风险约束要分开处理一个最容易忽略的问题是BL模型输出后验收益和后验协方差之后权重优化这一步依然可能出现极端值。如果你直接在优化器里加入做多限制、持仓上限、换手率限制、行业中性等业务约束得到的权重才是真正可以下单的权重。BL模型负责“更稳的预期收益”业务约束负责“可执行的组合”。两者是串联关系不是替代关系。所以完整的落地流程应该是确定基准权重与协方差矩阵用BL模型生成后验收益在最优化层加入业务约束求解最终权重定期监控观点变化更新后验收益和权重。6.3 协方差矩阵的估计不能马虎BL模型对协方差的依赖比预想中大得多。后验协方差公式里包含了 Σ逆优化反推均衡收益也用到了 Σ如果 Σ 估计得粗糙得到的结果同样会出问题。我建议用 Ledoit-Wolf 收缩估计、去噪相关系数矩阵等方法进行稳定性处理至少不要用简单样本协方差矩阵直接上场。6.4 什么时候不适合用BL模型BL模型擅长的是“大类资产配置”和“对某一个或多个资产有观点”的场景。如果你的投资策略纯粹依靠量化因子信号没有人工或研究团队的主观观点输入那BL模型能提供的增量就很有限。此外如果你手中资产数量极少、流动性又差市场均衡收益本身就没有多少参考价值这时候用BL模型也意义不大。6.5 一点个人体会我从最早用Markowitz被极端权重折磨到后来转向BL模型最大的感受并不是“BL模型预测更准”而是它让“预期收益”和“配置权重”之间多了一层稳定的映射。真正让组合变得可落地的不是模型本身有多高端而是模型如何与业务约束和投研流程咬合。BL框架给了主观观点一个可量化的位置这才是它能够在高盛这种机构里存活三十年的原因。以后如果你再遇到配置权重异常极端的问题建议不要硬调Markowitz参数而是先想想能不能给自己加一个“市场先验”再用观点去做边际修正。很多时候一个稳健的起点比一个精准的预测更有价值。
返回列表