金融数学和量化分析中,线性代数是最基础也最强大的数学工具之一。无论是投资组合优化、风险分析还是衍生品定价,都离不开线性代数和线性方程组求解。本文作为Python数值分析系列第一篇,将介绍核心数值方法并通过Python实现展示其在金融中的应用。
线性方程组可以简洁地表示为:,其中A是系数矩阵,x是我们要求的未知向量,b是常数向量。
金融应用场景:
高斯消元法是最基本的求解方法,通过行变换将方程组转化为等价但更容易求解的形式。
核心思想:把复杂方程组转化为简单的上三角形式,然后逐个回代求解。
import numpy as np
def gaussian_elimination(A, b):
"""高斯消元法求解线性方程组"""
# 创建增广矩阵
n = len(b)
aug_matrix = np.column_stack((A, b))
# 前向消元
for i in range(n):
# 找主元(避免除以接近零的数)
max_row = i + np.argmax(abs(aug_matrix[i:, i]))
if max_row != i:
aug_matrix[[i, max_row]] = aug_matrix[[max_row, i]]
# 消元过程
for j in range(i+1, n):
factor = aug_matrix[j, i] / aug_matrix[i, i]
aug_matrix[j, i:] -= factor * aug_matrix[i, i:]
# 回代过程
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (aug_matrix[i, -1] - np.sum(aug_matrix[i, i+1:n] * x[i+1:])) / aug_matrix[i, i]
return x
实际应用:假设我们需要求解满足特定风险和收益目标的投资组合权重,可以构建相应的线性方程组求解。
LU分解是高斯消元法的变体,将系数矩阵A分解为下三角矩阵L和上三角矩阵U的乘积:。
优点:
def lu_decomposition(A):
"""执行LU分解"""
n = len(A)
L = np.eye(n) # 初始化为单位矩阵
U = np.copy(A).astype(float)
for i in range(n):
for j in range(i+1, n):
factor = U[j, i] / U[i, i]
L[j, i] = factor
U[j, i:] -= factor * U[i, i:]
return L, U
def solve_lu(L, U, b):
"""使用LU分解求解线性方程组"""
n = len(b)
# 解Ly = b
y = np.zeros(n)
for i in range(n):
y[i] = b[i] - np.sum(L[i, :i] * y[:i])
# 解Ux = y
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (y[i] - np.sum(U[i, i+1:] * x[i+1:])) / U[i, i]
return x
金融应用:在构建因子模型时,我们常需要用同一个矩阵解决多个回归问题,LU分解可以显著提高效率。
当系数矩阵非常大且稀疏(大部分元素为零)时,迭代法更为高效。
高斯-赛德尔迭代法的核心思想是:每次迭代时立即使用最新计算的值,加快收敛。
def gauss_seidel(A, b, tol=1e-6, max_iter=100):
"""高斯-赛德尔迭代法求解线性方程组"""
n = len(b)
x = np.zeros(n)
for iteration in range(max_iter):
x_old = np.copy(x)
for i in range(n):
sigma = 0
for j in range(n):
if j != i:
sigma += A[i, j] * x[j]
x[i] = (b[i] - sigma) / A[i, i]
# 检查收敛性
if np.linalg.norm(x - x_old, np.inf) < tol:
return x
print(f"已达到最大迭代次数{max_iter},但未收敛")
return x
应用场景:大规模资产配置优化、风险模型中的大型协方差矩阵计算。
特征值问题是寻找满足 的标量λ和非零向量v,其中λ是特征值,v是对应的特征向量。
金融中的重要性:
幂法是一种简单迭代法,用于求解矩阵的最大特征值及其对应的特征向量。
def power_method(A, tol=1e-8, max_iter=100):
"""幂法计算矩阵的最大特征值及对应特征向量"""
n = A.shape[0]
# 随机初始向量
v = np.random.rand(n)
v = v / np.linalg.norm(v)
for i in range(max_iter):
v_old = v.copy()
# 核心迭代步骤
w = A @ v
v = w / np.linalg.norm(w)
# 计算特征值估计
lambda_est = v.T @ A @ v
# 检查收敛性
if np.linalg.norm(v - v_old) < tol:
return lambda_est, v
return v.T @ A @ v, v
实际应用:在股票投资中,最大特征值对应的特征向量表示市场风险的主要方向,是风险管理的重要信息。
PCA通过分析数据协方差矩阵的特征向量,找出数据的主要变化方向。
def perform_pca(X, num_components=None):
"""执行主成分分析"""
# 数据中心化
X_centered = X - np.mean(X, axis=0)
# 计算协方差矩阵
cov_matrix = np.cov(X_centered, rowvar=False)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 降序排列
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
# 计算解释方差比例
explained_var = eigenvalues / np.sum(eigenvalues)
# 选择主成分数量
if num_components is None:
num_components = X.shape[1]
return eigenvectors[:, :num_components], explained_var[:num_components]
金融应用:PCA可以分解股票组合风险来源,帮助我们理解哪些因素主导了市场波动。例如,在债券分析中,收益率曲线的前三个主成分通常解释了90%以上的波动,分别对应水平、斜率和曲度变化。
线性回归寻找最佳系数使预测值与实际值的误差平方和最小化。矩阵形式:
def linear_regression(X, y):
"""实现普通最小二乘线性回归"""
# 添加截距项
X_with_intercept = np.column_stack((np.ones(X.shape[0]), X))
# 计算回归系数
beta = np.linalg.inv(X_with_intercept.T @ X_with_intercept) @ X_with_intercept.T @ y
return beta
金融应用:实现CAPM模型估计股票Beta和Alpha,是资产定价的基础。
# CAPM模型实现(Beta计算示例)
market_returns = np.random.normal(0.001, 0.02, 100) # 市场收益率
stock_returns = 0.0005 + 1.2 * market_returns + np.random.normal(0, 0.01, 100) # 股票收益率
# 估计Beta和Alpha
beta_estimates = linear_regression(market_returns.reshape(-1, 1), stock_returns)
alpha_estimate, beta_estimate = beta_estimates[0], beta_estimates[1]
为避免过拟合,可以使用正则化技术如岭回归,为模型添加惩罚项。
def ridge_regression(X, y, alpha=1.0):
"""实现岭回归"""
# 添加截距项
X_with_intercept = np.column_stack((np.ones(X.shape[0]), X))
n = X_with_intercept.shape[1]
# 构建正则化矩阵(不对截距项正则化)
reg_matrix = alpha * np.eye(n)
reg_matrix[0, 0] = 0
# 计算回归系数
beta = np.linalg.inv(X_with_intercept.T @ X_with_intercept + reg_matrix) @ X_with_intercept.T @ y
return beta
金融应用:多因子股票选择模型通常面临因子间多重共线性问题,正则化可以稳定模型并提高预测能力。
下一篇博文将探讨函数逼近与数值展开技术,包括插值方法和级数展开,这些方法在衍生品定价和收益率曲线构建中有着重要应用。