01-深度学习基础

本节介绍深度学习的核心原理,包括神经网络、RNN、LSTM、Attention 等模型的数学直觉和在量化中的应用。

为什么量化需要深度学习?

传统量化方法的局限

传统量化建模流程:

原始数据 ─→ 手工特征工程 ─→ 线性模型/树模型 ─→ 预测
           │
           ├── 移动平均
           ├── 动量指标
           ├── 波动率
           ├── 交叉特征
           └── ...(数百个特征)

问题

  1. 特征工程繁重:需要大量领域知识手动构建特征
  2. 时序依赖有限:树模型难以捕捉长期时间依赖
  3. 非线性表达不足:线性模型和简单树模型表达能力有限
  4. 跨品种泛化差:每个品种可能需要重新设计特征

深度学习的优势

深度学习建模流程:

原始数据 ─→ 自动特征学习 ─→ 非线性映射 ─→ 预测
           │                 │
           │                 └── 多层神经网络
           │
           └── CNN/RNN/Attention 自动提取模式

优势

  1. 自动特征学习:从原始数据中自动学习有用的表示
  2. 强大的时序建模:LSTM/Transformer 擅长捕捉长期依赖
  3. 端到端训练:数据到预测的整个流程联合优化
  4. 跨品种迁移:预训练模型可以迁移到新品种

深度学习在量化中的典型应用

应用场景传统方法深度学习方法
价格预测ARIMA、GARCHLSTM、Transformer
高频交易订单流特征CNN+LSTM 处理订单簿
因子挖掘财务因子、技术指标自动因子学习
风险预测波动率模型VaR 预测网络
情感分析词典匹配BERT 分析财经新闻

神经网络基础

神经元结构

        x₁ ────────┐
                   │    w₁
                   ▼
        x₂ ──────[ Σ ]───→  f() ──→ y
                   ▲
        x₃ ────────┤    w₂
                   │    w₃
        b  ────────┘

其中:
  • x₁, x₂, x₃ 是输入特征
  • w₁, w₂, w₃ 是权重(weights)
  • b 是偏置(bias)
  • f() 是激活函数
  • y 是输出

数学表达

其中:

  • 是权重向量
  • 是输入向量
  • 是偏置
  • 是激活函数

激活函数

激活函数引入非线性,使神经网络能够拟合复杂的非线性关系。

激活函数公式导数优点缺点适用场景
Sigmoid输出(0,1),适合概率梯度消失,输出不零中心二分类输出层
Tanh零中心,输出(-1,1)仍有梯度消失RNN 隐藏层
ReLU解决梯度消失,计算快死神经元问题大多数隐藏层
Leaky ReLU if , else 解决死神经元需要调 深 / 宽网络
GELU复杂平滑,性能好计算复杂Transformer/BERT

可视化对比

ReLU (最常用):
     │
     │     ╱
     │    ╱
     │   ╱
     │  ╱
     │ ╱
     │╱
     └─────── x

Leaky ReLU:
   ╲ │
    ╲│     ╱
     │    ╱
     │   ╱
     │  ╱
     │ ╱
     │╱
     └─────── x

GELU (平滑曲线):
     │    ╭─
     │   ╱
     │  ╱
     │─╱
     │
     └─────── x

前向传播和反向传播

前向传播(Forward Pass):从输入到输出的计算过程

反向传播(Backward Pass):根据损失计算梯度

根据链式法则逐层计算梯度。

损失函数

