trading/doc_05_portfolio_optimizati...

24 KiB
Raw Permalink Blame History

组合优化详解

quant_portfolio_optimization_demo.py 学习文档

目标读者:量化入门者,已完成前四篇学习
配套文件quant_portfolio_optimization_demo.py
系列位置:第 5 篇 — 组合优化篇


目录

  1. 为什么需要组合优化?
  2. 核心数学框架:均值-方差优化
  3. 协方差矩阵估计:从样本到收缩
  4. 有效前沿与资本市场线
  5. 三种特殊组合
  6. 风险平价:不依赖预期收益的方法
  7. Black-Litterman 模型:贝叶斯框架
  8. 带约束的组合优化
  9. 滚动回测:五策略横向对比
  10. 结果解读
  11. 术语速查表

1. 为什么需要组合优化?

1.1 从"选股"到"构建组合"

前几篇 Demo 告诉我们如何选择好股票Alpha 因子)。但知道哪些股票好之后,下一个问题是:

"我手里有 20 只股票,分别该买多少?"

这个问题看似简单,但影响极大:

方案1每只股票买 5%(等权,最简单)
方案2只买最好的 3 只,各 33%(过度集中)
方案3根据各股的风险-收益特性,科学分配权重 ← 这就是组合优化

1.2 多元化的数学价值

