Victor的魔鬼训练进入第二周。从特征值的”主轴”直觉到矩阵分解三剑客,从推荐系统的矩阵魔法到投资组合的数学优化,这不仅是技术的深入,更是理论与实战的完美融合。当Carol亲手实现SVD压缩,当Bob用PCA提取因子,SigmaX的团队终于开始理解:为什么数学是量化的灵魂。

本期关键词:特征值、特征向量、SVD奇异值分解、PCA主成分分析、LU/QR分解、推荐系统、投资组合优化、数值稳定性

🎯寻找变换的”主轴”

周一下午,Victor准时出现在培训室。

他环顾四周,发现每个人的眼神都比上周更加专注。一周的高强度训练,已经让这群”代码猴子”开始有了一些数学觉悟。

“上周我们学了矩阵是变换机器。今天,我要教你们找到变换的灵魂。”

Victor在白板上画了一个椭圆:

“这个椭圆是由单位圆经过某个矩阵变换得到的。问题是:这个变换最重要的方向是什么?”

Alice举手:“长轴和短轴的方向?”

Victor难得露出赞许的表情:

“对!长轴和短轴就是这个变换的特征方向。沿着这些方向,向量只会被拉伸或压缩,不会被旋转!”

他在白板上写下核心定义:

特征值与特征向量:

给定矩阵A,如果存在非零向量v和标量λ,使得: Av = λv

则v是A的特征向量,λ是对应的特征值。

几何意义:

  • 特征向量v:变换后方向不变的向量

  • 特征值λ:沿该方向的拉伸倍数

Bob皱眉:“等等,Av应该是矩阵乘向量,结果是另一个向量。怎么会等于λv这种标量乘向量?”

“这正是特征向量的特殊之处!”

Victor用力在白板上画:

“大多数向量经过矩阵变换后,方向会改变。但特征向量是那些只被拉伸不被旋转的特殊向量。找到它们,你就找到了变换的本质!”

Carol问:“那怎么计算特征值和特征向量?”

Victor写下推导:

Av = λv
Av - λv = 0
(A - λI)v = 0
 
这是一个齐次方程组。
要有非零解v,必须:det(A - λI) = 0
 
这叫做特征方程。解出λ,再代回去解v。

他用一个具体例子演示:

A = [3  1]
    [0  2]
 
特征方程:
det([3-λ  1 ]) = 0
   ([0   2-λ])
 
(3-λ)(2-λ) - 0 = 0
λ₁ = 3, λ₂ = 2
 
对于λ₁=3:
(A - 3I)v = [0  1][v₁] = [0]
            [0 -1][v₂]   [0]
解得:v₁ = (1, 0)
 
对于λ₂=2:
(A - 2I)v = [1  1][v₁] = [0]
            [0  0][v₂]   [0]
解得:v₂ = (1, -1)(归一化后)

Eric问:“这在量化中有什么用?”

Victor推了推眼镜,声音变得严肃:

“用处大了。还记得上周那个让你们亏1000万的协方差矩阵吗?协方差矩阵的特征值和特征向量告诉你:投资组合风险的主要来源是什么!”

他在白板上快速写:

# 协方差矩阵的特征分解
cov_matrix = np.cov(returns.T)
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
 
# 特征值 = 各主成分的方差
# 特征向量 = 主成分的方向(即主要风险因子)
 
# 最大特征值对应的特征向量 = 主要风险方向
# 如果最大特征值占总方差的90%,说明风险高度集中!

Alice恍然大悟:“所以如果协方差矩阵的最大特征值特别大,说明所有资产都暴露在同一个风险因子上?”

“孺子可教。”Victor难得夸奖,“这就是为什么2008年金融危机时,所有资产同时崩溃。它们看似分散,但都暴露在同一个系统性风险上。特征分解能提前发现这个隐患。”

🔬PageRank:特征向量的商业奇迹

第二天,Victor一进门就在白板上写了一个名字:

Google PageRank

“你们知道Google怎么给网页排名的吗?”

Bob举手:“根据链接数量?链接越多的网页越重要?”

“太天真了。”Victor冷笑,“如果只看链接数量,任何人都可以创建一万个垃圾网页互相链接,刷上排名。Google的天才之处在于:不仅看链接数量,还看链接的质量。”

他在白板上画了一个网页链接图:

“假设有四个网页ABCD。A被B和C链接,B被D链接,C被A链接,D被B和C链接。问题是:哪个网页最重要?”

