1. 课程导入
欢迎进入《均值方差资产配置与约束优化实战》。在正式动手写代码之前,我们需要先建立一张“认知地图”:均值方差模型到底在解决什么问题,它的数学骨架是什么,为什么必须引入约束优化,以及本课程会用哪些工具把理论落到可运行、可复现的工程实现上。本章不追求公式推导的完整细节,而是帮助你在脑中形成一条从“投资目标”到“权重输出”的清晰链路。
一、核心思想:用期望与方差刻画“收益—风险”权衡
均值方差资产配置(Mean-Variance Asset Allocation)由马科维茨于1952年提出,其核心思想可以用一句话概括:在给定预期收益水平下,寻找风险最小的组合;或在给定风险水平下,寻找预期收益最大的组合。这里的“均值”指资产或组合的预期收益率,“方差”指收益率的波动程度,用来代理风险。
把多个资产放在同一坐标系中,横轴为组合波动率,纵轴为组合预期收益,所有可行组合构成一个区域,其左上边界就是著名的有效前沿。有效前沿上的每一个点,都代表一个“不浪费风险”的最优组合。投资者的偏好不同,最终选择的点也不同:风险厌恶程度高的人靠近左下方,追求收益的人靠近右上方。
但真实投资远不止“收益—风险”两个维度。现实中存在大量限制:不能卖空、单资产权重上限、行业暴露约束、换手率约束、最小交易单位等。因此,本课程强调约束优化:把均值方差作为目标函数,把现实规则写成约束条件,用数值优化方法求解。这也是从教科书模型走向实战组合管理的关键一步。
二、学习目标:从理解模型到交付可运行策略
本课程的学习目标分为四个层次,建议你在学习过程中不断对照检查:
- 概念层:理解均值、方差、协方差、有效前沿、夏普比率、风险厌恶系数等核心概念,能用自己的话解释“为什么分散化能降低组合风险”。
- 方法层:掌握从数据获取、收益率估计、协方差矩阵估计,到约束建模、优化求解、结果诊断的完整流程。
- 工具层:能够使用 Python 生态中的 NumPy、pandas、SciPy、CVXPY、Matplotlib 等工具完成建模与求解,并读懂求解器返回的状态与日志。
- 实战层:能够针对真实约束(权重上限、行业中性、换手率控制)调整模型,并对结果进行归因与复盘,识别“数学最优”与“投资可执行”之间的差距。
三、整体课程框架:30 章的四段式推进
整个课程共 30 章,按照“基础—建模—约束—实战”四段式推进。下表给出整体框架与各阶段重点,便于你建立全局视角。
| 阶段 | 章节范围 | 核心内容 | 阶段产出 |
|---|---|---|---|
| 基础篇 | 第 1—7 章 | 收益与风险度量、协方差矩阵、有效前沿、夏普比率、数据预处理 | 能独立计算组合收益与风险指标 |
| 建模篇 | 第 8—15 章 | 均值方差模型、二次规划形式、解析解与数值解、估计误差 | 能构建并求解无约束均值方差模型 |
| 约束篇 | 第 16—23 章 | 权重约束、卖空限制、行业暴露、换手率、基数约束、鲁棒优化 | 能把现实规则转化为优化约束 |
| 实战篇 | 第 24—30 章 | 回测框架、绩效归因、参数敏感性、组合再平衡、完整项目交付 | 能交付可复现的资产配置策略 |
四、实战工具概览:一条可复现的技术链路
本课程坚持“代码即证据”。所有模型都会给出可运行的 Python 示例,核心工具链如下:
- NumPy / pandas:负责收益率计算、协方差矩阵、数据对齐与缺失值处理。
- SciPy:使用
scipy.optimize.minimize求解中小规模二次规划问题,便于理解优化过程。 - CVXPY:用接近数学表达式的语法描述约束,适合处理权重上限、卖空限制、换手率等复杂约束。
- Matplotlib / Plotly:绘制有效前沿、权重分布、回测净值曲线与回撤图。
- Jupyter Notebook:作为实验与教学载体,保证每一步都可检查、可复现。
下面是一个最小可运行示例,展示如何用 CVXPY 表达“最小方差组合”问题。你不需要现在完全理解每一行,只需感受“目标函数 + 约束条件”的建模方式:
import cvxpy as cp
import numpy as np
# 假设已有年化协方差矩阵 Sigma
Sigma = np.array([[0.04, 0.01, 0.00],
[0.01, 0.09, 0.02],
[0.00, 0.02, 0.06]])
n = Sigma.shape[0]
w = cp.Variable(n)
objective = cp.Minimize(cp.quad_form(w, Sigma))
constraints = [
cp.sum(w) == 1, # 权重和为 1
w >= 0 # 不允许卖空
]
problem = cp.Problem(objective, constraints)
problem.solve()
print("求解状态:", problem.status)
print("最优权重:", np.round(w.value, 4))
print("组合方差:", round(problem.value, 6))
optimal,说明在当前约束下找到了全局最优解;若返回 infeasible,通常意味着约束之间互相矛盾,例如权重和必须为 1 同时又要求所有资产权重为 0。
五、常见误区与复盘:先避开三个“坑”
在正式进入后续章节前,先了解初学者最容易踩的三个误区,可以显著提升学习效率:
- 把历史均值直接当作未来预期收益。历史收益噪声极大,直接代入会导致权重极端集中。后续课程会介绍收缩估计、因子模型与鲁棒优化等方法。
- 忽略约束导致“数学最优但不可执行”。无约束均值方差模型经常给出巨额空头或单一资产满仓的结果,现实中无法交易。约束不是限制,而是让模型贴近现实的必要手段。
- 只看最优权重,不看求解状态与敏感性。优化结果对输入参数非常敏感,必须检查求解器状态、权重稳定性与换手率,否则回测很容易“过拟合”。
现在,你已经掌握了本课程的核心思想、学习目标、整体框架与工具概览。接下来,我们将从最基础的收益与风险度量开始,逐步搭建属于你自己的资产配置系统。