损失函数公式梯度适用场景
MSE回归任务
MAE$\mathcal{L} = \frac{1}{n}\sum_{i=1}^{n}y_i - \hat{y}_i$
Huber$\mathcal{L} = \begin{cases} \frac{1}{2}(y-\hat{y})^2 &y-\hat{y}\leq \delta \ \delta(
Cross-Entropy分类任务

梯度问题

梯度消失

深层网络中,梯度在反向传播过程中逐渐变小,导致浅层参数几乎不更新。

梯度在反向传播中的衰减:

输出层
   │
   ▼ 梯度 = 1.0
   │
第 L 层
   │
   ▼ 梯度 = 0.5 (×0.5)
   │
第 L-1 层
   │
   ▼ 梯度 = 0.25 (×0.5)
   │
...
   │
   ▼ 梯度 ≈ 0 (几乎消失!)
第 1 层

原因

  1. 链式法则中多个小于1的梯度相乘
  2. Sigmoid/Tanh 激活函数的导数最大值小于1

解决方法

  1. 使用 ReLU 激活函数(导数为1)
  2. 使用残差连接(ResNet)
  3. 使用归一化层(BatchNorm/LayerNorm)
  4. 使用 LSTM/GRU(专门设计解决此问题)

梯度爆炸

与梯度消失相反,梯度在反向传播中变得极大,导致参数更新过大。

解决方法

  1. 梯度裁剪(Gradient Clipping):限制梯度的范数
  2. 权重初始化(Xavier/He 初始化)
  3. 降低学习率

梯度裁剪代码示例(PyTorch):

import torch
 
# 计算梯度
loss.backward()
 
# 裁剪梯度:最大范数为1.0
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
 
# 更新参数
optimizer.step()

序列数据的特点

量化时序数据有以下几个关键特点:

特点描述对建模的影响
时间依赖当前值依赖历史值需要记忆机制
非平稳性分布随时间变化需要滚动训练
噪声大金融数据信噪比低需要强正则化
长距离依赖早期信息可能仍有影响需要长期记忆
多变量交互多个特征相互影响需要多变量建模
示例:日收益率序列

    2% ┐                     *───┐
        │                  *─┘   │
    1% ┤             *───┘      │
        │          *─┘          │
    0% ┼────*───*──────────────*─────── 时间
        │   │                    │
   -1% ┤   │                    │
        │   │                    │
   -2% ┘   │                    │
            └────────────────────┘

特点:波动聚集(GARCH效应)、均值回归、偶尔的极端值

RNN 原理

基本结构

RNN(Recurrent Neural Network)通过隐藏状态(Hidden State)传递历史信息:

展开时间步:

t=1:      t=2:      t=3:      t=4:
  x₁ ──→ [RNN] ──→ h₁ ──→ [RNN] ──→ h₂ ──→ [RNN] ──→ h₃ ──→ [RNN] ──→ h₄
  │              │              │              │
  └──────────────┴──────────────┴──────────────┘
      隐藏状态在时间步间传递

数学公式

其中:

  • :t时刻的输入
  • :t时刻的隐藏状态
  • :隐藏状态到隐藏状态的权重
  • :输入到隐藏状态的权重
  • :隐藏状态到输出的权重

RNN 的局限性

  1. 梯度消失:长序列中梯度在反向传播时消失
  2. 短期记忆:难以捕捉长期依赖(>10个时间步)
  3. 顺序计算:无法并行,训练慢
RNN 的记忆衰减:

信息强度
  │
  │█
  │██
  │███
  │████
  │█████
  │██████
  │███████
  └─────────→ 时间
  t=1  t=5  t=10 t=15 t=20

  早期信息迅速衰减

LSTM 原理

LSTM(Long Short-Term Memory)通过门控机制细胞状态解决长期依赖问题。

核心思想

LSTM 内部结构:

                    ┌─────────────────────────────────────┐
                    │         细胞状态 (Cell State)         │
                    │         ─────────────────→           │
                    │      (信息高速公路,很少改变)           │
                    └─────────────────────────────────────┘
                              │      ▲      │
                              │      │      │
        遗忘门                │      │      │                输出门
     (Forget Gate)            │      │      │            (Output Gate)
         ┌─────┐              │      │      │                ┌─────┐
         │  σ  │ ────×──────→│      ├─────×───→              │  σ  │
         └─────┘              │      │          ────×──────→ └─────┘
           ▲                 ┌┴┐     ▲              ▲         ▲
           │                 ││tanh  │              │         │
        ┌───┴────┐       ┌───┴┴─────┴───┐       ┌───┴────┐   │
        │  hₜ₋₁  │       │     Cₜ₋₁     │       │  Cₜ    │   │
        └────────┘       └──────────────┘       └────────┘   │
           ▲                                            │    │
           │                                            │    │
         ┌─┴────┐                                   ┌───┴────┴───┐
         │ xₜ   │                                   │   hₜ      │
         └──────┘                                   └───────────┘
         输入门 (Input Gate)

细胞状态(Cell State)

细胞状态是 LSTM 的”记忆高速公路”,信息可以在上面流动,改变很小:

其中 是逐元素乘法。

遗忘门(Forget Gate)

决定从细胞状态中丢弃什么信息

直觉:fₜ 接近1时保留信息,接近0时遗忘信息。

遗忘门作用示例:

Cₜ₋₁ = [0.8, 0.3, 0.9]  (之前的细胞状态)
fₜ  = [0.1, 0.9, 0.5]  (遗忘门输出)
─────────────────────────────────
fₜ ⊙ Cₜ₋₁ = [0.08, 0.27, 0.45]  (遗忘后)

含义:
  • 第1维信息几乎被遗忘 (0.8→0.08)
  • 第2维信息大部分保留 (0.3→0.27)
  • 第3维信息部分保留 (0.9→0.45)

输入门(Input Gate)

决定向细胞状态中存储什么新信息

直觉

  • :决定哪些位置需要更新
  • :候选的新信息
输入门作用示例:

iₜ    = [0, 1, 1]      (更新哪些位置)
C̃ₜ    = [0.5, 0.6, 0.2] (候选新值)
─────────────────────────────────
iₜ ⊙ C̃ₜ = [0, 0.6, 0.2]  (要添加的信息)

含义:
  • 第1维不更新
  • 第2、3维添加新信息

输出门(Output Gate)

决定输出什么信息作为新的隐藏状态:

直觉:基于细胞状态和当前输入,决定输出什么给下一时刻。

LSTM 完整计算流程

LSTM 单个时间步的完整计算:

输入:hₜ₋₁ (上一时刻隐藏状态), xₜ (当前输入)
─────────────────────────────────────────────────────────
1. 遗忘门:决定遗忘什么
   fₜ = σ(Wf[hₜ₋₁, xₜ] + bf)

2. 输入门:决定存储什么
   iₜ = σ(Wi[hₜ₋₁, xₜ] + bi)
   C̃ₜ = tanh(WC[hₜ₋₁, xₜ] + bC)

3. 更新细胞状态
   Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ

4. 输出门:决定输出什么
   oₜ = σ(Wo[hₜ₋₁, xₜ] + bo)

5. 更新隐藏状态
   hₜ = oₜ ⊙ tanh(Cₜ)

输出:hₜ (当前隐藏状态), Cₜ (当前细胞状态)

GRU(Gated Recurrent Unit)

GRU 是 LSTM 的简化版本,只有两个门:

特性LSTMGRU
门数量3个(遗忘、输入、输出)2个(更新、重置)
细胞状态单独的 C 和 hC 和 h 合并
参数量更多更少
计算速度稍慢更快
性能通常稍好通常接近

GRU 公式

模型对比

模型长期依赖参数量训练速度并行能力量化推荐度
RNN⭐⭐
LSTM⭐⭐⭐⭐⭐
GRU⭐⭐⭐⭐
Transformer很好⭐⭐⭐

Transformer 和 Attention 机制

自注意力机制(Self-Attention)

Attention 允许模型在处理序列时关注不同位置的信息

其中:

  • (Query):查询向量
  • (Key):键向量
  • (Value):值向量

直觉:就像查字典,Query 是你想找的,Key 是每个条目的标签,Value 是内容。

Attention 可视化:

时间步:    t-3    t-2    t-1     t
Query:                         [?]
              ↓       ↓       ↓       ↓
Key:       [K1]   [K2]   [K3]   [K4]
              │       │       │       │
Value:     [V1]   [V2]   [V3]   [V4]
              │       │       │       │
权重:      0.1    0.2    0.5    0.2
                              └─重点关注 t-1

输出 = 0.1*V1 + 0.2*V2 + 0.5*V3 + 0.2*V4

多头注意力(Multi-Head Attention)

使用多组 Q、K、V 并行学习不同的注意力模式:

位置编码(Positional Encoding)

Transformer 本身没有位置概念,需要显式编码位置信息:

量化场景下的模型选择

时序预测模型选择决策树

数据量大(>2年)?
├─ 是 → 序列特征明显?
│      ├─ 是 → LSTM / LSTM+Attention
│      └─ 否 → Transformer (如果数据特别大)
└─ 否 → 树模型 (XGBoost/LightGBM)

因果性要求严格?
├─ 是 → 单向 LSTM / GRU
└─ 否 → 双向 LSTM (注意数据泄漏)

多步预测?
├─ 是 → Seq2Seq / Transformer
└─ 否 → 单层 LSTM

LSTM vs Transformer 在量化中的对比

维度LSTMTransformer
数据需求较少(>1年)大(>3年)
训练速度中等慢(但可并行)
长距离依赖好(几十步)很好(几百步)
计算资源CPU/GPUGPU必需
调参难度中等
量化应用主流新兴

核心知识点总结

1. 神经网络基础

  • 神经元:线性变换 + 非线性激活
  • 激活函数:ReLU 是首选,GELU 用于 Transformer
  • 前向传播:输入 → 层层变换 → 输出
  • 反向传播:链式法则计算梯度

2. 梯度问题

  • 梯度消失:深层网络梯度衰减 → 用 ReLU、残差、LSTM 解决
  • 梯度爆炸:梯度过大 → 用梯度裁剪解决

3. RNN/LSTM/GRU

  • RNN:基本序列建模,但有梯度消失问题
  • LSTM:三个门控制信息流,解决长期依赖
  • GRU:LSTM 简化版,参数更少

4. LSTM 门控机制

遗忘门 fₜ:决定从 Cₜ₋₁ 遗忘什么
输入门 iₜ:决定向 Cₜ 存储什么
输出门 oₜ:决定输出什么作为 hₜ
细胞状态 Cₜ:信息高速公路,长期记忆
隐藏状态 hₜ:当前时刻的输出

5. Attention/Transformer

  • Attention:让模型关注序列中的重要部分
  • Multi-Head:学习多种注意力模式
  • Positional Encoding:提供位置信息

练习建议

  1. 手算 LSTM:给定输入,手动计算一个时间步的 LSTM
  2. 可视化梯度:观察不同激活函数的梯度流动
  3. 对比模型:用相同数据训练 RNN、LSTM、GRU,比较效果

下一节

02-PyTorch框架入门.md 中,我们将学习如何用 PyTorch 实现这些概念。