Victor写下PageRank的核心思想:

PageRank核心思想:
1. 一个网页的重要性 = 所有链接到它的网页的重要性之和
2. 如果一个重要网页链接到你,你也变得重要
3. 重要性会"传递"
 
数学表达:
PR(A) = Σ PR(i)/L(i)  (对所有链接到A的网页i求和)
L(i) = 网页i的出链数量

“这个方程有个问题:PR(A)的计算需要PR(B)和PR(C),而PR(B)的计算又需要PR(D),PR(D)的计算需要PR(B)和PR(C)…这是个循环依赖!”

Carol问:“那怎么解?”

Victor露出得意的笑容:

“把它写成矩阵形式!”

定义转移矩阵M:
M[i][j] = 1/L(j)  如果j链接到i
M[i][j] = 0       否则
 
则:
PR = M × PR
 
这不就是:Mv = v,即 Mv = 1·v
 
PageRank向量就是转移矩阵M的特征值为1的特征向量!

全场惊叹。

Victor继续说:

“Google每天要对数十亿网页计算PageRank。他们使用的是幂迭代法:从任意初始向量开始,不断乘以M,最终会收敛到主特征向量。”

# 幂迭代法计算PageRank
def pagerank(M, iterations=100):
    n = M.shape[0]
    pr = np.ones(n) / n  # 初始:均匀分布
 
    for _ in range(iterations):
        pr = M @ pr  # 矩阵乘法
        pr = pr / np.sum(pr)  # 归一化
 
    return pr

Alice问:“为什么幂迭代一定会收敛到主特征向量?”

“好问题!”Victor在白板上快速推导:

设A的特征值为λ₁ ≥ λ₂ ≥ ... ≥ λₙ
对应特征向量为v₁, v₂, ..., vₙ
 
任意初始向量x₀可以分解为:
x₀ = c₁v₁ + c₂v₂ + ... + cₙvₙ
 
经过k次迭代:
Aᵏx₀ = c₁λ₁ᵏv₁ + c₂λ₂ᵏv₂ + ... + cₙλₙᵏvₙ
     = λ₁ᵏ(c₁v₁ + c₂(λ₂/λ₁)ᵏv₂ + ...)
 
当k→∞,如果|λ₁| > |λ₂|,则(λ₂/λ₁)ᵏ → 0
结果趋近于c₁λ₁ᵏv₁,即主特征向量的方向!

“这就是幂法的数学原理。Google每天就是在做这个计算,只不过矩阵规模是数十亿×数十亿。”

🗡矩阵分解三剑客

周三,Victor宣布进入本周的重头戏:

“今天开始,我们学习矩阵分解。这是线性代数最强大的工具,也是机器学习和量化金融的核心技术。”

他在白板上写下三个名字:

矩阵分解三剑客:
1. SVD(奇异值分解):万能分解,任意矩阵都可用
2. PCA(主成分分析):数据降维的标准工具
3. LU/QR分解:数值计算的效率担当

SVD:万能的分解器

“SVD是线性代数的瑞士军刀。任何矩阵,不管是方阵还是长方形,不管是满秩还是降秩,都可以做SVD分解。”

Victor写下SVD的定义:

对于任意 m×n 矩阵 A:
 
A = UΣVᵀ
 
其中:
- U:m×m 正交矩阵(左奇异向量)
- Σ:m×n 对角矩阵(奇异值,从大到小排列)
- V:n×n 正交矩阵(右奇异向量)
 
几何意义:
任何线性变换 = 旋转 × 拉伸 × 旋转
           = V旋转 × Σ拉伸 × U旋转

Bob问:“SVD和特征分解有什么区别?”

“好问题。特征分解只能用于方阵,而且必须是可对角化的。SVD适用于任意矩阵,这才是它强大的地方。”

Victor展示了SVD的一个经典应用——图像压缩:

# SVD图像压缩
from PIL import Image
import numpy as np
 
# 读取灰度图像
img = np.array(Image.open('photo.jpg').convert('L'))
 
# SVD分解
U, S, Vt = np.linalg.svd(img, full_matrices=False)
 
# 只保留前k个奇异值
k = 50
compressed = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
 
# 压缩比 = k(m+n+1) / (m×n)
# 对于1000×1000的图像,k=50时压缩比约为10%

“奇异值从大到小排列,前面几个奇异值包含了图像的主要信息,后面的只是噪声和细节。保留前k个奇异值,就能用很少的数据重建图像!”

