矩阵运算
矩阵乘法不是按元素进行的——它组合变换。理解如何乘法矩阵、求逆矩阵以及解读结果,是回归和风险模型的核心。
矩阵乘法:规则
矩阵乘法不是按条目逐个进行的。它是行与列的有意组合,规则有别于日常算术。
将 (大小 )乘以 (大小 ),得到一个 矩阵。第 行第 列的条目是 的第 行与 的第 列的点积:
这有两个直接后果。首先,内维度必须匹配, 的列数必须等于 的行数。其次,矩阵乘法不可交换:一般来说 。顺序很重要。
矩阵乘法是结合的:,以及分配的:。
单位矩阵与逆矩阵
单位矩阵 在矩阵乘法中扮演的角色,与 1 在标量乘法中的角色相同。它是一个对角线为 1、其他位置为 0 的方阵:
对于任何兼容的矩阵 : 且 。
方阵 的逆矩阵,记作 ,是满足以下条件的矩阵:
并非所有矩阵都有逆矩阵。不能求逆的矩阵称为奇异矩阵或不可逆矩阵。奇异性并非罕见的边缘情况——它是一个警告信号,表明你的矩阵包含冗余信息,比如两个相同的列。
行列式 是从矩阵派生出的一个标量,它告诉你是否可能求逆。如果 ,矩阵是奇异的。如果 ,逆矩阵存在。
逆矩阵与转置的性质
一些在推导中经常使用的代数规则:
注意顺序反转。要撤销先 后 的操作,你先撤销 再撤销 。
同样,当你对乘积进行转置时,顺序反转。
矩阵的迹是对角线元素的和。它有一个有用的性质:在转置下不变:。
求解线性方程组
量化金融中最常见的问题之一是求解线性方程组中的未知数。这个问题可以简洁地写成:
其中 是已知系数矩阵, 是已知右端向量, 是我们想找到的未知向量。
如果 是方阵且可逆,解为:
然而,有一个关键的实际要点:永远不要通过显式计算逆矩阵来求解线性方程组。计算 然后相乘比直接求解更慢且数值稳定性更差。使用求解器代替。
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 做对比验证。
金融示例:根据目标收益求投资组合权重
假设你有一个协方差矩阵 ,你想找到产生目标预期收益 的投资组合权重 ,已知每只资产的预期收益为 。这导致一个线性方程组:
在权重总和为 1 的约束下(),你有两个方程和 个未知数。对于两只资产的具体情况,你可以直接求解:
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%“约束下的权重。
对于具有更多资产和约束的更大系统,相同的原理适用——你正在求解 ,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.