跳到正文

矩阵运算

矩阵乘法不是按元素进行的——它组合变换。理解如何乘法矩阵、求逆矩阵以及解读结果,是回归和风险模型的核心。

第 1 篇 · 共 6 篇 约 3 分钟

矩阵乘法:规则

矩阵乘法不是按条目逐个进行的。它是行与列的有意组合,规则有别于日常算术。

将 A\mathbf{A}(大小 m×nm \times n)乘以 B\mathbf{B}(大小 n×pn \times p),得到一个 m×pm \times p 矩阵。第 ii 行第 jj 列的条目是 A\mathbf{A} 的第 ii 行与 B\mathbf{B} 的第 jj 列的点积:

(AB)ij=∑k=1naikbkj(\mathbf{A}\mathbf{B})_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj}

这有两个直接后果。首先,内维度必须匹配,A\mathbf{A} 的列数必须等于 B\mathbf{B} 的行数。其次,矩阵乘法不可交换:一般来说 AB≠BA\mathbf{A}\mathbf{B} \neq \mathbf{B}\mathbf{A}。顺序很重要。

矩阵乘法是结合的:(AB)C=A(BC)(\mathbf{A}\mathbf{B})\mathbf{C} = \mathbf{A}(\mathbf{B}\mathbf{C}),以及分配的:A(B+C)=AB+AC\mathbf{A}(\mathbf{B} + \mathbf{C}) = \mathbf{A}\mathbf{B} + \mathbf{A}\mathbf{C}。

单位矩阵与逆矩阵

单位矩阵 I\mathbf{I} 在矩阵乘法中扮演的角色,与 1 在标量乘法中的角色相同。它是一个对角线为 1、其他位置为 0 的方阵:

I=[1001]\mathbf{I} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}

对于任何兼容的矩阵 A\mathbf{A}:AI=A\mathbf{A}\mathbf{I} = \mathbf{A} 且 IA=A\mathbf{I}\mathbf{A} = \mathbf{A}。

方阵 A\mathbf{A} 的逆矩阵,记作 A−1\mathbf{A}^{-1},是满足以下条件的矩阵:

A−1A=I且AA−1=I\mathbf{A}^{-1}\mathbf{A} = \mathbf{I} \quad \text{且} \quad \mathbf{A}\mathbf{A}^{-1} = \mathbf{I}

并非所有矩阵都有逆矩阵。不能求逆的矩阵称为奇异矩阵或不可逆矩阵。奇异性并非罕见的边缘情况——它是一个警告信号,表明你的矩阵包含冗余信息,比如两个相同的列。

行列式 det⁡(A)\det(\mathbf{A}) 是从矩阵派生出的一个标量,它告诉你是否可能求逆。如果 det⁡(A)=0\det(\mathbf{A}) = 0,矩阵是奇异的。如果 det⁡(A)≠0\det(\mathbf{A}) \neq 0,逆矩阵存在。

逆矩阵与转置的性质

一些在推导中经常使用的代数规则:

(AB)−1=B−1A−1(\mathbf{A}\mathbf{B})^{-1} = \mathbf{B}^{-1}\mathbf{A}^{-1}

注意顺序反转。要撤销先 A\mathbf{A} 后 B\mathbf{B} 的操作,你先撤销 B\mathbf{B} 再撤销 A\mathbf{A}。

(AB)⊤=B⊤A⊤(\mathbf{A}\mathbf{B})^\top = \mathbf{B}^\top \mathbf{A}^\top

同样,当你对乘积进行转置时,顺序反转。

矩阵的迹是对角线元素的和。它有一个有用的性质:在转置下不变:tr(A)=tr(A⊤)\text{tr}(\mathbf{A}) = \text{tr}(\mathbf{A}^\top)。

求解线性方程组

量化金融中最常见的问题之一是求解线性方程组中的未知数。这个问题可以简洁地写成:

Ax=b\mathbf{A}\mathbf{x} = \mathbf{b}

其中 A\mathbf{A} 是已知系数矩阵,b\mathbf{b} 是已知右端向量,x\mathbf{x} 是我们想找到的未知向量。

如果 A\mathbf{A} 是方阵且可逆,解为:

x=A−1b\mathbf{x} = \mathbf{A}^{-1}\mathbf{b}

然而,有一个关键的实际要点:永远不要通过显式计算逆矩阵来求解线性方程组。计算 A−1\mathbf{A}^{-1} 然后相乘比直接求解更慢且数值稳定性更差。使用求解器代替。

import numpy as np


# 2x +  y = 8
#  x + 3y = 9

A = np.array([[2, 1],
              [1, 3]])
b = np.array([8, 9])

# 推荐:直接求解
x = np.linalg.solve(A, b)
print(f"解: x = {x[0]}, y = {x[1]}")

# 通过乘法验证
print(np.allclose(A @ x, b))  # True

# 与逆矩阵比较(实践中不要这样用)
A_inv = np.linalg.inv(A)
x_inv = A_inv @ b
print(f"通过逆矩阵的相同结果: {x_inv}")

提示词

用 numpy.linalg.solve 解线性方程组 A@x=b,再用 inv 做对比验证。

金融示例:根据目标收益求投资组合权重

假设你有一个协方差矩阵 Σ\mathbf{\Sigma},你想找到产生目标预期收益 μ∗\mu^* 的投资组合权重 w\mathbf{w},已知每只资产的预期收益为 μ\boldsymbol{\mu}。这导致一个线性方程组:

w⊤μ=μ∗\mathbf{w}^\top \boldsymbol{\mu} = \mu^*

在权重总和为 1 的约束下(w⊤1=1\mathbf{w}^\top \mathbf{1} = 1),你有两个方程和 nn 个未知数。对于两只资产的具体情况,你可以直接求解:

import numpy as np

# 两只资产
mu = np.array([0.08, 0.12])   # 预期收益
ones = np.array([1.0, 1.0])    # 总和为 1 约束

# 目标投资组合收益率 10%
target_return = 0.10

# 构建方程组 A @ w = b
# 方程 1: w1 + w2 = 1
# 方程 2: 0.08*w1 + 0.12*w2 = 0.10
A = np.array([[1, 1],
              [mu[0], mu[1]]])
b = np.array([1, target_return])

w = np.linalg.solve(A, b)
print(f"权重: {w}")
print(f"总和: {w.sum():.4f}, 收益: {w @ mu:.4f}")

提示词

用 numpy.linalg.solve 求两只资产在”权重和为 1、组合收益为 10%“约束下的权重。

对于具有更多资产和约束的更大系统,相同的原理适用——你正在求解 Ax=b\mathbf{A}\mathbf{x} = \mathbf{b},numpy.linalg.solve(或其背后的 QR 分解)是正确的工具。

参考文献

Strang, Introduction to Linear Algebra, 5th edition, Wellesley-Cambridge Press, Chapters 2–3. ISBN: 978-0980232776.

Lax, Linear Algebra and Its Applications, 2nd edition, Wiley, Chapters 1–2. ISBN: 978-0471751564.