Alice问:“在量化中,SVD怎么用?”

Victor露出神秘的笑容:

“推荐系统。Netflix用SVD来预测用户对电影的评分。用户-电影评分矩阵做SVD分解,低秩近似就能填补缺失的评分,这就是协同过滤的核心!”

PCA:降维的艺术

“PCA和SVD关系密切,但目的不同。SVD是分解矩阵,PCA是降维。”

Victor在白板上画了一个点云:

“给定一堆高维数据点,PCA找到方差最大的方向作为第一主成分,然后找垂直于它且方差第二大的方向作为第二主成分…以此类推。”

PCA的步骤:
1. 数据中心化(减去均值)
2. 计算协方差矩阵
3. 对协方差矩阵做特征分解
4. 按特征值大小排序特征向量
5. 选取前k个特征向量作为主成分
6. 将数据投影到主成分上
 
数学上:PCA就是对中心化数据矩阵做SVD!

Eric问:“PCA在量化中怎么用?”

“因子模型!”Victor提高了音量,“假设你有100只股票的收益率序列,直接分析100维太复杂。用PCA降到5维,这5个主成分就是隐含的风险因子——可能对应市场因子、行业因子、规模因子等。”

# PCA提取因子
from sklearn.decomposition import PCA
 
returns = load_stock_returns()  # (T, 100) 100只股票的收益率
 
pca = PCA(n_components=5)
factors = pca.fit_transform(returns)  # (T, 5) 5个因子
 
# 解释方差比例
print(pca.explained_variance_ratio_)
# 例如:[0.45, 0.20, 0.10, 0.08, 0.05]
# 前5个因子解释了88%的方差!

Carol若有所思:“所以上周说的协方差矩阵降秩问题,也可以用PCA来解决?”

“对!”Victor赞许地点头,“如果你的100×100协方差矩阵秩只有50,可以用PCA提取前50个主成分,在这个低维空间做风险分析,既稳定又有意义。”

LU/QR分解:效率之选

“最后说说LU和QR分解。这两个在理论上不如SVD优雅,但在数值计算中至关重要。”

LU分解:A = LU
- L:下三角矩阵
- U:上三角矩阵
- 用途:快速解线性方程组
 
为什么快?
直接求逆:O(n³)
LU分解后解方程:O(n²)
 
如果要解多个方程组Ax₁=b₁, Ax₂=b₂, ...
只需分解一次A,然后每次O(n²)求解
QR分解:A = QR
- Q:正交矩阵(列向量相互垂直)
- R:上三角矩阵
- 用途:最小二乘法、特征值计算
 
为什么用QR不用直接求逆?
数值稳定性!正交矩阵的条件数为1,不会放大误差

Bob问:“什么时候用LU,什么时候用QR?”

“规则很简单:解方程组用LU,最小二乘用QR,一般分析用SVD。记住这三个就够了, 你还没能耐研究它们底层原理呢。”

💼实战专题1:推荐系统

周四,Victor宣布进入实战环节:

“今天我们用矩阵分解实现一个推荐系统。别只会调库,要理解底层原理!”

他在白板上画了一个用户-商品评分矩阵:

“这个矩阵是稀疏的,大部分位置是空的。我们假设这个矩阵是低秩的——用户的喜好可以用少数几个隐含因子来描述。”

Victor写下矩阵分解的目标:

设评分矩阵 R ≈ P × Qᵀ 其中:

  • R:m×n 评分矩阵(m个用户,n个商品)
  • P:m×k 用户因子矩阵
  • Q:n×k 商品因子矩阵
  • k:隐含因子数量(通常很小,如10-50) 预测评分:r̂ᵢⱼ = pᵢ · qⱼ(用户i的向量与商品j的向量的点积)

“这就是为什么上周我们要学点积!推荐系统的核心就是:找到用户和商品的隐含向量表示,用点积计算相似度。”

Alice问:“怎么训练P和Q?”

Victor写下优化目标:

# 损失函数:预测评分与真实评分的均方误差
def loss(P, Q, R, mask):
    pred = P @ Q.T
    diff = (pred - R) * mask  # mask标记哪些位置有真实评分
    return np.sum(diff ** 2)
 
# 加上正则化防止过拟合
def regularized_loss(P, Q, R, mask, lambda_reg):
    return loss(P, Q, R, mask) + lambda_reg * (np.sum(P**2) + np.sum(Q**2))

