L1 把 N 资产的单期投资问题落到了一行目标函数 s.t. ,又用两资产示例把代数走通。但 PM 周五拍着桌子要的不是一个孤立点——他要看一张图:横轴是组合波动率 ,纵轴是组合预期收益 ,所有 MV 最优组合按 串起来形成一条曲线;同时他要知道有没有一个最好的组合(无关 的那种),以及加现金后这张图是怎么变的。
这堂课就是给这张图配齐数学。我们(a)用 Lagrange 乘子法把 L1 的目标函数解成 N 维闭式;(b)取 的极限得到全局最小方差组合(GMV);(c)用 扫描出整条最小方差前沿(minimum-variance frontier),识别有效前沿(efficient frontier)就是上半枝;(d)引入无风险资产推出切线组合(tangency portfolio)与资本配置线(CAL);(e)证明两基金 / 一基金分离定理(two-fund / one-fund separation),为 L3 的 CAPM 均衡铺路。
术语对齐表
延续 L1 的规范译名,本课新增以下核心术语(全部出自 data/glossaries/quant-glossary.yaml):组合优化(portfolio optimization,挑选权重满足目标与约束的数值过程)、均值方差优化(mean-variance optimization, MVO,Markowitz 框架本身)、夏普比率(Sharpe ratio,,L2 切线组合最大化的目标)、协方差矩阵(covariance matrix)、对称矩阵(symmetric matrix)、半正定(positive semidefinite)、矩阵逆(matrix inverse)。后续散文与代码统一使用这些标准译名。向量(vector) 表示组合权重 。
闭式 MV:Lagrange 乘子直接拉出来
把 L1 的目标函数和预算约束合成 Lagrangian:
对 求偏导并令其为零:,整理得
把这个 代回预算约束 ,解出 Lagrange 乘子 :
数值实现一律推荐 numpy.linalg.solve(Sigma, x) 而不是 inv(Sigma) @ x——避免显式构造逆矩阵,减少误差累积。 必须可逆——这是承重假设,本课要求它正定;实务上当 (资产数超过样本数)样本协方差矩阵奇异,即便 比率 也会驱动病态(ill-conditioning),L4 用 Ledoit-Wolf 收缩(shrinkage)修复这一点。
精度矩阵(precision matrix) 在结构上控制谁拿大权重:对组合方差边际贡献小(即 的某行较大)的资产,在单位 下会拿到更多权重。
四个闭式公式:Inline-code listing 中的顺序
w_general(gamma) = (1/gamma) * Sigma^{-1} * (mu - lambda * ones) with lambda = (ones' Sigma^{-1} mu - gamma) / (ones' Sigma^{-1} ones)
w_gmv = (Sigma^{-1} * ones) / (ones' * Sigma^{-1} * ones)
w_tan = (Sigma^{-1} * (mu - r_f * ones)) / (ones' * Sigma^{-1} * (mu - r_f * ones))
S_tan = sqrt((mu - r_f * ones)' * Sigma^{-1} * (mu - r_f * ones))
实现规则:use numpy.linalg.solve(Sigma, x) rather than inv(Sigma) @ x for numerical stability。
全局最小方差组合(GMV)
取 ,或者等价地直接丢掉 项,问题变成 s.t. 。Lagrange 一阶条件 给出 ,代回约束 解出 ,合起来
两条实务结论:(i) GMV 只是 的函数,完全不依赖 ;(ii) 因为 是 MV 框架里误差最高的原语(Chopra-Ziemba 1993 给出量化结果: 误差对最优权重的影响约是 误差的 10 倍),GMV 经验上是 MV 家族中对估计误差最鲁棒的组合。很多机构默认把「GMV + Ledoit-Wolf 收缩」当作「对 不持观点」的基线组合;国内公募的低波 / 最小波动率产品就是这个工作流的实现。
最小方差前沿:几何形状
让 在 区间扫描,闭式 在 中划出一条一维曲线;映射到 空间时是双曲线,在 空间时是抛物线(代数更干净)。下面是 Inline-code listing 中按固定顺序的五条前沿几何断言:
frontier_parabola: in (sigma_p^2, mu_p) space the minimum-variance frontier is a parabola
frontier_hyperbola: in (sigma_p, mu_p) space it is a hyperbola
gmv_leftmost: the GMV is the leftmost point of the frontier (minimum sigma_p)
efficient_branch: the efficient frontier is the upper branch above the GMV (the lower branch is dominated)
cal_tangent_line: with a risk-free asset, the CAL is the half-line from (0, r_f) tangent to the efficient frontier at (sigma_tan, mu_tan); slope = S_tan = (mu_tan - r_f) / sigma_tan
规则:when tangency = market portfolio (the L3 CAPM equilibrium) the CAL is called the capital market line (CML)。
实务读图:有效前沿上每个点都是相应 下能达到的最高 ;投资者选 等价于选前沿上一点。下半枝(lower branch)被上半枝完全主导(同 ,更低 ),没有理性投资者会选。
切线组合:把无风险资产并进来
按 L1 的无风险扩展,问题在风险资产权重上变成无约束的 ——预算约束被现金权重残差吸收。一阶条件 给出 。把它归一化为方向:
切线组合不依赖 —— 只影响规模 ,即风险资产仓位相对现金的杠杆。
断言: 在所有满足 的风险组合 中最大化夏普比率 。
证明梗概:Sharpe 关于 的标量缩放不变,所以只需在 上找极值。对 Sharpe 求一阶条件可得 ,即 ,归一化即为 。切线处的夏普 ——超额收益向量在精度矩阵下的二次型开根号。
资本配置线(CAL)
从全现金点 出发,沿着与有效前沿在 相切的直线向右上方走,这条半线就是 CAL。其上每一点都是「 份切线组合 + 份现金」的某个组合。代数:对位置 , 且 ,所以
CAL 的斜率就是切线 Sharpe ——风险的价格(price of risk)。CAL 对任何 都主导无风险版本的前沿(CAL 在切点相切,两侧前沿都凹向下方)。当切线组合等于市场组合(L3 的 CAPM 均衡),CAL 改名叫资本市场线(CML)。
两基金 / 一基金分离定理:Inline-code listing 中的顺序
two_fund_separation: any frontier portfolio = a * w_A + (1 - a) * w_B for any two distinct frontier portfolios w_A, w_B
one_fund_separation: with a risk-free asset, every MV-optimal portfolio = c * w_tan + (1 - c) * cash for some c in R; the risky direction w_tan is gamma-invariant
规则:one-fund separation is the foundation for the CAPM aggregation in L3。
两基金分离(无风险资产)。前沿上任何组合都可以写成 ,其中 、 是前沿上任意两个不同组合,。证明:闭式 在 上是仿射(affine)的;取 、;任何 的组合权重由 给出。实务后果:一家基金公司只要发两只 MV 前沿基金(一只保守型,接近 GMV;一只激进型),任何 MV 投资者都能用它们合成自己想要的组合,而不需要持有单只证券——这就是公募基金「股六债四」「股七债三」目标日期产品的理论根基。
一基金分离(带无风险资产)。每个 MV 最优组合都是切线组合 与无风险资产的组合,所有投资者无论 多少都持有同一个风险组合方向 。证明已经在切线推导里:风险权重向量是 ,其方向 与 无关;切线组合上的仓位 。这个定理是 L3 CAPM 推导的支点——如果所有投资者共享 ,所有人都持有同一个切线组合;市场出清(market clearing)强迫这个切线组合等于市场组合(market portfolio)。
工作示例:5 资产前沿
5 资产 CN 战略资产配置(strategic asset allocation, SAA)样本宇宙:510300(沪深300 ETF,大盘股代理)、510500(中证500 ETF,中盘代理)、512100(中证1000 ETF,小盘代理)、511010(国债 ETF,久期代理)、518880(黄金 ETF,分散器)。无风险代理:7 日 SHIBOR 或 1 年国债 yield,这里取 。
闭式实现(下面的 Fenced 代码块给出规范签名,内部统一用 numpy.linalg.solve 替代显式构造 Sigma 的矩阵逆):
import numpy as np
def efficient_frontier(mu: np.ndarray, Sigma: np.ndarray, r_f: float, gamma_grid: np.ndarray) -> dict:
# GMV: w_gmv = solve(Sigma, ones) / ones' solve(Sigma, ones)
ones = np.ones_like(mu)
inv_Sigma_ones = np.linalg.solve(Sigma, ones)
w_gmv = inv_Sigma_ones / np.sum(inv_Sigma_ones)
# 切线组合: w_tan = solve(Sigma, mu - r_f * ones) / ones' solve(Sigma, mu - r_f * ones)
excess = mu - r_f * ones
inv_Sigma_excess = np.linalg.solve(Sigma, excess)
w_tan = inv_Sigma_excess / np.sum(inv_Sigma_excess)
# 切线夏普
S_tan = float(np.sqrt(excess @ inv_Sigma_excess))
# 用 gamma 扫描前沿
frontier_sigma = np.empty_like(gamma_grid)
frontier_mu = np.empty_like(gamma_grid)
for i, gamma in enumerate(gamma_grid):
lam = (ones @ np.linalg.solve(Sigma, mu) - gamma) / (ones @ inv_Sigma_ones)
w_g = (1.0 / gamma) * np.linalg.solve(Sigma, mu - lam * ones)
frontier_mu[i] = float(w_g @ mu)
frontier_sigma[i] = float(np.sqrt(w_g @ Sigma @ w_g))
return {
"w_gmv": w_gmv,
"w_tan": w_tan,
"S_tan": S_tan,
"frontier_sigma": frontier_sigma,
"frontier_mu": frontier_mu,
}
CN 实证特点:股债相关性历史上接近零或在某些窗口转正(与 US 风险关闭时常见的 -0.3 不同),债券分散收益较小;中证500 / 中证1000 在前沿上比 US Russell 2000 类比物更高,因为 2018–2023 的 CN 小盘溢价 4–8% 远高于 US 的 1–2%;无约束 MV 解经常落在「30–50% 债 + 50–70% 沪深300 + 极小量中小盘 / 黄金」的切线组合。机构默认的「股六债四」定权重覆盖就是为了避免无约束 MV 解的高波动性。
Formula Explorer
Sigma^{-1} * (mu - r_f * ones)练习
Exercise
给定 5 资产 2018-01 至 2023-12 月度收益(cn:510300 / 510500 / 512100 / 511010 / 518880),无风险年化 r_f = 0.025。
(i) 计算样本 mu(乘 12 年化)、Sigma(乘 12 年化);用 np.all(np.linalg.eigvalsh(Sigma) > 0) 验证 Sigma 正定。
(ii) 用 numpy.linalg.solve 计算 GMV w_gmv;报告权重、mu_p = w_gmv @ mu、sigma_p = sqrt(w_gmv @ Sigma @ w_gmv),观察 w_gmv 在五只资产上是否都为正(Sigma 条件良好时 GMV 是天然的多头分散器)。
(iii) 在超额收益系统上用 numpy.linalg.solve 计算切线组合 w_tan;报告权重(若 mu - r_f * 1 有负项,可能出现做空——无约束问题允许)、mu_p_tan、sigma_p_tan、切线夏普 S_tan = (mu_p_tan - r_f) / sigma_p_tan。
(iv) 用对数网格 np.logspace(-1, 2, 50) 扫描 gamma 描出有效前沿;每个 gamma 计算 w_g、mu_g、sigma_g;画 (sigma_g, mu_g) 前沿曲线,标记 GMV(最左)、标记切线,从 (0, r_f) 经 (sigma_p_tan, mu_p_tan) 画 CAL。
(v) 找出一般 MV 组合恰好与切线组合重合的 gamma 值(提示:即预算约束乘子 lambda = 0 时的 gamma,);数值验证。
提示
np.linalg.solve(Sigma, x),不要写 np.linalg.inv(Sigma) @ x——前者数值更稳;两者数学等价但前者避免显式构造 。提示
w_g(gamma_tan) 与 w_tan 的方向 w_tan / w_tan.sum() 对照,前两位小数应当一致。实务延伸:把 L2 当成 4.4 整个子学科的入口
L2 是 组合优化 这一学科里最经典的闭式解之一,但它的承重价值不在「公式好看」——而在三件事:
第一,精度矩阵 是 MV 把信号转成权重的真正机制。L1 给的两资产玩具是 的特例,这里 N 维 Lagrange 解 让你看到完整图景:每多一只资产,优化器都在 N 维空间里做一次「协方差矩阵结构 vs 预期收益向量」的几何权衡。L3 用同一个 推出 SML;L4 修正 plug-in MV 失败时,就是修复 在 接近 时被 plug-in 估计导致的矩阵逆爆炸——理解 L2 的 角色,L4 的 Ledoit-Wolf 收缩才会有具体动机。
第二,切线组合是 Sharpe-maximizer——「最高夏普比率(Sharpe ratio)的风险组合」这件事不是修辞,而是数学定理(本课已证)。无论是机构的目标波动率书、零售的 60/40、还是激进的 130/30 长短策略,从概念上看都是「切线组合 + 现金 / 杠杆」的不同 取值——这正是一基金分离的结论。
第三,对称矩阵与半正定性质把这套机器钉在凸优化的舒服区:目标函数关于 是凸二次型,KKT 条件等价于一阶条件,Lagrange 乘子法把约束 QP 化成线性方程组。任何对 的修正——LW 收缩、Barra 风格 、收缩到常相关结构——都必须保持半正定;否则整个 QP 就从凸跳到非凸,Lagrange 法不再适用,你得改投鲁棒优化或元启发式。
通向 L3:把一基金分离搬上均衡舞台
切线组合的「所有投资者持有同一个风险方向」结论已经摆好。L3 把这件事推到均衡:如果 个投资者全都共享 ,每人都持有 ;市场出清要求这 份持有的总和等于市值加权的市场组合,所以 。把这一身份代回 CAL,就能跑出证券市场线(security market line, SML),也就是教科书写的 。L3 走的就是这条路。在那一课,均值方差优化 的均衡推论会把整个市场组合带到舞台中央;在 L4,plug-in 组合优化 的失败模式与 Ledoit-Wolf 收缩、Black-Litterman 修复一起出现——L2 的闭式解是后两课无法绕过的中转站。