多元化 (Diversification) 的精华在于:不同资产的涨跌不完全同步(相关系数 < 1组合的风险可以低于各资产风险的加权平均

\sigma_p = \sqrt{\sum_i \sum_j w_i w_j \sigma_{ij}} \leq \sum_i w_i \sigma_i

其中 \sigma_{ij} = \rho_{ij} \sigma_i \sigma_j 是协方差,\rho_{ij} 是相关系数。

\rho_{ij} < 1 时,等号不成立,组合波动率严格小于各股波动率的加权平均。

直觉例子:

资产 波动率 情景
科技股 A 30% 经济好时大涨,经济差时大跌
医疗股 B 25% 与经济景气关联较小,独立波动
A+B 等权 20%(低于 27.5% 两者不完全相关,组合风险被"稀释"

1.3 优化的目标

Harry Markowitz (1952) 在诺贝尔奖论文中指出,理性投资者应该:

在承担相同风险的前提下,选择期望收益最高的组合;
在期望相同收益的前提下,选择风险最小的组合。

这就是"均值-方差框架 (Mean-Variance Framework)"的核心逻辑。


2. 均值-方差优化Mean-Variance Optimization

2.1 问题形式

组合优化的数学问题可以写成:

\boxed{\min_{w}\ w'\Sigma w \quad \text{subject to} \quad w'\mu = \mu^*, \quad \mathbf{1}'w = 1, \quad w \geq 0}
符号 含义
w 权重向量 (weight vector), shape (N, 1)
\Sigma 协方差矩阵 (covariance matrix), shape (N, N)
\mu 预期收益向量 (expected return vector), shape (N, 1)
\mu^* 目标收益率 (target return)
\mathbf{1}'w = 1 全投资约束 (full investment constraint)
w \geq 0 多头约束 (long-only constraint)

这个问题在不同目标收益率 \mu^* 下重复求解,就得到了有效前沿

2.2 算法SLSQP序列二次规划

本 Demo 使用 scipy.optimize.minimize 的 SLSQP 方法:

SLSQP = Sequential Least Squares Programming
       序列二次规划法

SLSQP 每轮迭代将非线性约束优化问题近似为一个二次规划 (QP) 子问题,逐步收敛到最优解。

from scipy.optimize import minimize

result = minimize(
    objective,                   # 目标函数(如最小化组合方差)
    w0,                          # 初始权重(等权作为起点)
    method='SLSQP',
    bounds=[(0.0, 1.0)] * N,    # 权重区间:[0%, 100%]
    constraints=[
        {'type': 'eq', 'fun': lambda w: sum(w) - 1}  # 权重之和 = 1
    ],
    options={'ftol': 1e-12, 'maxiter': 1500}
)

2.3 组合的三个核心指标

给定权重 $w$、预期收益 $\mu$、协方差矩阵 $\Sigma$,可以计算:

指标 公式 说明
组合收益率 r_p = w'\mu 各股收益的加权平均
组合波动率 \sigma_p = \sqrt{w'\Sigma w} 关键!非线性,受协方差影响
夏普比率 SR = (r_p - r_f) / \sigma_p 单位风险的超额收益,越高越好

3. 协方差矩阵估计

3.1 为什么协方差矩阵很重要?

组合优化的结果对协方差矩阵的估计极其敏感。\Sigma 的一个小误差,可能导致组合权重大幅波动——这是 Markowitz 框架在实践中最大的挑战。

3.2 样本协方差矩阵的问题

\hat{\Sigma}_{sample} = \frac{1}{T-1} \sum_{t=1}^{T} (r_t - \bar{r})(r_t - \bar{r})'

问题1维度诅咒 (Curse of Dimensionality)
估计一个 N 只股票的协方差矩阵,需要估计 N(N+1)/2 个参数。
20 只股票 → 210 个参数50 只股票 → 1275 个参数
当 T样本长度与 N资产数量之比较小时如 T/N < 5估计误差极大。

问题2条件数过高 (High Condition Number)

条件数 (Condition Number) = 最大特征值 / 最小特征值

条件数高意味着矩阵"病态"——求逆时微小误差被放大,优化结果不稳定。

3.3 Ledoit-Wolf 收缩估计

核心思想:将样本协方差矩阵向一个"结构化目标"方向收缩:

\hat{\Sigma}_{LW} = (1-\alpha) \hat{\Sigma}_{sample} + \alpha \cdot F

其中:

  • F 是目标矩阵(如"单位矩阵×平均方差"),结构简单,估计误差小
  • \alpha最优收缩系数(由数据自动决定,不需手动调参)

收缩的直觉

  • 样本协方差:复杂,可能过度拟合历史数据
  • 目标矩阵:简单,但忽略了资产间真实相关性
  • 收缩后:二者的折中,在偏差和方差之间取平衡
from sklearn.covariance import LedoitWolf
lw = LedoitWolf()
lw.fit(return_data)
cov_shrunk      = lw.covariance_   # 收缩后的协方差矩阵
shrink_coeff    = lw.shrinkage_    # 最优收缩系数 α(自动计算)

本 Demo 结果

  • 样本协方差条件数35.4
  • 收缩后条件数34.0(收缩系数 α = 0.0098,很小 → 本数据质量较好,无需大幅收缩)

4. 有效前沿与资本市场线

4.1 有效前沿Efficient Frontier

有效前沿是所有"帕累托最优"组合的集合:

  • 在相同波动率下,收益最高
  • 在相同收益下,波动率最低

有效前沿由两个端点确定:

  • 左端点:全局最小方差组合 (GMV)——风险最低的点
  • 右端点:单只股票(预期收益最高的那只,极度集中)
       ▲ 收益率
       │         ×  ×       ←← 有效前沿
       │       ×    MaxSharpe ●
       │     ×    MinVar ●
       │   ×   ×   ×× × × ×
       │────────────────────→ 波动率

位于有效前沿左下方的是"劣势组合"——存在一个前沿组合,既有更高收益、又有更低风险。

4.2 资本市场线Capital Market Line, CML

引入无风险资产(如国债,年化收益率 $r_f = 2%$)后:

  • 投资者可以在"无风险资产"和"某个风险组合"之间分配资金
  • 最优的风险组合就是从 r_f 出发,与有效前沿相切的那点——切线组合 (Tangency Portfolio),也叫最大夏普组合

资本市场线的方程:

r_p = r_f + SR_{tangency} \times \sigma_p
  • 斜率 SR_{tangency} 就是切线组合的夏普比率
  • 任何有效投资者都应该持有切线组合(可以加上无风险资产来调节总风险)

5. 三种特殊组合

5.1 等权组合Equal Weight, EW

w_i = \frac{1}{N} \quad \forall i

优点

  • 最简单,无需任何参数估计
  • 对估计误差完全免疫
  • 实证研究发现,等权组合在许多市场中难以被复杂模型超越("1/N 难题"

缺点

  • 完全忽略各股的风险差异(高波动股和低波动股同等对待)
  • 没有利用任何收益预测信息

5.2 最小方差组合Minimum Variance Portfolio, MinVar

\min_w\ w'\Sigma w \quad \text{s.t.}\ \mathbf{1}'w=1,\ w\geq 0

重要特点完全不需要预期收益 \mu 的估计!

这是一个极大的优势——预期收益 \mu 是非常难以估计的,而协方差矩阵 \Sigma 相对更稳定(因为波动率和相关性的历史规律更具持久性)。

适用场景:投资者没有可靠的收益预测,但希望最小化风险。

本 Demo 结果

  • 收益 12.5%,波动 18.5%(所有策略中最低!),夏普 0.57
  • 回测中夏普 1.005 — 体现了低波动的稳健性

5.3 最大夏普组合Maximum Sharpe / Tangency Portfolio

\max_w\ \frac{w'\mu - r_f}{\sqrt{w'\Sigma w}} \quad \text{等价于}\ \min_w\ -\text{SR}

这是理论上最优的风险组合,但高度依赖对 \mu 的准确估计。

实践中的问题:

  1. 误差传导\mu 的估计误差被优化器"放大",产生极端权重
  2. 集中效应:最大夏普组合常常把权重集中在少数几只"看起来最好"的股票上
  3. 过拟合:历史中表现好的股票,未来未必继续好

本 Demo 结果

  • 收益 50.4%,波动 29.7%(最高!),夏普 1.63(基于全期数据的理论值)
  • 回测夏普 0.844 — 因为样本内最优 ≠ 样本外最优,存在过拟合

6. 风险平价Risk Parity

6.1 核心思想

等权组合 → 权重相等 → 但高波动股对组合风险贡献更大!

风险平价 → 风险贡献相等 → 每只股票对总风险的贡献相同

等权组合中:
  低波动股(σ=15%)权重 5% → 风险贡献 很小
  高波动股(σ=35%)权重 5% → 风险贡献 很大  ← 实际上被高波动股"主导"

风险平价组合:
  低波动股(σ=15%)权重 大≈10%)→ 风险贡献 = 1/N
  高波动股(σ=35%)权重 小≈2%)→ 风险贡献 = 1/N  ← 真正均衡

6.2 风险贡献的数学

边际风险贡献 (Marginal Risk Contribution, MRC)

\text{MRC}_i = \frac{\partial \sigma_p}{\partial w_i} = \frac{(\Sigma w)_i}{\sigma_p}

绝对风险贡献 (Risk Contribution, RC)

\text{RC}_i = w_i \times \text{MRC}_i = \frac{w_i \cdot (\Sigma w)_i}{\sigma_p}

验证$\sum_i \text{RC}_i = \sigma_p$(各股风险贡献之和 = 总波动率)

等风险贡献条件

\frac{\text{RC}_i}{\sigma_p} = \frac{1}{N} \quad \Leftrightarrow \quad w_i \cdot (\Sigma w)_i = w_j \cdot (\Sigma w)_j \quad \forall i, j

6.3 风险平价的优化问题

\min_w \sum_i \left(\frac{\text{RC}_i}{\sigma_p} - \frac{1}{N}\right)^2

这是一个非线性最小二乘问题(没有解析解),需要数值优化求解。

def objective(w):
    rc, sigma_p = risk_contributions(w, cov)
    rc_pct = rc / sigma_p           # 各资产风险贡献占比
    target = 1.0 / N                # 目标1/N
    return np.sum((rc_pct - target) ** 2)

本 Demo 结果

  • 各股 RC 最大偏差 = 0.000(完美等风险贡献!)
  • 收益 9.5%,波动 21.0%,夏普 0.36(因为低波动持仓更多低收益股)

6.4 风险平价的适用场景

场景 适合 理由
没有可靠的收益预期 不需要 μ 估计
管理多资产配置(股债商品) 各资产类别风险差异大
需要稳健的长期策略 比最大夏普更稳定
单一股票池、收益差异明显 可能过于保守

7. Black-Litterman 模型

7.1 Markowitz 框架的根本缺陷

对预期收益的"蝴蝶效应"

Markowitz 优化是一个"误差放大器"——\mu 哪怕有 1% 的估计误差,权重可能变动 30%+。这导致实际使用中,最大夏普组合常常产生极度集中的"角点解"。

Black-Litterman1990给出了一个优雅的解决方案从市场均衡出发,而不是从历史均值出发

7.2 三步 BL 框架

第一步:建立先验(市场均衡隐含收益)

市场是所有投资者信息的综合。如果市场是均衡的,当前市值加权组合 w_{mkt} 就是所有投资者的"最优"选择。

反向推导这个最优选择对应的隐含收益CAPM 均衡):

\Pi = \delta \cdot \Sigma \cdot w_{mkt}
符号 含义
\Pi 市场均衡隐含超额收益 (Market-implied excess returns)
\delta 市场风险厌恶系数,通常取 2.0~3.0
\Sigma 协方差矩阵
w_{mkt} 市值权重组合 (Market cap weights)

这个先验的优点:总是给出合理的、多元化的权重,不会产生极端集中。


第二步:表达投资者观点

投资者可以输入对特定股票(或组合)的主观看法:

观点矩阵 P (View matrix, K × N):
  P[k, i] = 股票 i 在观点 k 中的权重(正=多头,负=空头)

观点收益向量 Q (View returns, K × 1):
  Q[k] = 观点 k 的预期超额收益

观点不确定性矩阵 Ω (View uncertainty, K × K 对角矩阵):
  Ω[k,k] 越大 = 对第 k 个观点越不自信

本 Demo 的两个观点:

# 观点1绝对观点: "S01 的年化超额收益将达到 +5%"
P[0, 1] = 1.0
Q[0]    = 0.05

# 观点2相对观点: "S00 将比 S04 多赚 3%"
P[1, 0] = +1.0   # S00 多头
P[1, 4] = -1.0   # S04 空头
Q[1]    = 0.03

第三步:贝叶斯更新,求后验预期收益

\mu_{BL} = \underbrace{\left[(\tau\Sigma)^{-1} + P'\Omega^{-1}P\right]^{-1}}_{\text{精度矩阵之和的逆}} \cdot \underbrace{\left[(\tau\Sigma)^{-1}\Pi + P'\Omega^{-1}Q\right]}_{\text{加权均值向量}}

直观理解:

  • (\tau\Sigma)^{-1} 越大 → 先验越"确定",后验越接近先验 \Pi
  • \Omega^{-1} 越大 → 观点越"确定",后验越接近观点 Q
  • \tau 是先验的"置信度调节参数",通常取 0.025~0.10

本 Demo 结果

  • BL 将 S00观点2的受益者权重从 5%(等权)调升至 17.1%
  • 后验收益比均衡先验更集中在观点受益股
  • 回测中 BL 夏普 1.107Calmar 1.51——所有策略中最优

7.3 BL vs 直接 Markowitz

直接 Markowitz Black-Litterman
先验 历史均值(含估计误差) 市场均衡(反向优化,更稳定)
观点融入 直接修改 μ(极端敏感) 贝叶斯混合(平滑过渡)
结果 容易极度集中 分散化程度好
无观点时 结果无意义 退回到市值加权

8. 带约束的组合优化

8.1 为什么需要约束?

纯粹的 Markowitz 优化常常产生:

  • 单只股票权重 40%+(过度集中)
  • 某行业权重 0%(完全空缺某一行业的风险敞口)
  • 与上期持仓相差 80%(极高换手率 → 高交易成本)

实际组合管理需要通过约束来控制这些问题。

8.2 三类常见约束

约束1权重上下限集中度管理

bounds = [(0.0, 0.15)] * N   # 每只股票0% ≤ w_i ≤ 15%

约束2行业权重区间

# 每行业权重在 10%~35% 之间
for sector_indices in SECTORS.values():
    constraints.append({
        'type': 'ineq',
        'fun': lambda w: sum(w[sector_indices]) - 0.10   # ≥ 10%
    })
    constraints.append({
        'type': 'ineq',
        'fun': lambda w: 0.35 - sum(w[sector_indices])   # ≤ 35%
    })

约束3换手率约束交易成本控制

# 本期与上期权重的 L1 距离 ≤ 50%
# L1 distance = Σ |w_new,i - w_old,i|
constraints.append({
    'type': 'ineq',
    'fun': lambda w: 0.50 - np.sum(np.abs(w - w_prev))
})

本 Demo 结果(带约束最大夏普)

  • 夏普 0.94vs 无约束的 1.63)——约束降低了理论最优解的质量
  • 但实际上更可行:最大单股 15%,各行业 10%~35%,约束全部满足 ✓

