周一上午,你在某沪上私募基金的组合构建台,PM 把一个文件丢到你桌上:沪深300 成份股加上一篮子中证500 小盘票,共 500 只,每只都给了下一季度的预期收益 ;另外附一张 500×500 的协方差矩阵 ,是研究部用 60 个月滚动样本估出来的。PM 的指令只有一句:「按这个开个仓,目标年化波动 12%。」
你面前的问题就是单期(single-period)投资问题:在时刻 0 选一组权重 ,在时刻 1 兑现一个随机的组合收益 。这堂课不解决「 怎么来」(那是 4.2 / 4.3 的题目)、也不解决「 估不准怎么办」(那是本模块第 4 课的题目),它只解决一件事:给定 和 ,怎么把它们转成一个权重向量。这就是 Markowitz 在 1952 年那篇《Portfolio selection》(JF)写的东西——也是后续三堂课的母题。
术语对齐表
在进入数学之前,先把本课用到的核心术语对应到行业的规范译名(canonical glossary 形式),后续散文与代码中你看到的就是这些标准词:组合优化(portfolio optimization,即广义的投资组合优化数值过程)、均值方差优化(mean-variance optimization, MVO,Markowitz 框架本身)、夏普比率(Sharpe ratio,)、协方差矩阵(covariance matrix,核心组合风险对象)、对称矩阵(symmetric matrix,,协方差矩阵是其典型例子)、半正定(positive semidefinite, PSD, 对所有 成立)。这些译名出自 data/glossaries/quant-glossary.yaml 标准表,不要在课内自创替代译。
单期投资框架:三个原语和一个假设
把整套机器拆开,只剩三个原语(primitives)。下面是 Inline-code listing 中给出的固定记忆顺序:
mu = E[r] # N-向量,资产预期收益
Sigma = Cov(r, r) # N x N,半正定协方差矩阵
r_f = r_f # 标量,无风险利率(可选)
mu 和 Sigma 在 L1–L3 中都被当作已知(known)处理;L4 会拆掉这个假设,把估计误差、收缩、Black-Litterman 那一套补上。
权重向量 满足预算约束 ——目前不允许杠杆,允许做空(long-only 是 4.4.3 的题目)。组合收益、预期收益、组合方差按下面三个恒等式给出:
这三个量是后续所有推导的承重墙。投资期是一个周期——Merton 1969 的多期动态投资问题(intertemporal portfolio choice)不在本模块,留给高阶选修。
为什么是均值方差?两个独立的辩护
vNM 公理(完备性、传递性、连续性、独立性)给出一条结论:一个理性投资者(rational investor)在期末财富 上极大化 ,其中 是凹效用函数(concavity 等价于风险厌恶)。这是期望效用(expected utility)框架,记号上写作 。
但本模块不打算求一个一般的 ——我们要把它坍缩到只看均值和方差。有两条独立的辩护路径。下面是 Inline-code listing 中按固定顺序排列的两条理由:
quadratic_utility: U(W) = W - (gamma/2) * W^2
gaussian_returns: r ~ N(mu, Sigma)
第一条是二次效用(quadratic utility)。如果 ,代入期望算子就有:
这是均值和方差的函数——精确成立,不需要任何额外假设。把 代换回收益空间,就得到本模块的规范目标函数。代价是:二次效用并非全局递增(超过某个财富水平 ,人变得「越富越想亏」,这显然违反常识);更糟的是它的 Arrow-Pratt 绝对风险厌恶系数随财富上升(增厌恶),而实证上几乎所有人是减厌恶。
第二条是高斯收益(Gaussian returns)。如果 ,那么对任何凹效用函数 , 都只依赖 ——因为高斯分布的所有矩都由前两阶矩决定。代价是:真实资产收益有厚尾(equities 的超额峰度 5–20+)、负偏(left skew)、时变波动率(time-varying volatility)。
实务上的折中:MV 是一个够用的近似(usable approximation),只要(a)持仓期较短(短窗收益更接近高斯)、(b) 当作校准参数而非偏好原语处理、(c)生产系统在 MV 解上再叠加尾部风险约束(VaR / CVaR,4.4.2 的题目)。所以你在私募的实际工作流是:用 MV 出基线权重 → 用 4.4.2 的风险模型做事前(ex-ante)风险归因 → 用 4.4.3 的转手成本约束做收尾。
均值方差目标函数与预算约束
规范形式(canonical form)。下面是 Inline-code listing 中按固定顺序的五条:
objective: max_w w' mu - (gamma/2) w' Sigma w
constraint: 1' w = 1
risk_aversion: gamma > 0 # 典型机构区间 gamma in [1, 5]
limit_low: gamma -> 0 gives max-return corner (all weight on highest-mu asset)
limit_high: gamma -> infty gives global minimum-variance portfolio (GMV; closed-form in L2)
目标函数 subject to 是关于 的二次型(quadratic form)。 半正定(positive semidefinite),当 时通常正定。约束是一条线性等式,所以整个问题是带等式约束的二次规划(QP),Lagrange 乘子法可以解出闭式(closed-form),这部分代数交给 L2。
风险厌恶系数:两个极限定位它
是风险厌恶系数(risk-aversion coefficient)——Arrow-Pratt 意义上的绝对风险厌恶(absolute risk aversion)在二次效用下的标量代理。两个极限给它定位:
- :目标函数坍缩为 subject to ,解是角点解(corner solution)——所有权重都堆在 最高的那一只资产上,其余为零。风险中性投资者的最大期望收益组合。
- :目标函数坍缩为 subject to ,解是全局最小方差组合(global minimum-variance portfolio, GMV),L2 给出闭式 。
典型机构校准:公募 / 私募基金等权益主动管理产品 ;风险平价(risk parity)、低波(low-vol)产品 ;社保 / 险资 / 大学捐赠等战略资产配置(strategic asset allocation, SAA)往往不直接校准 ,而是设一个目标波动率(volatility target,如 8% / 10% / 12%)反推 ——「目标年化波动 12%」就是这个工作流。
无风险资产扩展:方向和规模解耦
把 7 日 SHIBOR 或 1 年国债收益率作为无风险资产 引入(实务上私募的现金端常用银行间 7D 回购或货币基金代理)。预算约束变成 ,目标函数在风险资产权重上变成超额收益空间的无约束(unconstrained)优化。下面是 Inline-code listing 中按固定顺序的五条:
budget_with_rf: 1' w + w_f = 1 # w_f = 现金权重
objective_excess: max_w w' (mu - r_f * 1) - (gamma/2) w' Sigma w
direction_invariant: w_direction depends only on (mu - r_f * 1) and Sigma, not gamma
scale_gamma_dependent: gamma controls only the risky-vs-cash split
one_fund_separation: every investor holds the same risky portfolio direction (the tangency portfolio of L2) in different leverage ratios
写成数学:
这是超额收益空间的无约束 MV——预算约束被现金权重残差(residual)吸收掉了。关键观察:解的方向 不依赖 ,只依赖超额收益向量 和协方差矩阵 ; 只控制规模——投资者把多少钱放进风险组合、多少放在现金端。
这就是单基金分离定理(one-fund separation theorem)的雏形——所有投资者无论 多少,都持有同一个风险组合方向(切线组合,tangency portfolio),只在杠杆比例上不同。L2 会用 Lagrange 乘子把这件事正式证出来。
工作示例:两资产闭式解
把整套机器收缩到 ,代数干净到一行能写完。取沪深300 ETF(510300)作为资产 1,中证500 ETF(510500)作为资产 2,2018–2023 月度数据估出来的瞬态值大致是 、、。,先不引无风险资产。
参数化 把问题降到一维:
对 求一阶条件 ,整理得 的线性方程。代码实现(下面的 Fenced 代码块给出规范签名):
import numpy as np
def two_asset_mv(mu: np.ndarray, sigma: np.ndarray, rho: float, gamma: float) -> dict:
# 构造 2x2 协方差矩阵
Sigma = np.array([
[sigma[0]**2, rho * sigma[0] * sigma[1]],
[rho * sigma[0] * sigma[1], sigma[1]**2],
])
# 一阶条件 df/dw_1 = 0:线性方程 a * w_1 + b = 0
# 展开: (mu_1 - mu_2) - gamma * [w_1 * (sig1^2 - 2*rho*sig1*sig2 + sig2^2)
# + (rho*sig1*sig2 - sig2^2)] = 0
a = gamma * (sigma[0]**2 - 2 * rho * sigma[0] * sigma[1] + sigma[1]**2)
b = (mu[0] - mu[1]) - gamma * (rho * sigma[0] * sigma[1] - sigma[1]**2)
w_1 = b / a
w_star = np.array([w_1, 1 - w_1])
mu_p = float(w_star @ mu)
var_p = float(w_star @ Sigma @ w_star)
sharpe = mu_p / np.sqrt(var_p)
return {
"weights": w_star,
"expected_return": mu_p,
"variance": var_p,
"sharpe": sharpe,
}
跑一遍 two_asset_mv(np.array([0.08, 0.12]), np.array([0.15, 0.25]), 0.30, 2.0),得到 、、、Sharpe 。验证 ,你会看到 (沪深300,较低 、较低 的那只)单调上升——风险厌恶越强,越向低风险资产倾斜,正是教科书直觉。
Formula Explorer
mu - (gamma/2) * Sigma * w练习
Exercise
给定两只 ETF 的 2018-01 至 2023-12 月度收益(cn:510300 沪深300 ETF 与 510500 中证500 ETF)。
(i) 从收益序列计算样本 mu(月均值乘 12 年化)、样本 sigma(月标准差乘 sqrt(12) 年化)、相关系数 rho。
(ii) 在 gamma = 2 下用闭式 two_asset_mv(mu, sigma, rho, gamma=2.0) 求解无约束两资产 MV;报告 weights、expected_return、variance、sharpe。
(iii) 让 gamma 在 [0.5, 1.0, 2.0, 5.0, 10.0] 取值,产出 (gamma, w_1, expected_return, variance, sharpe) 表;验证低 / 低 那只资产的 随 gamma 单调上升(教科书风险厌恶直觉)。
(iv) 引入无风险资产 r_f = 0.025(年化),在超额收益空间内以 gamma = 2 重新求解无约束 MV;报告新的 weights(只是风险资产权重, 是现金残差)。
(v) 比较 gamma in [0.5, 1.0, 2.0, 5.0] 下含无风险资产时的风险资产方向 ;验证方向在不同 gamma 下保持不变(L2 将正式证明的单基金分离前置结果)。
提示
mu、sigma、rho 入手,先把 显式写出来:Sigma = [[sigma[0]**2, rho*sigma[0]*sigma[1]], [rho*sigma[0]*sigma[1], sigma[1]**2]],再代入 two_asset_mv 即可。提示
gamma,把 weights / weights.sum() 打出来——你会看到这个标准化后的向量在 gamma 之间几乎相同。这就是单基金分离定理的数值证据。实务延伸:为什么这套机器值得被记住
到这里所有的代数你都已经走过一遍——但在生产线上,没有人会用 plug-in MV 上线(这是 L4 整整一课的内容)。那为什么还要把 L1 拆得这么细?三个原因。
第一,均值方差优化(mean-variance optimization)是后续每一种修正——Ledoit-Wolf 收缩、Black-Litterman 贝叶斯混合、风险平价(risk parity)、最小波动率(min-vol),包括 4.4.3 的转手成本约束 QP——的基底。把它们看成 plug-in MV 的不同正则化(regularisation)路径:LW 把样本协方差矩阵的最小特征值往上拉;BL 把 上的噪声往均衡先验上拽;风险平价直接放弃 。你只有先把 plug-in MV 写得干净,才看得清这些修正到底拉了哪个参数。
第二,夏普比率(Sharpe ratio) 是这套机器的「输出」核心 KPI——任何 PM 周一开会问你的第一句都是这一行。L2 给的切线组合就是夏普最大化的解,L3 的均衡论证把市场组合的夏普换算成「市场风险溢价」(equity risk premium),L4 的 horse-race 拿样本内 / 样本外夏普做基准对比;这一行 KPI 串起整个 4.4 模块的语言。
第三,协方差矩阵(covariance matrix) 是承重墙。它是一个对称矩阵(symmetric matrix,),并且半正定(positive semidefinite)——这两条性质让 (只要矩阵正定)可以良好定义,让 QP 在原始变量上是凸问题,让 Lagrange 乘子法在 L2 能给出闭式解。任何对 的修正——LW 收缩、Barra 风格因子分解 、收缩到常相关结构——都必须保持半正定。
把这三件事记在桌面上,后续 L2–L4 的每一步都会自洽。
通向 L2:从两资产到 N 资产的闭式
两资产的代数已经吃干净。下一课把 N 资产的约束 QP 用 Lagrange 乘子法解掉,描出整条最小方差前沿(minimum-variance frontier),给出 GMV 与切线组合(也称切点组合优化问题的最优解)的闭式公式,并把单基金 / 双基金分离定理(one-fund / two-fund separation theorems)正式证出来。你今天写的 two_asset_mv 是 N 资产 Sigma^{-1} (mu - lambda \mathbf{1}) 公式的一个特例——L2 会让你看到它如何泛化。L3 把切线组合等同于市场组合,推出 CAPM 的证券市场线;L4 修复 plug-in MV 的实践失败。