🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第1讲 线性代数与方程组

金融数学和量化分析中,线性代数是最基础也最强大的数学工具之一。无论是投资组合优化、风险分析还是衍生品定价,都离不开线性代数和线性方程组求解。本文作为Python数值分析系列第一篇,将介绍核心数值方法并通过Python实现展示其在金融中的应用。

1. 线性方程组的求解技术

1.1 什么是线性方程组?

线性方程组可以简洁地表示为:Ax=bAx = b,其中A是系数矩阵,x是我们要求的未知向量,b是常数向量。

金融应用场景

1.2 高斯消元法:最直观的解法

高斯消元法是最基本的求解方法,通过行变换将方程组转化为等价但更容易求解的形式。

核心思想:把复杂方程组转化为简单的上三角形式,然后逐个回代求解。

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

实际应用:假设我们需要求解满足特定风险和收益目标的投资组合权重,可以构建相应的线性方程组求解。

1.3 LU分解:应对多个常数项

LU分解是高斯消元法的变体,将系数矩阵A分解为下三角矩阵L和上三角矩阵U的乘积:A=LUA = LU

优点

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分解可以显著提高效率。

1.4 迭代法:处理大规模稀疏系统

当系数矩阵非常大且稀疏(大部分元素为零)时,迭代法更为高效。

高斯-赛德尔迭代法的核心思想是:每次迭代时立即使用最新计算的值,加快收敛。

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

应用场景:大规模资产配置优化、风险模型中的大型协方差矩阵计算。

2. 特征值与特征向量分析

2.1 特征值问题为何重要?

特征值问题是寻找满足 Av=λvAv = λv 的标量λ和非零向量v,其中λ是特征值,v是对应的特征向量。

金融中的重要性

2.2 幂法:寻找最大特征值

幂法是一种简单迭代法,用于求解矩阵的最大特征值及其对应的特征向量。

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

实际应用:在股票投资中,最大特征值对应的特征向量表示市场风险的主要方向,是风险管理的重要信息。

2.3 主成分分析(PCA):降维与风险分解

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%以上的波动,分别对应水平、斜率和曲度变化。

3. 最小二乘回归方法

3.1 线性回归:量化金融的基础工具

线性回归寻找最佳系数使预测值与实际值的误差平方和最小化。矩阵形式:

β=(XTX)1XTy\beta = (X^TX)^{-1}X^Ty
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]

3.2 正则化:克服过拟合

为避免过拟合,可以使用正则化技术如岭回归,为模型添加惩罚项。

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

金融应用:多因子股票选择模型通常面临因子间多重共线性问题,正则化可以稳定模型并提高预测能力。

实用建议

  1. 理解本质:不要只记住公式,要理解每种方法的核心思想和适用场景。
  1. 数值稳定性:实际应用中要关注:
    • 矩阵条件数(条件数高的矩阵会导致数值不稳定)
    • 奇异或近似奇异矩阵的处理(考虑伪逆或正则化)
    • 稀疏矩阵的特殊处理
  1. 选择合适算法
    • 小规模密集矩阵:直接法(高斯消元、LU分解)
    • 大规模稀疏矩阵:迭代法(雅可比、高斯-赛德尔)
    • 有多个常数项:LU分解
    • 存在多重共线性:正则化方法
  1. Python技巧
    • 利用NumPy的向量化操作提高效率
    • 对大型数据考虑使用SciPy的稀疏矩阵库
    • 平衡自定义实现与库函数的使用

下一步学习方向

下一篇博文将探讨函数逼近与数值展开技术,包括插值方法和级数展开,这些方法在衍生品定价和收益率曲线构建中有着重要应用。

参考资料

  1. 《Python Programming And Numerical Methods: A Guide For Engineers And Scientists》
  1. 《Numerical Methods in Finance with C++》by Manfred Gilli
  1. 《Options, Futures, and Other Derivatives》by John C. Hull
  1. SciPy和NumPy官方文档