← 返回模块
4.4.1.1beta 可读 · 未来免费校验通过内容版本 2026-05-28

均值方差基础:效用与投资问题

4.4.1 · 均值方差与投资组合理论 · 量化全流程

周一上午,你在某沪上私募基金的组合构建台,PM 把一个文件丢到你桌上:沪深300 成份股加上一篮子中证500 小盘票,共 500 只,每只都给了下一季度的预期收益 μi\mu_i;另外附一张 500×500 的协方差矩阵 Σ\Sigma,是研究部用 60 个月滚动样本估出来的。PM 的指令只有一句:「按这个开个仓,目标年化波动 12%。」

你面前的问题就是单期(single-period)投资问题:在时刻 0 选一组权重 wRNw \in \mathbb{R}^N,在时刻 1 兑现一个随机的组合收益 rp=wrr_p = w' r。这堂课不解决「μ\mu 怎么来」(那是 4.2 / 4.3 的题目)、也不解决「Σ\Sigma 估不准怎么办」(那是本模块第 4 课的题目),它只解决一件事:​​给定 μ\muΣ\Sigma,怎么把它们转成一个权重向量​​。这就是 Markowitz 在 1952 年那篇《Portfolio selection》(JF)写的东西——也是后续三堂课的母题。

术语对齐表

在进入数学之前,先把本课用到的核心术语对应到行业的规范译名(canonical glossary 形式),后续散文与代码中你看到的就是这些标准词:​​组合优化​​(portfolio optimization,即广义的投资组合优化数值过程)、​​均值方差优化​​(mean-variance optimization, MVO,Markowitz 框架本身)、​​夏普比率​​(Sharpe ratio,(E[r]rf)/σ(E[r] - r_f)/\sigma)、​​协方差矩阵​​(covariance matrix,核心组合风险对象)、​​对称矩阵​​(symmetric matrix,A=ATA = A^T,协方差矩阵是其典型例子)、​​半正定​​(positive semidefinite, PSD,xTAx0x^T A x \ge 0 对所有 xx 成立)。这些译名出自 data/glossaries/quant-glossary.yaml 标准表,不要在课内自创替代译。

单期投资框架:三个原语和一个假设

把整套机器拆开,只剩三个原语(primitives)。下面是 ​Inline-code listing​ 中给出的固定记忆顺序:

mu      = E[r]            # N-向量,资产预期收益
Sigma   = Cov(r, r)        # N x N,半正定协方差矩阵
r_f     = r_f              # 标量,无风险利率(可选)

muSigma 在 L1–L3 中都被当作​​已知​​(known)处理;L4 会拆掉这个假设,把估计误差、收缩、Black-Litterman 那一套补上。

权重向量 ww 满足预算约束 1w=1\mathbf{1}' w = 1——目前不允许杠杆,允许做空(long-only 是 4.4.3 的题目)。组合收益、预期收益、组合方差按下面三个恒等式给出:

rp=wr,E[rp]=wμ,Var(rp)=wΣw.r_p = w' r, \quad E[r_p] = w' \mu, \quad \mathrm{Var}(r_p) = w' \Sigma w.

这三个量是后续所有推导的承重墙。投资期是​​一个周期​​——Merton 1969 的多期动态投资问题(intertemporal portfolio choice)不在本模块,留给高阶选修。

为什么是均值方差?两个独立的辩护

vNM 公理(完备性、传递性、连续性、独立性)给出一条结论:一个理性投资者(rational investor)在期末财富 W1=W0(1+rp)W_1 = W_0 (1 + r_p) 上极大化 E[U(W1)]E[U(W_1)],其中 UU 是凹效用函数(concavity 等价于风险厌恶)。这是期望效用(expected utility)框架,记号上写作 maxwE[U(W1)]\max_w E[U(W_1)]

但本模块不打算求一个一般的 E[U(W1)]E[U(W_1)]——我们要把它​​坍缩到只看均值和方差​​。有两条独立的辩护路径。下面是 ​Inline-code listing​ 中按固定顺序排列的两条理由:

quadratic_utility:  U(W) = W - (gamma/2) * W^2
gaussian_returns:   r ~ N(mu, Sigma)

第一条是​​二次效用​​(quadratic utility)。如果 U(W)=W(γ0/2)W2U(W) = W - (\gamma_0/2) W^2,代入期望算子就有:

E[U(W)]=E[W](γ0/2)E[W2]=E[W](γ0/2)(Var(W)+E[W]2).E[U(W)] = E[W] - (\gamma_0/2) \, E[W^2] = E[W] - (\gamma_0/2) \, \big( \mathrm{Var}(W) + E[W]^2 \big).

