1. 课程导入

欢迎进入《均值方差资产配置与约束优化实战》。在正式动手写代码之前,我们需要先建立一张“认知地图”:均值方差模型到底在解决什么问题,它的数学骨架是什么,为什么必须引入约束优化,以及本课程会用哪些工具把理论落到可运行、可复现的工程实现上。本章不追求公式推导的完整细节,而是帮助你在脑中形成一条从“投资目标”到“权重输出”的清晰链路。

一、核心思想:用期望与方差刻画“收益—风险”权衡

均值方差资产配置(Mean-Variance Asset Allocation)由马科维茨于1952年提出,其核心思想可以用一句话概括:在给定预期收益水平下,寻找风险最小的组合;或在给定风险水平下,寻找预期收益最大的组合。这里的“均值”指资产或组合的预期收益率,“方差”指收益率的波动程度,用来代理风险。

把多个资产放在同一坐标系中,横轴为组合波动率,纵轴为组合预期收益,所有可行组合构成一个区域,其左上边界就是著名的有效前沿。有效前沿上的每一个点,都代表一个“不浪费风险”的最优组合。投资者的偏好不同,最终选择的点也不同:风险厌恶程度高的人靠近左下方,追求收益的人靠近右上方。

但真实投资远不止“收益—风险”两个维度。现实中存在大量限制:不能卖空、单资产权重上限、行业暴露约束、换手率约束、最小交易单位等。因此,本课程强调约束优化:把均值方差作为目标函数,把现实规则写成约束条件,用数值优化方法求解。这也是从教科书模型走向实战组合管理的关键一步。

均值方差核心思想:有效前沿与约束优化 组合波动率 σ 预期收益 μ 有效前沿 最小方差组合 均衡组合 高收益组合 可行组合区域 受权重与卖空约束 约束优化求解 min wᵀΣw s.t. Σw=1, w≥0

二、学习目标:从理解模型到交付可运行策略

本课程的学习目标分为四个层次,建议你在学习过程中不断对照检查:

  • 概念层:理解均值、方差、协方差、有效前沿、夏普比率、风险厌恶系数等核心概念,能用自己的话解释“为什么分散化能降低组合风险”。
  • 方法层:掌握从数据获取、收益率估计、协方差矩阵估计,到约束建模、优化求解、结果诊断的完整流程。
  • 工具层:能够使用 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。

五、常见误区与复盘:先避开三个“坑”

在正式进入后续章节前,先了解初学者最容易踩的三个误区,可以显著提升学习效率:

  1. 把历史均值直接当作未来预期收益。历史收益噪声极大,直接代入会导致权重极端集中。后续课程会介绍收缩估计、因子模型与鲁棒优化等方法。
  2. 忽略约束导致“数学最优但不可执行”。无约束均值方差模型经常给出巨额空头或单一资产满仓的结果,现实中无法交易。约束不是限制,而是让模型贴近现实的必要手段。
  3. 只看最优权重,不看求解状态与敏感性。优化结果对输入参数非常敏感,必须检查求解器状态、权重稳定性与换手率,否则回测很容易“过拟合”。
重要提醒:均值方差模型是资产配置的起点,而不是终点。它提供了一套严谨的“收益—风险”语言,但真正决定策略成败的,往往是输入估计的质量、约束设计的合理性以及再平衡纪律。

现在,你已经掌握了本课程的核心思想、学习目标、整体框架与工具概览。接下来,我们将从最基础的收益与风险度量开始,逐步搭建属于你自己的资产配置系统。