8.3 约束与优化效率的权衡

约束越多 → 可行域越小 → 最优解越差(理论值)
约束越多 → 组合越分散 → 实际表现可能更好(防止过拟合)

这是组合管理的核心矛盾:理论最优 vs 实践可行


9. 滚动回测

9.1 滚动回测的必要性

如果用全量历史数据估计 \mu 和 $\Sigma$,再用"最优"权重买入,实际上使用了未来信息(前视偏差 / Look-Ahead Bias——这样的回测结果不真实。

正确做法滚动窗口Walk-Forward回测

时间轴:  ──────── LOOKBACK ──────────────── 测试期 ──────────

  t=0                 t=126      t=147      t=168  ...
  │─── 估计期 126 天 ──│─ 持有21天 ─│─ 持有21天 ─│
         ↑                 ↑
       估计 μ、Σ         用新数据重新估计,重新优化

9.2 调仓流程

for t in rebalance_dates:
    # ① 用过去 126 天历史估计 μ 和 Σ
    hist     = returns.iloc[t-126 : t]
    mu_roll  = hist.mean() * 252
    cov_roll = hist.cov() * 252

    # ② 用当前估计重新计算各策略权重
    w_minvar    = min_variance(mu_roll, cov_roll)
    w_maxsharpe = max_sharpe(mu_roll, cov_roll)
    # ...

    # ③ 持有到下次调仓日,每日记录组合收益
    for d in range(t, next_rebalance):
        portfolio_return = w @ returns.iloc[d]

9.3 五策略对比结果

策略 年化收益 年化波动 夏普比率 最大回撤 Calmar
等权 EW 17.6% 22.4% 0.70 -22.3% 0.79
最小方差 MinVar 21.6% 19.5% 1.00 -22.1% 0.98
最大夏普 MaxSharpe 25.0% 27.2% 0.84 -24.5% 1.02
风险平价 RP 17.3% 21.6% 0.71 -21.7% 0.80
Black-Litterman BL 25.6% 21.3% 1.11 -16.9% 1.51

10. 结果解读

10.1 最小方差 vs 等权

MinVar 收益比等权高 4%,波动比等权低 3%——用更复杂的优化换来了双向改善。
这通常在样本量充足、协方差估计可靠时发生。

10.2 最大夏普的"过拟合"现象

理论值Sharpe = 1.63(全量数据)
回测值Sharpe = 0.84(样本外)

下降 50%——这就是过拟合的代价。滚动窗口估计出的 \mu 不稳定,每次重估都有误差,导致权重频繁剧烈变动。

10.3 Black-Litterman 为什么最好?

  1. 先验稳定:从市场均衡出发,不过度依赖嘈杂的历史均值
  2. 观点有效:本 Demo 中 S00/S01科技/金融)确实注入了较高的 Alpha观点与真实 Alpha 方向一致
  3. 不极端集中:贝叶斯混合平滑了权重,避免了角点解