这是均值和方差的函数——精确成立,不需要任何额外假设。把 γ=γ0W0\gamma = \gamma_0 W_0 代换回收益空间,就得到本模块的规范目标函数。代价是:二次效用并非全局递增(超过某个财富水平 U(W)<0U'(W) < 0,人变得「越富越想亏」,这显然违反常识);更糟的是它的 Arrow-Pratt 绝对风险厌恶系数随财富​​上升​​(增厌恶),而实证上几乎所有人是减厌恶。

第二条是​​高斯收益​​(Gaussian returns)。如果 rN(μ,Σ)r \sim N(\mu, \Sigma),那么对​​任何​​凹效用函数 UU,E[U(W1)]E[U(W_1)] 都只依赖 (E[rp],Var(rp))(E[r_p], \mathrm{Var}(r_p))——因为高斯分布的所有矩都由前两阶矩决定。代价是:真实资产收益有厚尾(equities 的超额峰度 5–20+)、负偏(left skew)、时变波动率(time-varying volatility)。

实务上的折中:MV 是一个​​够用的近似​​(usable approximation),只要(a)持仓期较短(短窗收益更接近高斯)、(b)γ\gamma 当作校准参数而非偏好原语处理、(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)

目标函数 maxwwμ(γ/2)wΣw\max_w w' \mu - (\gamma/2) w' \Sigma w subject to 1w=1\mathbf{1}' w = 1 是关于 ww 的二次型(quadratic form)。Σ\Sigma 半正定(positive semidefinite),当 NTN \le T 时通常正定。约束是一条线性等式,所以整个问题是带等式约束的二次规划(QP),Lagrange 乘子法可以解出闭式(closed-form),这部分代数交给 L2。

风险厌恶系数:两个极限定位它

γ\gamma 是风险厌恶系数(risk-aversion coefficient)——Arrow-Pratt 意义上的绝对风险厌恶(absolute risk aversion)在二次效用下的标量代理。两个极限给它定位:

  • γ0\gamma \to 0:目标函数坍缩为 maxwwμ\max_w w' \mu subject to 1w=1\mathbf{1}' w = 1,解是角点解(corner solution)——所有权重都堆在 μi\mu_i 最高的那一只资产上,其余为零。风险中性投资者的最大期望收益组合。
  • γ\gamma \to \infty:目标函数坍缩为 minwwΣw\min_w w' \Sigma w subject to 1w=1\mathbf{1}' w = 1,解是全局最小方差组合(global minimum-variance portfolio, GMV),L2 给出闭式 wgmv=(Σ11)/(1Σ11)w_{\text{gmv}} = (\Sigma^{-1} \mathbf{1}) / (\mathbf{1}' \Sigma^{-1} \mathbf{1})

典型机构校准:公募 / 私募基金等权益主动管理产品 γ[1,5]\gamma \in [1, 5];风险平价(risk parity)、低波(low-vol)产品 γ[5,20]\gamma \in [5, 20];社保 / 险资 / 大学捐赠等战略资产配置(strategic asset allocation, SAA)往往不直接校准 γ\gamma,而是设一个目标波动率(volatility target,如 8% / 10% / 12%)反推 γ\gamma——「目标年化波动 12%」就是这个工作流。

无风险资产扩展:方向和规模解耦

把 7 日 SHIBOR 或 1 年国债收益率作为无风险资产 rfr_f 引入(实务上私募的现金端常用银行间 7D 回购或货币基金代理)。预算约束变成 1w+wf=1\mathbf{1}' w + w_f = 1,目标函数在​​风险资产权重上​​变成超额收益空间的无约束(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

写成数学:

maxw  w(μrf1)γ2wΣw,wf=11w.\max_w \; w' (\mu - r_f \cdot \mathbf{1}) - \frac{\gamma}{2} w' \Sigma w, \qquad w_f = 1 - \mathbf{1}' w.

这是​​超额收益空间的无约束 MV​​——预算约束被现金权重残差(residual)吸收掉了。关键观察:解的方向 w/ww / \lVert w \rVert ​不依赖 γ\gamma​​​,只依赖超额收益向量 μrf1\mu - r_f \mathbf{1} 和协方差矩阵 Σ\Sigma;γ\gamma 只控制​​规模​​——投资者把多少钱放进风险组合、多少放在现金端。

这就是单基金分离定理(one-fund separation theorem)的雏形——所有投资者无论 γ\gamma 多少,都持有同一个风险组合方向(切线组合,tangency portfolio),只在杠杆比例上不同。L2 会用 Lagrange 乘子把这件事正式证出来。

工作示例:两资产闭式解

把整套机器收缩到 N=2N = 2,代数干净到一行能写完。取沪深300 ETF(510300)作为资产 1,中证500 ETF(510500)作为资产 2,2018–2023 月度数据估出来的瞬态值大致是 μ=(0.08,0.12)\mu = (0.08, 0.12)σ=(0.15,0.25)\sigma = (0.15, 0.25)ρ=0.30\rho = 0.30γ=2\gamma = 2,先不引无风险资产。

参数化 w2=1w1w_2 = 1 - w_1 把问题降到一维:

f(w1)=w1μ1+(1w1)μ2γ2[w12σ12+(1w1)2σ22+2w1(1w1)ρσ1σ2].f(w_1) = w_1 \mu_1 + (1 - w_1) \mu_2 - \frac{\gamma}{2} \big[ w_1^2 \sigma_1^2 + (1 - w_1)^2 \sigma_2^2 + 2 w_1 (1 - w_1) \rho \sigma_1 \sigma_2 \big].

w1w_1 求一阶条件 df/dw1=0df / dw_1 = 0,整理得 w1w_1^* 的线性方程。代码实现(下面的 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),得到 w(0.45,0.55)w^* \approx (0.45, 0.55)E[rp]0.102E[r_p^*] \approx 0.102Var(rp)0.0276\mathrm{Var}(r_p^*) \approx 0.0276、Sharpe 0.61\approx 0.61。验证 γ{0.5,1,2,5,10}\gamma \in \{0.5, 1, 2, 5, 10\},你会看到 w1w_1(沪深300,较低 μ\mu、较低 σ\sigma 的那只)单调上升——风险厌恶越强,越向低风险资产倾斜,正是教科书直觉。

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;报告 weightsexpected_returnvariancesharpe

(iii) 让 gamma[0.5, 1.0, 2.0, 5.0, 10.0] 取值,产出 (gamma, w_1, expected_return, variance, sharpe) 表;验证低 μ\mu / 低 σ\sigma 那只资产的 w1w_1gamma 单调上升(教科书风险厌恶直觉)。

(iv) 引入无风险资产 r_f = 0.025(年化),在超额收益空间内以 gamma = 2 重新求解​​无约束​ MV;报告新的 weights(只是风险资产权重,wf=11ww_f = 1 - \mathbf{1}' w 是现金残差)。

(v) 比较 gamma in [0.5, 1.0, 2.0, 5.0] 下含无风险资产时的风险资产方向 (w1,w2)/(w1+w2)(w_1, w_2) / (w_1 + w_2);验证方向在不同 gamma 下保持不变(L2 将正式证明的单基金分离前置结果)。

提示
从样本 musigmarho 入手,先把 Σ\Sigma 显式写出来:Sigma = [[sigma[0]**2, rho*sigma[0]*sigma[1]], [rho*sigma[0]*sigma[1], sigma[1]**2]],再代入 two_asset_mv 即可。
提示
(v) 中检查方向不变:对每个 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 把 μ\mu 上的噪声往均衡先验上拽;风险平价直接放弃 μ\mu。你只有先把 plug-in MV 写得干净,才看得清这些修正到底拉了哪个参数。

​第二​​,​​夏普比率​​(Sharpe ratio)(E[rp]rf)/σp(E[r_p] - r_f)/\sigma_p 是这套机器的「输出」核心 KPI——任何 PM 周一开会问你的第一句都是这一行。L2 给的切线组合就是夏普最大化的解,L3 的均衡论证把市场组合的夏普换算成「市场风险溢价」(equity risk premium),L4 的 horse-race 拿样本内 / 样本外夏普做基准对比;这一行 KPI 串起整个 4.4 模块的语言。

​第三​​,​​协方差矩阵​​(covariance matrix)Σ\Sigma 是承重墙。它是一个​​对称矩阵​​(symmetric matrix,Σ=ΣT\Sigma = \Sigma^T),并且​​半正定​​(positive semidefinite)xTΣx0x^T \Sigma x \ge 0——这两条性质让 Σ1\Sigma^{-1}(只要矩阵正定)可以良好定义,让 QP 在原始变量上是凸问题,让 Lagrange 乘子法在 L2 能给出闭式解。任何对 Σ\Sigma 的修正——LW 收缩、Barra 风格因子分解 Σ=BΣFB+D\Sigma = B \Sigma_F B' + D、收缩到常相关结构——都必须保持半正定。

把这三件事记在桌面上,后续 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 的实践失败。