“训练方法有很多:梯度下降、交替最小二乘(ALS)、随机梯度下降(SGD)…Netflix Prize比赛的冠军方案就是基于矩阵分解的。”

他给出了一个简化的实现:

def matrix_factorization(R, k=10, steps=1000, alpha=0.01, lambda_reg=0.1):
    m, n = R.shape
    P = np.random.randn(m, k) * 0.1
    Q = np.random.randn(n, k) * 0.1
 
    mask = (R > 0).astype(float)  # 只在有评分的位置计算损失
 
    for step in range(steps):
        # 计算梯度
        pred = P @ Q.T
        error = (pred - R) * mask
 
        P_grad = error @ Q + lambda_reg * P
        Q_grad = error.T @ P + lambda_reg * Q
 
        # 更新参数
        P -= alpha * P_grad
        Q -= alpha * Q_grad
 
        if step % 100 == 0:
            print(f"Step{step}, Loss:{loss(P, Q, R, mask):.4f}")
 
    return P, Q

Bob兴奋地说:“所以Netflix知道我喜欢什么电影,是因为它把我和电影都映射到了同一个向量空间?”

“对!如果你喜欢科幻片,你的用户向量在’科幻’这个维度上的值就会很高。如果一部电影是科幻片,它的商品向量在’科幻’维度上也很高。点积大,推荐概率就高。”

💰实战专题2:投资组合优化

同一天下午,Victor切换到金融主题:

“现在我们用线性代数解决一个真正的金融问题:Markowitz投资组合优化。”

他在白板上写下问题定义:

给定n只股票:

  • 预期收益向量 μ = (μ₁, μ₂, …, μₙ)
  • 协方差矩阵 Σ(n×n) 投资组合权重向量 w = (w₁, w₂, …, wₙ) 约束:Σwᵢ = 1(权重之和为1) 目标:在给定收益水平下,最小化风险 组合收益:E[r] = wᵀμ 组合风险(方差):Var[r] = wᵀΣw

“这是一个二次规划问题。用拉格朗日乘数法可以得到解析解,但关键是理解里面的矩阵运算。”

Carol问:“wᵀΣw这个形式代表什么?”

Victor详细解释:

wᵀΣw 叫做二次型(quadratic form) 展开: wᵀΣw = Σᵢ Σⱼ wᵢ wⱼ σᵢⱼ 其中σᵢⱼ是资产i和j的协方差 几何意义:

  • 权重向量w定义了一个方向
  • Σw是协方差矩阵对w的变换
  • wᵀΣw是w和Σw的点积
  • 结果是一个标量,表示该方向上的”风险强度”

“还记得特征分解吗?协方差矩阵的特征向量就是风险的主轴。如果你的投资组合权重w正好等于最大特征值对应的特征向量,那你承担的风险最大!”

Alice问:“那最小方差组合怎么求?”

Victor写下推导:

最小化:wᵀΣw
约束:wᵀ1 = 1(权重之和为1)
 
拉格朗日函数:
L = wᵀΣw - λ(wᵀ1 - 1)
 
对w求导令其为0:
2Σw - λ1 = 0
w = (λ/2)Σ⁻¹1
 
代入约束条件:
wᵀ1 = (λ/2)1ᵀΣ⁻¹1 = 1
λ = 2 / (1ᵀΣ⁻¹1)
 
最终解:
w* = Σ⁻¹1 / (1ᵀΣ⁻¹1)

“看到了吗?最小方差组合的权重与协方差矩阵的逆有关。这就是为什么我们上周强调矩阵可逆性——如果协方差矩阵奇异,这个公式就失效了!”

他给出Python实现:

def minimum_variance_portfolio(cov_matrix):
    """计算最小方差组合权重"""
    n = cov_matrix.shape[0]
    ones = np.ones(n)
 
    # 检查矩阵是否可逆
    if np.linalg.matrix_rank(cov_matrix) < n:
        print("警告:协方差矩阵降秩,使用伪逆")
        cov_inv = np.linalg.pinv(cov_matrix)
    else:
        cov_inv = np.linalg.inv(cov_matrix)
 
    # w* = Σ⁻¹1 / (1ᵀΣ⁻¹1)
    weights = cov_inv @ ones
    weights = weights / np.sum(weights)
 
    return weights
 