注意如果投资者观点是错误的BL 的结果可能比等权更差。BL 的价值在于"正确观点"的放大,而不是错误观点的保护。

10.4 Calmar 比率与最大回撤

\text{Calmar} = \frac{\text{年化收益}}{\text{最大回撤绝对值}}

BL 策略 Calmar = 1.51,最大回撤仅 -16.9%,说明在每次大幅下跌时损失相对可控。这对于风险管理 (Risk Management) 极为重要——一个持续盈利但某年大幅亏损的策略,在实际操作中往往难以坚持。


11. 术语速查表

中文 English 简要说明
组合优化 Portfolio Optimization 在约束下选择最优资产权重
均值-方差框架 Mean-Variance Framework Markowitz (1952) 的经典框架
权重向量 Weight Vector (w) 各资产的持仓比例
协方差矩阵 Covariance Matrix (Σ) 资产收益率的协方差关系矩阵
预期收益向量 Expected Return Vector (μ) 各资产的预期年化收益率
多元化 Diversification 持有多种相关性低的资产,降低整体风险
有效前沿 Efficient Frontier 给定风险下收益最高的组合集合
全局最小方差组合 Global Minimum Variance Portfolio (GMV) 有效前沿的左端点,风险最低
切线组合 Tangency Portfolio 资本市场线与有效前沿的切点,即最大夏普组合
资本市场线 Capital Market Line (CML) 从无风险利率到切线组合并延伸的直线
最大夏普组合 Maximum Sharpe Portfolio 夏普比率最高的组合
无风险利率 Risk-Free Rate (Rf) 国债等无风险资产的收益率
夏普比率 Sharpe Ratio (收益-无风险利率) / 波动率,衡量风险调整后收益
Calmar 比率 Calmar Ratio 年化收益 / 最大回撤,衡量下行风险调整后收益
最大回撤 Maximum Drawdown (MDD) 历史上从高点到低点的最大跌幅
样本协方差 Sample Covariance 用历史数据直接计算的协方差矩阵
条件数 Condition Number 矩阵最大特征值/最小特征值之比,衡量矩阵"病态"程度
Ledoit-Wolf 收缩 Ledoit-Wolf Shrinkage 将样本协方差向结构化目标收缩,减少估计误差
收缩系数 Shrinkage Coefficient (α) Ledoit-Wolf 中收缩强度的参数,由数据自动决定
风险平价 Risk Parity 每只资产对组合总风险贡献相等的配置方法
边际风险贡献 Marginal Risk Contribution (MRC) 增加该资产权重时组合波动率的变化率
风险贡献 Risk Contribution (RC) 某资产对组合总风险的绝对贡献量
Black-Litterman Black-Litterman (BL) 贝叶斯框架,融合市场均衡先验与投资者观点
先验 Prior 贝叶斯框架中引入观测数据之前的信念
后验 Posterior 贝叶斯更新后,融合先验与观测的新信念
观点矩阵 View Matrix (P) 表达投资者观点的矩阵K观点 × N资产
观点收益向量 View Returns Vector (Q) 各观点的预期收益
观点不确定性矩阵 View Uncertainty Matrix (Ω) 对角矩阵,表达对各观点的置信度
市场均衡隐含收益 Market Equilibrium Implied Returns (Π) CAPM均衡下对应市值加权组合的隐含预期收益
风险厌恶系数 Risk Aversion Coefficient (δ) 衡量投资者对风险-收益权衡的偏好参数
绝对观点 Absolute View 对某资产预期收益的绝对判断(如"S01 将涨 5%"
相对观点 Relative View 对两资产相对表现的判断(如"A 比 B 多赚 3%"
全投资约束 Full Investment Constraint Σw_i = 1所有资金都投入
多头约束 Long-Only Constraint w_i ≥ 0不允许卖空
权重上限 Weight Upper Bound 单只资产的最大持仓比例限制
行业权重约束 Sector Weight Constraint 限制某一行业的总持仓比例范围
换手率约束 Turnover Constraint 限制新旧权重变化总量,控制交易成本
换手率 Turnover Σ
前视偏差 Look-Ahead Bias 回测中错误地使用了未来才能获得的数据
滚动回测 Rolling / Walk-Forward Backtest 用历史窗口估计参数,样本外验证的正确回测方式
SLSQP Sequential Least Squares Programming 序列最小二乘规划法scipy 中常用的约束优化算法
过拟合 Overfitting 模型过度拟合历史数据,样本外表现大幅下降
角点解 Corner Solution 优化结果极度集中在少数资产,非分散化的极端解
误差传导 Error Propagation 输入参数的微小误差被优化器放大后产生极端结果
风险分散 Risk Diversification 通过多资产配置降低总组合风险的过程
行业暴露 Sector Exposure 组合对某一行业的权重,影响风格风险

上一篇:Alpha 因子研究


附录:系列文档导航

文件 文档 核心内容
第 1 篇 quant_data_pipeline_demo.py doc_01_data_pipeline.md 复权、收益率、缺失值、异常值、涨跌停
第 2 篇 quant_strategy_backtest_demo.py doc_02_strategy_backtest.md 技术指标、策略逻辑、向量化回测、绩效指标
第 3 篇 quant_event_driven_backtest_demo.py doc_03_event_driven_backtest.md 事件驱动架构、6大组件、成本模型
第 4 篇 quant_alpha_factor_demo.py doc_04_alpha_factor.md 因子构建、IC/ICIR、分层回测、因子合成、多空组合
第 5 篇 quant_portfolio_optimization_demo.py doc_05_portfolio_optimization.md MVO、有效前沿、MinVar、MaxSharpe、风险平价、BL、约束优化