第 06 章 线性代数速成
一句话概括本章:线性代数是"把很多资产一起算"的记账语言。 你在 CFA 里背过两资产组合方差公式 \(w_1^2\sigma_1^2+w_2^2\sigma_2^2+2w_1w_2\rho\sigma_1\sigma_2\)。资产一多,这个公式就写不下了。矩阵记号把它压缩成 \(w^\top\Sigma w\) 一行,而且推导、编程、求最优解都变得机械化。本章就沿着"组合收益 \(w^\top r\)、组合方差 \(w^\top\Sigma w\)"这条主线,把后续各册要用的线性代数一次补齐。
本章不讲抽象的向量空间公理,也不证明定理。每个概念都回答三个问题:它在金融里对应什么、怎么算、算错了会出什么事。
学习目标
读完本章,你应该能够:
- 把组合收益、组合方差、多资产收益序列写成向量和矩阵形式,并判断矩阵乘法的维度是否匹配。
- 熟练使用转置、单位阵、逆矩阵,会用
np.linalg.solve解线性方程组,例如从附息债价格反推贴现因子。 - 说清行列式、秩、线性相关的含义,并能识别"冗余资产"导致协方差矩阵不可逆的情形。
- 理解正交与投影,知道回归残差为什么与解释变量正交。
- 手算 2×2 矩阵的特征值和特征向量,读懂主成分分析(PCA)对收益率曲线的"水平、斜率、曲度"分解。
- 判断一个矩阵是否正定,知道为什么协方差矩阵必须半正定,以及"拍脑袋"填相关系数会出什么事。
- 记住三个矩阵求导公式,并用它们推出最小方差组合和风险贡献。
6.1 向量与内积:组合收益就是一次内积
6.1.1 向量是一列有顺序的数
先看金融例子。你持有三只资产,权重分别是 50%、30%、20%。本月三只资产的收益率是 4%、10%、−2%。把它们各自排成一列:
这就是向量:一列有顺序的数。顺序很重要,第 1 个位置永远对应资产 1。含 \(n\) 个数的向量称为 \(n\) 维向量,记作 \(w\in\mathbb{R}^n\)。本书默认向量是列向量(竖着写)。横着写的叫行向量,用转置号 \(\top\) 表示:\(w^\top=(0.5,\ 0.3,\ 0.2)\)。
向量有两种基本运算,都是逐个分量做:
- 加法:\(a+b\) 的第 \(i\) 个分量是 \(a_i+b_i\)。例如两个账户的持仓股数相加。
- 数乘:\(c\,a\) 的第 \(i\) 个分量是 \(c\,a_i\)。例如把整个组合放大 2 倍杠杆。
6.1.2 内积:先对应相乘,再全部加起来
组合收益怎么算?每只资产的权重乘收益,再相加:
这个"对应相乘再求和"的操作就是内积(inner product,也叫点积):
所以组合收益 \(R_p=w^\top r\)。记号 \(w^\top r\) 读作"w 转置乘 r"。它把一个行向量和一个列向量相乘,结果是一个数(标量)。内积满足交换律:\(w^\top r=r^\top w\)。
内积还有两个常见化身:
- 权重和等于 1,写成 \(\mathbf{1}^\top w=1\)。这里 \(\mathbf{1}=(1,1,\dots,1)^\top\) 是全 1 向量。和全 1 向量做内积,就是把分量加起来。
- 组合期望收益 \(\mu_p=w^\top\mu\),\(\mu\) 是各资产期望收益组成的向量。
6.1.3 长度与夹角:相关系数是一个余弦
向量的长度(欧氏范数)定义为
两个向量的夹角 \(\theta\) 满足
这个公式在金融里有一个漂亮的解释:把两只股票的收益序列各自减去均值,得到的两个向量的夹角余弦,正好是它们的样本相关系数。
数值例子。股票 X 三天的去均值收益是 \(x=(0.02,-0.01,-0.01)\),股票 Y 是 \(y=(0.01,0,-0.01)\)(两者均值都已是 0)。
- 内积:\(x^\top y=0.0002+0+0.0001=0.0003\)。
- 长度:\(\|x\|=\sqrt{0.0006}=0.02449\),\(\|y\|=\sqrt{0.0002}=0.01414\)。
- 余弦:\(0.0003/(0.02449\times0.01414)=0.866\)。
用相关系数公式 \(\sum x_iy_i/\sqrt{\sum x_i^2\sum y_i^2}\) 算,结果完全一样。所以:
- 相关系数 \(=1\):两个向量同方向。
- 相关系数 \(=0\):两个向量垂直(正交,见 6.7 节)。
- 相关系数 \(=-1\):两个向量反方向。
这也顺带解释了为什么相关系数一定在 \([-1,1]\) 之间:余弦不可能超出这个范围。严格的依据是 Cauchy–Schwarz 不等式 \(|x^\top y|\le\|x\|\|y\|\),第 07 章会再讲。
6.2 矩阵与矩阵乘法
6.2.1 矩阵是一张数表
把 3 天、2 只资产的收益排成一张表:
这就是矩阵:\(m\) 行 \(n\) 列的数表,称为 \(m\times n\) 矩阵,记作 \(R\in\mathbb{R}^{m\times n}\)。第 \(i\) 行第 \(j\) 列的元素记作 \(R_{ij}\)。量化里最常见的约定是:行是时间,列是资产。所以 \(R_{ij}\) 是第 \(i\) 天资产 \(j\) 的收益。
向量是矩阵的特例:\(n\) 维列向量就是 \(n\times1\) 矩阵。
6.2.2 矩阵乘向量:一次算出整条组合收益序列
权重 \(w=(0.6,0.4)^\top\) 固定不变,每天的组合收益是多少?对每一行做一次内积:
这就是矩阵乘向量的规则:结果的第 \(i\) 个分量,是矩阵第 \(i\) 行与向量的内积。一行代码 R @ w 就得到了组合的日收益序列,不需要写循环。
6.2.3 矩阵乘矩阵:行乘列
一般地,\(A\) 是 \(m\times k\),\(B\) 是 \(k\times n\),乘积 \(C=AB\) 是 \(m\times n\),其中
白话:\(C\) 的第 \((i,j)\) 个元素 \(=\) \(A\) 的第 \(i\) 行与 \(B\) 的第 \(j\) 列做内积。
维度检查口诀:内侧相等才能乘,外侧决定结果。 \((m\times\underline{k})(\underline{k}\times n)\to m\times n\)。写公式时先检查维度,能挡掉一大半错误。例如 \(R\) 是 \(250\times10\)(250 天、10 只股票),\(w\) 是 \(10\times1\),则 \(Rw\) 是 \(250\times1\),即每天一个组合收益;\(R^\top R\) 是 \(10\times10\),后面会看到它和协方差矩阵密切相关。
6.2.4 矩阵乘法不交换
这是和普通数字最大的不同:一般 \(AB\neq BA\)。例子:
逐个验证 \(AB\) 的左上角:\(A\) 第 1 行 \((1,2)\) 与 \(B\) 第 1 列 \((1,3)\) 的内积 \(=1+6=7\)。
矩阵乘法满足的规则:
- 结合律:\((AB)C=A(BC)\)。
- 分配律:\(A(B+C)=AB+AC\)。
- 数乘可以随便移动:\(A(cB)=c\,AB\)。
- 不满足交换律。所以推导时不能随手交换两个矩阵的位置。
6.3 转置与二次型:组合方差 \(w^\top\Sigma w\)
6.3.1 转置
转置把矩阵的行和列互换:\((A^\top)_{ij}=A_{ji}\)。\(m\times n\) 矩阵转置后是 \(n\times m\)。例如
两条必须记住的规则:
- \((A^\top)^\top=A\)。
- \((AB)^\top=B^\top A^\top\)。转置乘积时顺序要倒过来,像"脱衣服先脱外套"。依据:等式两边的 \((i,j)\) 元素都等于 \(\sum_l A_{jl}B_{li}\)。
满足 \(A^\top=A\) 的矩阵叫对称矩阵。协方差矩阵、相关系数矩阵都是对称的,因为 \(\operatorname{Cov}(r_i,r_j)=\operatorname{Cov}(r_j,r_i)\)。
6.3.2 协方差矩阵
\(n\) 只资产的协方差矩阵 \(\Sigma\) 是 \(n\times n\) 矩阵,对角线是各资产的方差,非对角线是两两协方差:
两资产例子:\(\sigma_1=10\%\),\(\sigma_2=20\%\),\(\rho=0.3\),则 \(\Sigma_{12}=0.3\times0.1\times0.2=0.006\),
一个方便的构造方法:令 \(D=\operatorname{diag}(\sigma_1,\dots,\sigma_n)\) 为把波动率放在对角线上的对角矩阵,\(P\) 为相关系数矩阵,则 \(\Sigma=DPD\)。左乘 \(D\) 把第 \(i\) 行乘以 \(\sigma_i\),右乘 \(D\) 把第 \(j\) 列乘以 \(\sigma_j\),合起来正好是 \(\rho_{ij}\sigma_i\sigma_j\)。
6.3.3 组合方差就是一个二次型
结论:组合方差 \(\sigma_p^2=w^\top\Sigma w\)。
逐步推导:
- 组合收益 \(R_p=\sum_i w_ir_i\)(内积定义)。
- 方差对线性组合的规则(CFA 里学过):\(\operatorname{Var}(\sum_i w_ir_i)=\sum_i\sum_j w_iw_j\operatorname{Cov}(r_i,r_j)\)。
- 把 \(\operatorname{Cov}(r_i,r_j)\) 换成 \(\Sigma_{ij}\):\(\sigma_p^2=\sum_i\sum_j w_i\Sigma_{ij}w_j\)。
- 内层 \(\sum_j\Sigma_{ij}w_j\) 正是 \((\Sigma w)_i\)(矩阵乘向量的定义);外层 \(\sum_i w_i(\Sigma w)_i\) 正是 \(w^\top(\Sigma w)\)(内积定义)。
形如 \(x^\top Ax\) 的表达式叫二次型:展开后每一项都是两个分量的乘积,是"二次"的。
数值验证。用上面两资产的 \(\Sigma\),\(w=(0.6,0.4)^\top\):
- 先算 \(\Sigma w=(0.01\times0.6+0.006\times0.4,\ 0.006\times0.6+0.04\times0.4)^\top=(0.0084,\ 0.0196)^\top\)。
- 再算 \(w^\top(\Sigma w)=0.6\times0.0084+0.4\times0.0196=0.00504+0.00784=0.01288\)。
- 用 CFA 公式:\(0.36\times0.01+0.16\times0.04+2\times0.6\times0.4\times0.006=0.0036+0.0064+0.00288=0.01288\)。一致。
- 组合波动率 \(\sqrt{0.01288}=11.35\%\)。
三资产时 CFA 公式要写 3 个方差项和 3 个协方差项;100 只资产时要写 4950 个协方差项。矩阵写法始终是 \(w^\top\Sigma w\)。下面用 numpy 把三资产的例子算一遍,同时用双重求和核对。
import numpy as np
w = np.array([0.5, 0.3, 0.2]) # 三只资产的权重
r = np.array([0.04, 0.10, -0.02]) # 本月收益率
print("组合收益 w^T r =", w @ r)
vol = np.array([0.10, 0.20, 0.15]) # 年化波动率
rho = np.array([[1.0, 0.3, 0.1],
[0.3, 1.0, 0.5],
[0.1, 0.5, 1.0]]) # 相关系数矩阵
D = np.diag(vol)
Sigma = D @ rho @ D # 协方差矩阵 Σ = D R D
print("Sigma =\n", Sigma.round(5))
var_matrix = w @ Sigma @ w # 矩阵写法
var_loop = sum(w[i] * w[j] * Sigma[i, j] for i in range(3) for j in range(3)) # 双重求和
print("w^T Σ w =", round(var_matrix, 6))
print("双重求和 =", round(var_loop, 6))
print("组合波动率 =", round(np.sqrt(var_matrix), 4))
输出:
组合收益 w^T r = 0.046
Sigma =
[[0.01 0.006 0.0015]
[0.006 0.04 0.015 ]
[0.0015 0.015 0.0225]]
w^T Σ w = 0.0109
双重求和 = 0.0109
组合波动率 = 0.1044
在 numpy 里,@ 是矩阵乘法。对一维数组 w @ Sigma @ w,numpy 会自动把第一个 w 当行向量、最后一个当列向量,不需要手动转置。* 是逐元素相乘,不是矩阵乘法,这是初学者最常见的 bug。
6.3.4 线性变换后的协方差:\(\operatorname{Cov}(Ar)=A\Sigma A^\top\)
二次型的推广:如果用一个 \(k\times n\) 矩阵 \(A\) 把 \(n\) 只资产的收益变换成 \(k\) 个新组合 \(Ar\),新组合的协方差矩阵是
\(k=1\)、\(A=w^\top\) 时就退化为 \(w^\top\Sigma w\)。
数值例子:做多资产 1、做空资产 2 的价差组合,\(A=(1,-1)\)。
这个公式在多因子风险模型、对冲组合、主成分组合里反复出现。
6.4 单位阵、逆矩阵与线性方程组
6.4.1 单位阵
单位阵 \(I\) 是对角线全为 1、其余全为 0 的方阵。它在矩阵乘法里的角色就是数字 1:\(AI=IA=A\)。例如 \(I_2=\begin{pmatrix}1&0\\0&1\end{pmatrix}\)。
6.4.2 逆矩阵:矩阵的"除法"
对方阵 \(A\),如果存在 \(B\) 使 \(AB=BA=I\),就称 \(A\) 可逆,\(B\) 是它的逆矩阵,记作 \(A^{-1}\)。矩阵没有除法,"除以 \(A\)"的意思就是"乘以 \(A^{-1}\)"。
2×2 矩阵的逆有现成公式:
口诀:主对角互换,副对角变号,再除以 \(ad-bc\)。分母 \(ad-bc\) 就是下一节的行列式;它等于 0 时,逆不存在。
数值例子:\(A=\begin{pmatrix}2&1\\1&2\end{pmatrix}\),\(ad-bc=3\),\(A^{-1}=\frac13\begin{pmatrix}2&-1\\-1&2\end{pmatrix}\)。验证左上角:\(2\times\frac23+1\times(-\frac13)=1\)。
两条运算规则:
- \((AB)^{-1}=B^{-1}A^{-1}\),顺序同样倒过来。
- \((A^\top)^{-1}=(A^{-1})^\top\)。所以对称矩阵的逆也是对称的。
6.4.3 线性方程组 \(Ax=b\):从债券价格反推贴现因子
金融例子。市场上有三只年付息、面值 100 的债券:
| 债券 | 期限 | 票息 | 价格 |
|---|---|---|---|
| A | 1 年 | 2% | 100.5 |
| B | 2 年 | 3% | 101.2 |
| C | 3 年 | 4% | 101.0 |
设第 1、2、3 年的贴现因子是 \(d_1,d_2,d_3\)。无套利要求每只债券的价格等于现金流的贴现值:
这就是线性方程组:未知数只以一次方出现,可以写成"矩阵乘未知向量等于已知向量"。如果 \(C\) 可逆,两边左乘 \(C^{-1}\) 得 \(d=C^{-1}P\)。
这个 \(C\) 是下三角矩阵,所以可以从上往下逐个解,这正是 CFA 里学过的"bootstrapping 即期利率曲线"。第一行 \(d_1=100.5/102=0.985294\);代入第二行 \(d_2=(101.2-3\times0.985294)/103=0.953826\);以此类推。矩阵记号只是把这个过程一次写清。
import numpy as np
# 3 只年付息债(面值 100):1 年期票息 2%、2 年期票息 3%、3 年期票息 4%
# 行 = 债券,列 = 第 1/2/3 年的现金流
C = np.array([[102.0, 0.0, 0.0],
[ 3.0, 103.0, 0.0],
[ 4.0, 4.0, 104.0]])
P = np.array([100.5, 101.2, 101.0]) # 市场价格
d = np.linalg.solve(C, P) # 解 C d = P
print("贴现因子 d =", d.round(6))
print("即期利率 =", (d ** (-1 / np.arange(1, 4)) - 1).round(5))
print("回代 C d - P =", (C @ d - P).round(12))
输出:
贴现因子 d = [0.985294 0.953826 0.896572]
即期利率 = [0.01493 0.02392 0.03706]
回代 C d - P = [ 0. -0. 0.]
即期利率由 \(d_t=(1+s_t)^{-t}\) 反解得到 \(s_t=d_t^{-1/t}-1\)。
实务要点:解方程用 solve,不要先 inv 再乘。 np.linalg.solve(A, b) 用高斯消元(LU 分解)直接求解,比先求逆再相乘更快,数值误差也更小。公式里写 \(A^{-1}b\),代码里写 solve(A, b),这是全书的惯例。
6.4.4 方程组什么时候有唯一解
\(n\) 个方程、\(n\) 个未知数的方程组 \(Ax=b\),有三种情况:
- \(A\) 可逆:有且只有一个解。
- \(A\) 不可逆,且方程互相矛盾:无解。例如 \(x+y=1\) 和 \(2x+2y=3\)。
- \(A\) 不可逆,方程不矛盾:无穷多解。例如 \(x+y=1\) 和 \(2x+2y=2\),第二个方程是第一个的 2 倍,等于没说。
金融翻译:如果你想用一组债券复制另一只债券,复制组合唯一存在的条件是这组债券的现金流矩阵可逆。不可逆说明有的债券是"多余的",或者某些现金流日期覆盖不到。下面几节的行列式与秩,就是判断可逆性的工具。
6.5 行列式:一个数判断是否可逆
6.5.1 定义与计算
行列式 \(\det(A)\) 是从方阵算出的一个数。2×2 的情形:
3×3 的情形可以按第一行展开:
更高阶的行列式手算没有意义,交给 np.linalg.det。三角矩阵的行列式等于对角线元素的乘积,所以上一节债券矩阵的行列式是 \(102\times103\times104\neq0\),可逆。
6.5.2 几何意义:面积缩放倍数
把矩阵看成对平面的变换,单位正方形经过变换变成一个平行四边形,\(|\det A|\) 就是这个平行四边形的面积。行列式为 0,意味着平面被"压扁"成一条线或一个点,信息丢失,无法还原,所以不可逆。
核心结论:方阵 \(A\) 可逆 \(\iff\det A\neq0\)。
6.5.3 两资产协方差矩阵的行列式
数值:\(\sigma_1=0.1,\sigma_2=0.2,\rho=0.3\) 时,\(\det=0.01\times0.04\times0.91=0.000364\)。
这个公式说明:\(|\rho|=1\) 时行列式为 0,协方差矩阵不可逆。 金融含义很直接:两只完全相关的资产可以组合出零风险组合,它们之间存在冗余。在均值–方差优化里要用 \(\Sigma^{-1}\),此时公式直接失效。\(|\rho|\) 接近 1 时行列式接近 0,\(\Sigma^{-1}\) 的元素会变得巨大,优化器会给出"一只做多 500%、另一只做空 480%"这种荒唐权重。
两条性质:\(\det(AB)=\det A\cdot\det B\);\(\det(A^\top)=\det A\)。另外,行列式等于全部特征值的乘积(6.8 节)。
实务提醒:行列式的大小不能衡量"接近不可逆"的程度。 把一个矩阵整体乘 0.1,\(n\) 阶行列式会缩小 \(10^n\) 倍,但可逆性一点没变。判断数值上是否接近奇异,看下一节的条件数或最小特征值。
6.6 线性相关与秩:冗余资产
6.6.1 线性相关
一组向量 \(v_1,\dots,v_k\),如果其中某一个能写成其他向量的线性组合,就称它们线性相关;否则称线性无关。严格定义:存在不全为 0 的系数 \(c_1,\dots,c_k\) 使 \(c_1v_1+\cdots+c_kv_k=0\)。
金融例子:资产 3 是一只 ETF,恰好由 60% 的资产 1 和 40% 的资产 2 构成,于是每天都有 \(r_3=0.6r_1+0.4r_2\)。三只资产的收益序列(作为向量)线性相关:\(0.6r_1+0.4r_2-r_3=0\)。
6.6.2 秩
矩阵的秩 \(\operatorname{rank}(A)\) 是它的列向量中线性无关的最大个数(等于行向量中线性无关的最大个数)。白话:这张表里真正独立的信息有几维。
- \(n\times n\) 矩阵可逆 \(\iff\) 秩为 \(n\)(满秩)\(\iff\) 行列式不为 0。
- 上面三资产的收益矩阵秩为 2,协方差矩阵秩也是 2,不可逆。
另一个常见来源:资产数多于观测期数。 用 60 个月的数据估计 500 只股票的协方差矩阵,样本协方差矩阵的秩最多是 59(减去均值消耗 1 个自由度),一定不可逆。这是第 11 册风险模型要用因子模型或收缩估计的根本原因。
下面的代码构造一个冗余资产,看秩、行列式和特征值,再加一点噪声看会发生什么。
import numpy as np
rng = np.random.default_rng(0)
f = rng.normal(0, 0.01, size=(500, 2)) # 两个"真"因子的 500 天收益
B = np.array([[1.0, 0.0],
[0.0, 1.0],
[0.6, 0.4]]) # 资产 3 = 0.6×资产1 + 0.4×资产2
R = f @ B.T
S = np.cov(R, rowvar=False)
print("秩 rank =", np.linalg.matrix_rank(S))
print("行列式 det =", np.linalg.det(S))
print("特征值 =", np.linalg.eigvalsh(S))
# 加一点点噪声:矩阵变成"满秩但病态"
R2 = R + rng.normal(0, 1e-5, size=R.shape)
S2 = np.cov(R2, rowvar=False)
print("加噪后 rank =", np.linalg.matrix_rank(S2), " 条件数 =", f"{np.linalg.cond(S2):.2e}")
输出:
秩 rank = 2
行列式 det = -1.1690678037773223e-28
特征值 = [-1.08048031e-20 9.41751771e-05 1.46958106e-04]
加噪后 rank = 3 条件数 = 1.56e+06
三点观察:
- 理论上行列式和最小特征值都是 0,计算机给出的是 \(10^{-28}\)、\(10^{-20}\) 量级的数,甚至是负数。这是浮点舍入误差。数值计算里不要用
== 0判断奇异,matrix_rank内部会用一个容差。 - 加入极小噪声后矩阵"满秩"了,但条件数(最大特征值与最小特征值之比,对对称正定矩阵而言)高达 \(10^6\)。条件数大意味着输入的微小扰动会被放大约这么多倍传到解里。真实数据中的高度相关资产就处于这种状态。
- 实务对策:剔除冗余资产、用因子模型降维、对协方差矩阵做收缩(向对角阵拉近),这些在第 11 册第 04 章展开。
6.7 正交:互不相关的方向
6.7.1 正交向量
内积为 0 的两个向量称为正交(垂直):\(x^\top y=0\)。由 6.1.3 节,去均值收益序列正交就是样本相关系数为 0。
一组两两正交、长度都为 1 的向量称为标准正交的。把它们按列排成方阵 \(Q\),就得到正交矩阵,满足
正交矩阵的逆不用算,转置一下就行。它对应的变换是旋转或反射,不改变长度:\(\|Qx\|=\|x\|\)。例子:
6.7.2 投影与回归:残差与解释变量正交
金融例子:用市场收益 \(x\) 解释股票收益 \(y\)(不带截距,只为演示)。最小二乘的 beta 是
几何上,\(b\,x\) 是 \(y\) 在 \(x\) 方向上的投影,残差 \(e=y-bx\) 与 \(x\) 正交。
逐步验证这个结论:
- 最小二乘要最小化 \(\|y-bx\|^2=(y-bx)^\top(y-bx)\)。
- 对 \(b\) 求导并令其为 0:\(-2x^\top(y-bx)=0\)(链式法则,见第 02 章)。
- 所以 \(x^\top e=0\),残差与解释变量正交;同时解出 \(b=x^\top y/x^\top x\)。
数值:\(x=(1,2,3)^\top\),\(y=(2,3,5)^\top\)。\(x^\top y=2+6+15=23\),\(x^\top x=14\),\(b=23/14=1.6429\)。残差 \(e=(0.3571,-0.2857,0.0714)^\top\),\(x^\top e=0.3571-0.5714+0.2143=0\)。
多元回归 \(y=X\beta+e\) 时结论相同:最小二乘残差与 \(X\) 的每一列都正交,\(X^\top(y-X\hat\beta)=0\)。展开得正规方程 \(X^\top X\hat\beta=X^\top y\),解出
这个公式是第 05 册计量经济学的核心。它要求 \(X^\top X\) 可逆,也就是解释变量之间没有完全的线性相关。如果有,就是计量里说的"完全多重共线性",和上一节的冗余资产是同一件事。
6.8 特征值与特征向量:PCA 的数学
6.8.1 定义:只被拉伸、不被转向的方向
一般来说,矩阵乘一个向量,会同时改变它的方向和长度。但对方阵 \(A\),有些特殊方向只被拉伸或压缩,方向不变:
满足这个式子的数 \(\lambda\) 叫特征值,非零向量 \(v\) 叫对应的特征向量。特征向量乘任何非零常数仍是特征向量,所以通常把它标准化成长度 1。
6.8.2 手算 2×2 的例子
取 \(A=\begin{pmatrix}2&1\\1&2\end{pmatrix}\)。
第一步,求特征值。\(Av=\lambda v\) 改写为 \((A-\lambda I)v=0\)。要有非零解 \(v\),矩阵 \(A-\lambda I\) 必须不可逆(否则两边乘逆只能得到 \(v=0\)),即
这叫特征方程。解得 \(2-\lambda=\pm1\),即 \(\lambda_1=1\),\(\lambda_2=3\)。
第二步,求特征向量。对 \(\lambda=3\):\((A-3I)v=\begin{pmatrix}-1&1\\1&-1\end{pmatrix}v=0\),得 \(v_1=v_2\),标准化后 \(v=\frac{1}{\sqrt2}(1,1)^\top\)。对 \(\lambda=1\):\(\begin{pmatrix}1&1\\1&1\end{pmatrix}v=0\),得 \(v_1=-v_2\),\(v=\frac{1}{\sqrt2}(-1,1)^\top\)。
第三步,检查。\(A(1,1)^\top=(3,3)^\top=3\times(1,1)^\top\)。正确。
两个检验特征值的恒等式:
- 迹(对角线之和)等于特征值之和:\(\operatorname{tr}A=2+2=4=1+3\)。
- 行列式等于特征值之积:\(\det A=4-1=3=1\times3\)。
所以只要有一个特征值为 0,行列式就为 0,矩阵不可逆。这把 6.5、6.6、6.8 三节串了起来。
import numpy as np
A = np.array([[2.0, 1.0],
[1.0, 2.0]])
lam, V = np.linalg.eigh(A) # 对称矩阵专用:特征值升序,特征向量正交
print("特征值 =", lam)
print("特征向量(按列)=\n", V.round(4))
v = V[:, 1]
print("A v =", (A @ v).round(4), " λ v =", (lam[1] * v).round(4))
print("V^T V =\n", (V.T @ V).round(10))
print("V Λ V^T 还原 A =\n", (V @ np.diag(lam) @ V.T).round(10))
输出:
特征值 = [1. 3.]
特征向量(按列)=
[[-0.7071 0.7071]
[ 0.7071 0.7071]]
A v = [2.1213 2.1213] λ v = [2.1213 2.1213]
V^T V =
[[1. 0.]
[0. 1.]]
V Λ V^T 还原 A =
[[2. 1.]
[1. 2.]]
对称矩阵请用 eigh,不要用 eig。eigh 利用对称性,保证特征值是实数、按升序排列、特征向量正交,速度也更快。
6.8.3 对称矩阵的谱分解
上面的输出显示了一个普遍结论,称为谱定理:
实对称矩阵 \(A\) 的特征值都是实数,并且可以找到一组标准正交的特征向量。把它们排成正交矩阵 \(V\),特征值排成对角阵 \(\Lambda\),就有
\[A=V\Lambda V^\top=\sum_{i=1}^n\lambda_i v_iv_i^\top .\]
白话:任何对称矩阵都可以拆成"若干个互相垂直的方向,各自乘一个拉伸倍数"。对协方差矩阵来说,这些方向就是互不相关的组合,拉伸倍数就是这些组合的方差。
为什么特征向量组合互不相关?设 \(v_i,v_j\) 是 \(\Sigma\) 的两个标准正交特征向量,则
而 \(\operatorname{Var}(v_i^\top r)=v_i^\top\Sigma v_i=\lambda_i\)。每一步依据:第一个等号是 6.3.4 节的 \(A\Sigma A^\top\) 公式;第二个用特征向量定义;最后用正交性。
6.8.4 主成分分析(PCA):收益率曲线的水平、斜率、曲度
主成分分析就是对协方差矩阵做谱分解,按特征值从大到小排序:
- 第 1 主成分(PC1)是方差最大的标准化组合方向,方差为最大特征值 \(\lambda_1\)。
- 第 2 主成分是与 PC1 正交的方向中方差最大的,方差为 \(\lambda_2\)。依此类推。
- 第 \(k\) 个主成分的方差解释比例是 \(\lambda_k/\sum_i\lambda_i\)。分母是总方差,等于协方差矩阵的迹。
金融上最经典的应用是收益率曲线。各期限国债收益率的日变化高度相关,PCA 通常发现前三个主成分就解释了 95% 以上的变动,并且有清晰的经济含义:
- PC1:各期限载荷几乎相同,叫"水平"(平行移动)。
- PC2:短端与长端符号相反,叫"斜率"(变陡或变平)。
- PC3:两端同号、中段异号,叫"曲度"(蝶式变化)。
下面用模拟数据演示。我们人为设定三个驱动,再看 PCA 能否从 8×8 协方差矩阵中把它们找回来。
import numpy as np
rng = np.random.default_rng(42)
T = np.array([1, 2, 3, 5, 7, 10, 20, 30]) # 期限(年)
n_days = 1000
# 构造三个隐含驱动:水平、斜率、曲度
level = rng.normal(0, 5, n_days) # 单位:bp/天
slope = rng.normal(0, 2, n_days)
curve = rng.normal(0, 1, n_days)
load_level = np.ones(len(T))
load_slope = np.linspace(-1, 1, len(T)) # 短端为负、长端为正
load_curve = load_slope ** 2 - (load_slope ** 2).mean()
dY = (np.outer(level, load_level) + np.outer(slope, load_slope)
+ np.outer(curve, load_curve) + rng.normal(0, 0.5, (n_days, len(T))))
S = np.cov(dY, rowvar=False) # 8×8 协方差矩阵
lam, V = np.linalg.eigh(S)
lam, V = lam[::-1], V[:, ::-1] # 改成降序
share = lam / lam.sum()
print("前 4 个特征值 =", lam[:4].round(2))
print("方差解释比例 =", share[:4].round(4), " 前三累计 =", share[:3].sum().round(4))
for k, name in enumerate(["PC1", "PC2", "PC3"]):
vk = V[:, k] * np.sign(V[-1, k]) # 统一符号:30 年期载荷为正
print(name, "载荷 =", vk.round(2))
输出:
前 4 个特征值 = [195.89 14.15 1.46 0.28]
方差解释比例 = [0.9207 0.0665 0.0068 0.0013] 前三累计 = 0.9941
PC1 载荷 = [0.36 0.35 0.36 0.35 0.35 0.35 0.35 0.35]
PC2 载荷 = [-0.54 -0.39 -0.23 -0.08 0.08 0.23 0.38 0.54]
PC3 载荷 = [ 0.53 0.07 -0.22 -0.4 -0.38 -0.24 0.09 0.54]
读法:
- PC1 的 8 个载荷都约等于 \(0.35\approx1/\sqrt8\),就是"所有期限同涨同跌",解释 92% 的方差。
- PC2 从 \(-0.54\) 单调升到 \(+0.54\),就是斜率。
- PC3 两端为正、中段为负,就是曲度。
- 前三个主成分合计解释 99.4%,第 4 个只剩 0.13%,基本是我们加进去的噪声。
两个技术细节。第一,特征向量的符号是任意的(\(v\) 和 \(-v\) 都是特征向量),所以代码里人为统一了符号。真实数据做 PCA 时,不同软件、不同时间窗口可能给出相反的符号,比较前要先对齐。第二,PCA 的结果依赖于变量的尺度。股票收益做 PCA 通常先标准化,相当于对相关系数矩阵而不是协方差矩阵做分解。
PCA 对一个 CFA 持证人最直接的用处:久期只对冲 PC1(平行移动)。 关键利率久期或主成分久期把对冲扩展到斜率和曲度,第 08 册和第 06 册第 09 章会用到。
6.9 对称矩阵与正定性
6.9.1 定义
对称矩阵 \(A\):
- 如果对所有非零向量 \(x\) 都有 \(x^\top Ax>0\),称 \(A\) 正定(positive definite),记作 \(A\succ0\)。
- 如果对所有 \(x\) 都有 \(x^\top Ax\ge0\),称 \(A\) 半正定,记作 \(A\succeq0\)。
金融翻译:把 \(x\) 看成权重,\(x^\top\Sigma x\) 就是组合方差。半正定 = 任何组合的方差都不为负;正定 = 任何非零组合的方差都严格为正(没有无风险的冗余组合)。
6.9.2 为什么协方差矩阵一定半正定
推导一行:对任意 \(w\),\(w^\top\Sigma w=\operatorname{Var}(w^\top r)\ge0\),因为方差不可能为负。
样本协方差矩阵也一样。设 \(X_c\) 是去均值后的 \(T\times n\) 收益矩阵,则样本协方差 \(S=\frac{1}{T-1}X_c^\top X_c\),于是
依据:第一个等号用了 \((AB)^\top=B^\top A^\top\),即 \(w^\top X_c^\top=(X_cw)^\top\);第二个等号是长度的定义。
6.9.3 判定正定的三种方法
对对称矩阵 \(A\),以下三者等价,任选一种判断:
- 全部特征值大于 0。 依据:由谱分解,\(x^\top Ax=\sum_i\lambda_i(v_i^\top x)^2\),所有 \(\lambda_i>0\) 时这个和对非零 \(x\) 必为正。半正定对应全部特征值 \(\ge0\)。
- 所有顺序主子式大于 0(Sylvester 判据)。顺序主子式是左上角 \(1\times1\)、\(2\times2\)、…、\(n\times n\) 子矩阵的行列式。2×2 时就是 \(a_{11}>0\) 且 \(\det A>0\)。例子:两资产协方差矩阵 \(0.01>0\),\(\det=0.000364>0\),正定。
- Cholesky 分解存在:\(A=LL^\top\),\(L\) 是对角线为正的下三角矩阵。编程时最常用,因为最快,失败就抛异常。
两资产协方差矩阵的 Cholesky 因子可以手算:
验证:\(LL^\top\) 的右下角 \(=0.06^2+0.1908^2=0.0036+0.0364=0.04=\sigma_2^2\)。
Cholesky 因子在蒙特卡洛模拟里有直接用途:若 \(z\) 是独立标准正态向量,则 \(Lz\) 的协方差矩阵是 \(LIL^\top=\Sigma\)(6.3.4 节公式)。这就是生成相关正态随机数的标准做法,第 08 册第 21b 章会用到。
6.9.4 "拍脑袋"填的相关系数矩阵可能不合法
压力测试时,风险经理常常手动设定一组相关系数。危险在于:每个数单独看都在 \([-1,1]\) 内,合起来却可能不是半正定的,等于说"存在一个方差为负的组合"。
例子:A 与 B 相关 0.9,B 与 C 相关 0.9,A 与 C 却相关 −0.9。直觉上就自相矛盾:A 和 C 都与 B 高度同向,它们之间不可能高度反向。
import numpy as np
def is_pd(M):
try:
np.linalg.cholesky(M)
return True
except np.linalg.LinAlgError:
return False
good = np.array([[1.0, 0.3, 0.1],
[0.3, 1.0, 0.5],
[0.1, 0.5, 1.0]])
# 三个"拍脑袋"填的相关系数:A 与 B 高度正相关,B 与 C 高度正相关,A 与 C 却高度负相关
bad = np.array([[ 1.0, 0.9, -0.9],
[ 0.9, 1.0, 0.9],
[-0.9, 0.9, 1.0]])
for name, M in [("good", good), ("bad", bad)]:
print(name, "特征值 =", np.linalg.eigvalsh(M).round(4), " 正定:", is_pd(M))
# 找一个让 bad 给出"负方差"的权重:最小特征值对应的特征向量
lam, V = np.linalg.eigh(bad)
w = V[:, 0]
print("w =", w.round(4), " w^T R w =", (w @ bad @ w).round(4))
# 简单修复:把负特征值截成很小的正数,再重新标准化成对角线为 1
lam_fix = np.clip(lam, 1e-4, None)
M = V @ np.diag(lam_fix) @ V.T
d = np.sqrt(np.diag(M))
fixed = M / np.outer(d, d)
print("修复后 =\n", fixed.round(4))
print("修复后特征值 =", np.linalg.eigvalsh(fixed).round(4), " 正定:", is_pd(fixed))
输出:
good 特征值 = [0.4571 0.9124 1.6305] 正定: True
bad 特征值 = [-0.8 1.9 1.9] 正定: False
w = [ 0.5774 -0.5774 0.5774] w^T R w = -0.8
修复后 =
[[ 1. 0.5 -0.5]
[ 0.5 1. 0.5]
[-0.5 0.5 1. ]]
修复后特征值 = [1.0e-04 1.5e+00 1.5e+00] 正定: True
手算核对负方差:\(w=\frac{1}{\sqrt3}(1,-1,1)\),\(w^\top Rw=\frac13[3+2\times(-0.9)+2\times(-0.9)+2\times(-0.9)]=\frac13(3-5.4)=-0.8\)。也就是说,"做多 A、做空 B、做多 C"这个组合的方差在这套假设下是负数。把这样的矩阵放进 VaR 模型或 Cholesky 模拟,程序要么报错,要么给出没有意义的结果。
修复方法是"特征值截断":把负特征值替换成小正数,重组矩阵,再把对角线标准化回 1。修复后的矩阵把三组相关系数都拉到了 ±0.5,接近能自洽的边界。更精细的方法(如 Higham 最近相关矩阵)在第 11 册讨论。
6.10 协方差矩阵的结构:因子模型
协方差矩阵有 \(n(n+1)/2\) 个不同元素。500 只股票就要估计 125,250 个参数,而数据通常远远不够(6.6 节)。因子模型用结构来压缩参数。
单因子模型(CAPM 的统计版本):\(r_i=\alpha_i+\beta_ir_m+\varepsilon_i\),残差 \(\varepsilon_i\) 两两不相关、与市场不相关。写成向量:\(r=\alpha+\beta r_m+\varepsilon\)。由 6.3.4 节的规则:
\(\beta\beta^\top\) 是列向量乘行向量,结果是 \(n\times n\) 矩阵,称为外积,第 \((i,j)\) 个元素是 \(\beta_i\beta_j\)。所以任意两只股票的协方差是 \(\beta_i\beta_j\sigma_m^2\),这正是 CFA 里单指数模型的结论。
数值例子:\(\beta=(0.8,1.2)^\top\),\(\sigma_m=15\%\),残差方差 \(0.01\) 和 \(0.02\)。
隐含相关系数 \(0.0216/\sqrt{0.0244\times0.0524}=0.604\)。
参数个数从 \(n(n+1)/2\) 降到 \(2n+1\)(\(n\) 个 beta、\(n\) 个残差方差、1 个市场方差)。多因子模型 \(\Sigma=B\Sigma_fB^\top+D\) 是同一思路,\(B\) 是 \(n\times k\) 的因子暴露矩阵,\(\Sigma_f\) 是 \(k\times k\) 的因子协方差矩阵。只要 \(D\) 的对角元都为正,这个 \(\Sigma\) 就一定正定,这是因子模型在实务中受欢迎的另一个原因。
6.11 矩阵求导:三个公式解决大部分问题
6.11.1 记号约定
设 \(f(x)\) 是 \(n\) 维向量 \(x\) 的标量函数。它的梯度是把各个偏导数排成的列向量(第 05 章详细讲):
矩阵求导公式本质上就是"逐个分量求偏导,再排回向量"。记住结果可以省去大量下标运算。
6.11.2 三个核心公式
| 函数 \(f(x)\) | 梯度 \(\nabla f\) | 类比一元 |
|---|---|---|
| \(a^\top x\) | \(a\) | \((ax)'=a\) |
| \(x^\top Ax\) | \((A+A^\top)x\);\(A\) 对称时 \(=2Ax\) | \((ax^2)'=2ax\) |
| \(|y-Xb|^2\)(对 \(b\)) | \(-2X^\top(y-Xb)\) | \(((y-xb)^2)'=-2x(y-xb)\) |
二次型的 Hessian(二阶导数矩阵)是 \(A+A^\top\),对称时为 \(2A\)。
推导第二个公式。展开 \(f(x)=\sum_i\sum_jx_iA_{ij}x_j\),对 \(x_k\) 求偏导。含 \(x_k\) 的项有两类:\(i=k\) 的项贡献 \(\sum_jA_{kj}x_j=(Ax)_k\);\(j=k\) 的项贡献 \(\sum_ix_iA_{ik}=(A^\top x)_k\)(\(i=j=k\) 的那一项 \(A_{kk}x_k^2\) 求导得 \(2A_{kk}x_k\),正好被两类各算一次)。合起来 \(\partial f/\partial x_k=((A+A^\top)x)_k\)。
数值核对。两资产 \(\Sigma=\begin{pmatrix}0.01&0.006\\0.006&0.04\end{pmatrix}\),\(w=(0.6,0.4)^\top\)。展开 \(f=0.01w_1^2+0.012w_1w_2+0.04w_2^2\):
- \(\partial f/\partial w_1=0.02w_1+0.012w_2=0.012+0.0048=0.0168\)。
- \(\partial f/\partial w_2=0.012w_1+0.08w_2=0.0072+0.032=0.0392\)。
- 公式 \(2\Sigma w=2\times(0.0084,0.0196)^\top=(0.0168,0.0392)^\top\)。一致。
6.11.3 应用一:最小方差组合
问题:在 \(\mathbf 1^\top w=1\) 的约束下最小化 \(w^\top\Sigma w\)。用拉格朗日乘子(第 05 章):
- 构造 \(\mathcal L(w,\lambda)=w^\top\Sigma w-\lambda(\mathbf 1^\top w-1)\)。
- 对 \(w\) 求梯度并令其为 0,用上表第 1、2 个公式:\(2\Sigma w-\lambda\mathbf 1=0\)。
- 两边左乘 \(\Sigma^{-1}\)(要求 \(\Sigma\) 可逆):\(w=\frac{\lambda}{2}\Sigma^{-1}\mathbf 1\)。
- 代入约束 \(\mathbf 1^\top w=1\):\(\frac\lambda2\,\mathbf 1^\top\Sigma^{-1}\mathbf 1=1\),解出 \(\frac\lambda2=1/(\mathbf 1^\top\Sigma^{-1}\mathbf 1)\)。
- 结论:
第 5 步方差的推导:\(w^{*\top}\Sigma w^*=\frac{\mathbf 1^\top\Sigma^{-1}\Sigma\Sigma^{-1}\mathbf 1}{(\mathbf 1^\top\Sigma^{-1}\mathbf 1)^2}=\frac{1}{\mathbf 1^\top\Sigma^{-1}\mathbf 1}\)。
为什么这是最小值而不是最大值?目标函数的 Hessian 是 \(2\Sigma\),正定,函数是凸的(第 05 章),驻点就是最小点。正定性在这里第一次显示出实际作用。
两资产时这个公式退化为 CFA 熟悉的 \(w_1=\dfrac{\sigma_2^2-\sigma_{12}}{\sigma_1^2+\sigma_2^2-2\sigma_{12}}\)。代入数值:\(w_1=(0.04-0.006)/(0.05-0.012)=0.8947\)。
三资产的数值:
import numpy as np
vol = np.array([0.10, 0.20, 0.15])
rho = np.array([[1.0, 0.3, 0.1],
[0.3, 1.0, 0.5],
[0.1, 0.5, 1.0]])
Sigma = np.diag(vol) @ rho @ np.diag(vol)
ones = np.ones(3)
Sinv = np.linalg.inv(Sigma)
print("Σ Σ^{-1} 是否为单位阵:", np.allclose(Sigma @ Sinv, np.eye(3)))
# 全局最小方差组合 w* = Σ^{-1} 1 / (1^T Σ^{-1} 1)
y = np.linalg.solve(Sigma, ones) # 实务中解方程,而不是显式求逆
w_star = y / (ones @ y)
print("最小方差权重 =", w_star.round(4))
print("权重和 =", w_star.sum().round(10))
print("最小方差组合波动率 =", np.sqrt(w_star @ Sigma @ w_star).round(4))
print("理论值 1/sqrt(1^T Σ^{-1} 1) =", (1 / np.sqrt(ones @ y)).round(4))
输出:
Σ Σ^{-1} 是否为单位阵: True
最小方差权重 = [ 0.7272 -0.0377 0.3105]
权重和 = 1.0
最小方差组合波动率 = 0.0867
理论值 1/sqrt(1^T Σ^{-1} 1) = 0.0867
注意资产 2 的权重是负的:它波动最大,又与资产 3 相关 0.5,做空一点反而降低总风险。最小方差组合的波动率 8.67%,低于任何单只资产(最低 10%),这就是分散化。
6.11.4 应用二:最小二乘
最小化 \(\|y-Xb\|^2\),对 \(b\) 求梯度令其为 0:\(-2X^\top(y-Xb)=0\),即 \(X^\top Xb=X^\top y\),与 6.7.2 节的几何推导殊途同归。Hessian 是 \(2X^\top X\),它半正定(6.9.2 节同样的论证),\(X\) 列满秩时正定,所以解唯一且是最小点。
6.11.5 应用三:风险贡献
组合波动率 \(\sigma_p=\sqrt{w^\top\Sigma w}\) 对权重的梯度,用链式法则:
这叫边际风险贡献:资产 \(i\) 的权重增加一点点,组合波动率增加多少。资产 \(i\) 的风险贡献定义为 \(RC_i=w_i\,(\Sigma w)_i/\sigma_p\)。它们加起来恰好等于 \(\sigma_p\):
这个"可加分解"是风险预算、风险平价策略的基础。数学上它是欧拉齐次函数定理的特例:\(\sigma_p\) 是 \(w\) 的一次齐次函数(\(w\) 放大 \(c\) 倍,\(\sigma_p\) 也放大 \(c\) 倍)。
import numpy as np
vol = np.array([0.10, 0.20, 0.15])
rho = np.array([[1.0, 0.3, 0.1],
[0.3, 1.0, 0.5],
[0.1, 0.5, 1.0]])
Sigma = np.diag(vol) @ rho @ np.diag(vol)
w = np.array([0.5, 0.3, 0.2])
f = lambda x: x @ Sigma @ x
h = 1e-6
num_grad = np.array([(f(w + h * e) - f(w - h * e)) / (2 * h) for e in np.eye(3)])
print("数值梯度 =", num_grad.round(6))
print("公式 2Σw =", (2 * Sigma @ w).round(6))
# 风险贡献:RC_i = w_i (Σw)_i / σ_p,加总等于 σ_p
sp = np.sqrt(f(w))
mrc = Sigma @ w / sp # 边际风险贡献 ∂σ_p/∂w
rc = w * mrc
print("边际风险贡献 =", mrc.round(4))
print("风险贡献 =", rc.round(4), " 合计 =", rc.sum().round(4), " σ_p =", sp.round(4))
print("风险贡献占比 =", (rc / sp).round(4))
输出:
数值梯度 = [0.0142 0.036 0.0195]
公式 2Σw = [0.0142 0.036 0.0195]
边际风险贡献 = [0.068 0.1724 0.0934]
风险贡献 = [0.034 0.0517 0.0187] 合计 = 0.1044 σ_p = 0.1044
风险贡献占比 = [0.3257 0.4954 0.1789]
数值梯度用中心差分 \([f(w+he_k)-f(w-he_k)]/(2h)\) 逐个分量计算,\(e_k\) 是第 \(k\) 个分量为 1 的单位向量。它与公式 \(2\Sigma w\) 一致。风险贡献的读法:资产 2 只占 30% 的资金,却贡献了近一半(49.5%)的风险。资金权重和风险权重是两回事,这是风险预算的出发点。
本章小结
| 概念 | 公式 | 金融含义 / 用法 |
|---|---|---|
| 内积 | \(w^\top r=\sum_iw_ir_i\) | 组合收益;\(\mathbf 1^\top w=1\) 是权重和 |
| 夹角余弦 | \(\cos\theta=\dfrac{x^\top y}{|x||y|}\) | 去均值序列的夹角余弦 = 相关系数 |
| 矩阵乘法 | \((AB)_{ij}=\sum_lA_{il}B_{lj}\) | \(Rw\) 得组合收益序列;内侧维度须相等;\(AB\ne BA\) |
| 转置 | \((AB)^\top=B^\top A^\top\) | 对称矩阵 \(A^\top=A\) |
| 组合方差 | \(\sigma_p^2=w^\top\Sigma w\) | CFA 两资产公式的推广 |
| 线性变换的协方差 | \(\operatorname{Cov}(Ar)=A\Sigma A^\top\) | 多个组合、因子模型、Cholesky 模拟 |
| 逆矩阵 | \(AA^{-1}=I\);\((AB)^{-1}=B^{-1}A^{-1}\) | 代码用 solve 而非 inv |
| 2×2 逆 | \(\frac{1}{ad-bc}\begin{pmatrix}d&-b\\-c&a\end{pmatrix}\) | 手算检查 |
| 行列式 | \(\det A\ne0\iff A\) 可逆 | 两资产 \(\det\Sigma=\sigma_1^2\sigma_2^2(1-\rho^2)\) |
| 秩 | 独立列的个数 | 冗余资产、\(n>T\) 时样本协方差不可逆 |
| 正交 | \(x^\top y=0\);\(Q^\top Q=I\) | 回归残差与解释变量正交 |
| 正规方程 | \(\hat\beta=(X^\top X)^{-1}X^\top y\) | OLS |
| 特征值 | \(Av=\lambda v\),\(\det(A-\lambda I)=0\) | \(\operatorname{tr}A=\sum\lambda_i\),\(\det A=\prod\lambda_i\) |
| 谱分解 | \(A=V\Lambda V^\top\) | PCA:特征向量 = 不相关组合,特征值 = 其方差 |
| 正定 | \(x^\top Ax>0\);特征值全正;Cholesky 存在 | 协方差矩阵必半正定 |
| Cholesky | \(\Sigma=LL^\top\) | \(Lz\) 生成相关正态随机数 |
| 单因子模型 | \(\Sigma=\sigma_m^2\beta\beta^\top+D\) | 参数从 \(n(n+1)/2\) 降到 \(2n+1\) |
| 矩阵求导 | \(\nabla(a^\top x)=a\);\(\nabla(x^\top Ax)=2Ax\)(\(A\) 对称) | 最优化、OLS |
| 最小方差组合 | \(w^*=\dfrac{\Sigma^{-1}\mathbf 1}{\mathbf 1^\top\Sigma^{-1}\mathbf 1}\) | \(\sigma^{*2}=1/(\mathbf 1^\top\Sigma^{-1}\mathbf 1)\) |
| 风险贡献 | \(RC_i=w_i(\Sigma w)_i/\sigma_p\),\(\sum RC_i=\sigma_p\) | 风险预算、风险平价 |
练习
1. 权重 \(w=(0.2,0.3,0.5)^\top\),收益 \(r=(5\%,-2\%,4\%)^\top\)。求组合收益。
答案:\(w^\top r=0.01-0.006+0.02=0.024\),即 2.4%。
2. 收益矩阵 \(R\) 是 \(250\times10\),权重 \(w\) 是 \(10\times1\)。\(Rw\)、\(R^\top R\)、\(wR\) 各是什么维度?哪个不能计算?
答案:\(Rw\) 是 \(250\times1\)(每天一个组合收益);\(R^\top R\) 是 \(10\times10\);\(wR\) 是 \((10\times1)(250\times10)\),内侧 \(1\ne250\),不能计算。
3. 两资产 \(\sigma_1=15\%\),\(\sigma_2=25\%\),\(\rho=-0.2\),等权。写出 \(\Sigma\),用 \(w^\top\Sigma w\) 求组合波动率。
答案:\(\Sigma_{12}=-0.2\times0.15\times0.25=-0.0075\),\(\Sigma=\begin{pmatrix}0.0225&-0.0075\\-0.0075&0.0625\end{pmatrix}\)。\(w^\top\Sigma w=0.25\times0.0225+0.25\times0.0625+2\times0.25\times(-0.0075)=0.005625+0.015625-0.00375=0.0175\),波动率 \(\sqrt{0.0175}=13.23\%\)。
4. 求 \(A=\begin{pmatrix}4&2\\1&3\end{pmatrix}\) 的逆,并验证。
答案:\(\det A=12-2=10\),\(A^{-1}=\frac1{10}\begin{pmatrix}3&-2\\-1&4\end{pmatrix}\)。验证左上角:\(4\times0.3+2\times(-0.1)=1\);右上角:\(4\times(-0.2)+2\times0.4=0\)。
5. 用矩阵方法解 \(2x+y=5\),\(x+3y=10\)。
答案:\(A=\begin{pmatrix}2&1\\1&3\end{pmatrix}\),\(\det A=5\),\(A^{-1}=\frac15\begin{pmatrix}3&-1\\-1&2\end{pmatrix}\),\((x,y)^\top=A^{-1}(5,10)^\top=\frac15(15-10,\,-5+20)^\top=(1,3)^\top\)。
6. 矩阵的三列为 \((1,2,3)^\top\)、\((2,4,6)^\top\)、\((1,0,1)^\top\)。它的秩是多少?行列式是多少?
答案:第二列是第一列的 2 倍,第三列与第一列不成比例,所以秩为 2,行列式为 0。
7. 求 \(A=\begin{pmatrix}3&1\\1&3\end{pmatrix}\) 的特征值和标准化特征向量,并用迹和行列式检查。
答案:\((3-\lambda)^2-1=0\),\(\lambda=2,4\)。\(\lambda=4\) 对应 \(\frac1{\sqrt2}(1,1)^\top\);\(\lambda=2\) 对应 \(\frac1{\sqrt2}(1,-1)^\top\)。检查:\(2+4=6=\operatorname{tr}A\),\(2\times4=8=9-1=\det A\)。
8. 某人设定两资产"协方差矩阵"为 \(\begin{pmatrix}1&2\\2&1\end{pmatrix}\)。它合法吗?若不合法,找出一个方差为负的组合。
答案:\(\det=1-4=-3<0\),不正定,不合法(隐含相关系数为 2,超出 \([-1,1]\))。特征值为 \(-1\) 和 \(3\)。取 \(\lambda=-1\) 的特征向量 \(w=\frac1{\sqrt2}(1,-1)^\top\):\(w^\top Aw=\frac12(1-2-2+1)=-1<0\)。
9. 三只资产收益的协方差矩阵特征值为 4、0.8、0.2。第一主成分解释多少方差?该矩阵的迹是多少?是否正定?
答案:总方差 \(=\operatorname{tr}=5\),第一主成分解释 \(4/5=80\%\)。特征值全为正,正定。
10. 均值–方差效用 \(U(w)=w^\top\mu-\frac{\gamma}{2}w^\top\Sigma w\)(无预算约束)。求使 \(U\) 最大的 \(w\),并说明为什么是最大值。
答案:\(\nabla U=\mu-\gamma\Sigma w=0\),得 \(w^*=\frac1\gamma\Sigma^{-1}\mu\)。Hessian 为 \(-\gamma\Sigma\),在 \(\gamma>0\)、\(\Sigma\) 正定时负定,\(U\) 是凹函数,驻点为最大值。
11. 单因子模型下 \(\beta=(1.0,0.5)^\top\),\(\sigma_m=20\%\),残差方差都是 \(0.01\)。求 \(\Sigma\) 和两资产的相关系数。
答案:\(\sigma_m^2\beta\beta^\top=0.04\begin{pmatrix}1&0.5\\0.5&0.25\end{pmatrix}=\begin{pmatrix}0.04&0.02\\0.02&0.01\end{pmatrix}\),加上 \(D\) 得 \(\Sigma=\begin{pmatrix}0.05&0.02\\0.02&0.02\end{pmatrix}\)。相关系数 \(0.02/\sqrt{0.05\times0.02}=0.02/0.03162=0.632\)。
12. 证明:若 \(\Sigma\) 正定,\(A\) 是 \(k\times n\) 且行满秩(秩为 \(k\)),则 \(A\Sigma A^\top\) 也正定。
答案:对任意非零 \(x\in\mathbb R^k\),\(x^\top A\Sigma A^\top x=(A^\top x)^\top\Sigma(A^\top x)\)。\(A\) 行满秩说明 \(A^\top\) 的列线性无关,所以 \(A^\top x\ne0\)。由 \(\Sigma\) 正定,上式 \(>0\)。金融含义:线性无关的若干组合,其协方差矩阵仍然正定。
在全书中用到的地方
- 第 01 册全册以本章为入门。尤其是第 00 章(矩阵基础复习)、第 01 章(特征值特征向量与相似)、第 02b 章(谱定理与奇异值分解)、第 07a 章(正定矩阵与 Cholesky 分解)。本章是这些章节的"金融版预告"。
- 第 02 册第 07c 章(矩母函数与多元正态):多元正态分布的密度和线性变换都用 \(\Sigma\)、\(\Sigma^{-1}\)、\(\det\Sigma\) 和 \(A\Sigma A^\top\) 表达。
- 第 03 册第 13a 章、第 14 章与第 05 册第 19a–19c 章:矩阵形式的回归 \(\hat\beta=(X^\top X)^{-1}X^\top y\)、正规方程、多重共线性。
- 第 04 册第 02 章、第 12 章、第 16a 章:梯度与 Hessian 的矩阵写法、正定性与凸性、二次规划的 KKT 系统。
- 第 06 册第 08a 章、第 09 章、第 10 章:向量自回归、主成分分析与因子模型、多元波动率模型(协方差矩阵必须保持正定)。
- 第 08 册第 21b 章、第 23 章:用 Cholesky 生成相关随机数做蒙特卡洛;相关系数矩阵的估计与一致性。
- 第 10 册第 05 章、第 11 章:神经网络中的向量空间、线性变换和反向传播的矩阵求导。
- 第 11 册第 04 章、第 05 章:风险模型(因子模型、协方差收缩)、组合构建与优化(最小方差、风险预算)。