def efficient_frontier(returns, cov_matrix, n_points=100):
    """计算有效前沿"""
    n = len(returns)
 
    # 目标收益从最小到最大
    min_ret = np.min(returns)
    max_ret = np.max(returns)
    target_returns = np.linspace(min_ret, max_ret, n_points)
 
    frontier_risk = []
    frontier_weights = []
 
    for target in target_returns:
        # 这里需要解带等式约束的二次规划
        # 简化起见,使用scipy.optimize
        from scipy.optimize import minimize
 
        def portfolio_var(w):
            return w @ cov_matrix @ w
 
        constraints = [
            {'type': 'eq', 'fun': lambda w: np.sum(w) - 1},
            {'type': 'eq', 'fun': lambda w: w @ returns - target}
        ]
 
        result = minimize(portfolio_var, np.ones(n)/n,
                         constraints=constraints)
 
        frontier_risk.append(np.sqrt(result.fun))
        frontier_weights.append(result.x)
 
    return target_returns, frontier_risk, frontier_weights

Eric感叹:“原来投资组合优化就是在协方差矩阵定义的’风险空间’里找最优方向…”

“现在你开始理解了。”Victor难得露出满意的表情,“数学不是抽象的符号游戏,它描述的是真实世界的结构。投资组合优化、推荐系统、图像压缩…本质上都是在高维空间里找最优方向。”

⚠️数值稳定性:工程师的必修课

周五,最后一天的课程。

Victor表情严肃:

“今天讲的内容,可能会救你们的命——至少会救你们的钱。”

他在白板上写下:

为什么不要直接求逆矩阵?

“你们的代码里,我看到大量的np.linalg.inv()调用。这是危险的。”

Bob不服:“求逆有什么问题?数学上不是很自然吗?”

Victor冷笑:

“数学上自然,数值上灾难。来,我给你们演示。”

import numpy as np
 
# 创建一个接近奇异的矩阵
A = np.array([
    [1.0, 1.0],
    [1.0, 1.0001]
])
 
b = np.array([2.0, 2.0001])
 
# 方法1:直接求逆
x_inv = np.linalg.inv(A) @ b
print(f"直接求逆:{x_inv}")
 
# 方法2:用solve(内部用LU分解)
x_solve = np.linalg.solve(A, b)
print(f"用solve:{x_solve}")
 
# 引入微小扰动
b_perturbed = np.array([2.0, 2.0002])  # 只变了0.0001
 
x_inv_perturbed = np.linalg.inv(A) @ b_perturbed
print(f"扰动后直接求逆:{x_inv_perturbed}")
print(f"结果变化:{x_inv_perturbed - x_inv}")

“看,b只变了0.0001,结果却变了几个数量级!这就是条件数的问题。”

Victor解释条件数:

条件数(Condition Number): κ(A) = ||A|| × ||A⁻¹|| 对于对称矩阵: κ(A) = |λmax| / |λmin| 条件数的意义:

  • κ ≈ 1:矩阵良态(well-conditioned),数值稳定
  • κ >> 1:矩阵病态(ill-conditioned),误差会被放大
  • κ = ∞:矩阵奇异,不可逆 经验法则: 如果κ(A) ≈ 10ᵏ,结果会损失约k位有效数字

“那个接近奇异的矩阵,条件数大约是10⁴。这意味着输入误差会被放大一万倍!”

Carol问:“那怎么避免这个问题?”

Victor给出规则:

工程实践守则:
1. 永远不要直接求逆
   ✗ x = inv(A) @ b
   ✓ x = solve(A, b)  # 内部用LU/QR分解
2. 检查条件数
   cond = np.linalg.cond(A)
   if cond > 1e10:
       print("警告:矩阵病态!")
3. 使用SVD处理病态矩阵
   U, S, Vt = np.linalg.svd(A)
   # 截断小奇异值
   S[S < threshold] = 0
4. 正则化
   # 不是 inv(XᵀX) @ Xᵀy
   # 而是 inv(XᵀX + λI) @ Xᵀy(Ridge回归)

最后,Victor讲解了稀疏矩阵

“大规模数据分析中,矩阵往往是稀疏的——大部分元素是0。如果你用稠密矩阵存储,浪费内存不说,计算也慢得要死。”

from scipy import sparse
 
# 稠密矩阵:1000×1000 = 100万个元素
dense = np.zeros((1000, 1000))
# 假设只有1万个非零元素
 
# 稀疏矩阵:只存储非零元素
rows = [...]  # 非零元素的行索引
cols = [...]  # 非零元素的列索引
data = [...]  # 非零元素的值
sparse_matrix = sparse.csr_matrix((data, (rows, cols)), shape=(1000, 1000))
 
# 内存对比
print(f"稠密矩阵:{dense.nbytes / 1e6:.2f} MB")
print(f"稀疏矩阵:{sparse_matrix.data.nbytes / 1e3:.2f} KB")

“在推荐系统中,用户-商品评分矩阵通常99%都是0。用稀疏矩阵,千万级用户的系统才能跑得动。”

🎓结业与展望

课程结束后,黑犬把大家召集在一起。

“两周的培训结束了。张总,你觉得他们进步如何?”

Victor推了推眼镜,难得地露出了一丝笑意:

“从文盲进步到了小学生。”

全场哄笑。

“但是,”Victor话锋一转,“有几个人让我印象深刻。Alice对数学的直觉很好,已经能自己推导PCA和因子模型的关系了。Carol的工程能力配合数学思维,实现的SVD压缩代码效率很高。Bob虽然基础差,但学习速度快,从三层循环优化到矩阵运算只用了两天。”

黑犬满意地点头:“那Victor,你愿意继续留下来吗?”

Victor沉默了几秒:

“我考虑考虑。这群人虽然蠢,但比普林斯顿的学生有趣。他们会把数学用到真实的金融产品里,而不是发表论文后束之高阁。况且这里比起学校,工资高多了哈哈哈。”

他收拾东西准备离开,走到门口又回头:

“下周开始,我要测试你们能不能把这两周学的东西用到实际项目中。谁能用SVD把上个月的推荐系统效果提升10%,我请他吃饭。”

Bob喊道:“Victor,你请客的话是去哪里吃?”

“食堂。”

全场爆笑。

Victor离开后,Carol看着白板上密密麻麻的公式,对Alice说:

“这两周学的东西,比我大学四年学的都多。”

Alice点头:“因为Victor不只是在教公式,他在教思维方式。从几何直觉出发,理解每个公式背后的意义,然后才是计算。”

Bob插嘴:“我现在看到矩阵乘法,脑子里自动浮现的是空间变换,不再是行乘列了。”

Carol笑了:“这大概就是Victor说的’从代码猴子进化到量化研究员’的第一步吧。”

📒本周总结

本周是线性代数的进阶篇,也是最后一周的线代内容。文章任务虚拟且真实的量化工作人员也不会搞不懂文中的知识,这样写只是提供一种有趣的方式来理解线性代数的基本知识。

🚨一个重要说明:一些读者问我说原来week9-10不是C++模板编程的主题么,是不是搞错了。其实不是,因为我发现原来计划的是讲完模板编程,插入一个月的线代再讲STL的内容,然而STL库本身就需要模板编程的基础更好理解,把模板和STL放在一起讲反而连贯性会更好,因此在C++基础语法之后把线代提前了。

本周我们跟随Victor完成了线性代数的深入学习:

  1. 特征值与特征向量
  • 核心概念:Av = λv,找到变换的”主轴”
  • 几何意义:特征向量是只被拉伸不被旋转的方向
  • 应用:PageRank、协方差矩阵分析、风险因子识别
  1. 矩阵分解三剑客
  • SVD:万能分解,A = UΣVᵀ,用于降维、压缩、推荐系统
  • PCA:找方差最大的方向,提取主成分和隐含因子
  • LU/QR:高效解方程组,保证数值稳定性
  1. 实战应用
  • 推荐系统:用户-商品矩阵分解,点积计算相似度
  • 投资组合优化:Markowitz模型,最小方差组合
  • 因子模型:用PCA提取风险因子
  1. 数值稳定性
  • 条件数:衡量矩阵的”健康程度”
  • 永远不要直接求逆,用solve或SVD
  • 大规模数据必须用稀疏矩阵

正如Victor所说:数学不是抽象的符号游戏,它描述的是真实世界的结构。投资组合优化、推荐系统、图像压缩…本质上都是在高维空间里找最优方向。理解了这一点,你就不再是调用API的程序猿,而是真正可以着手做量化研究的人了。

本周的代码实现和练习已上传至Github仓库:https://github.com/shuheng-mo/qd-study-plan-104wk.git

下周预告:W11 - 线性代数进阶(上)

线性代数基本原理告一段落,下周我们将更深入的探讨线性代数在量化中的运用。

各位下周五见!👋