| 函数 | 公式 | 范围 | 特点 | 金融应用 |
|---|---|---|---|---|
| Sigmoid | (0,1) | 梯度饱和,输出概率 | 违约概率输出层 | |
| Tanh | (-1,1) | 零中心,梯度饱和 | 特征标准化 | |
| ReLU | [0, ∞) | 稀疏激活,不死问题 | 隐层默认选择 | |
| Leaky ReLU | (-∞, ∞) | 解决ReLU死亡 | 替代ReLU | |
| GELU | (-∞, ∞) | GPT使用,平滑 | LLM隐层 | |
| Swish | (-∞, ∞) | 自门控,无界上界 | 高级网络 |
金融启示:输出层激活函数由任务决定——回归用linear,分类用sigmoid/softmax
|
链式法则: |
多层感知机 (MLP): 梯度下降更新: |
优化器演进:
SGD → Momentum → AdaGrad → RMSProp → Adam (最常用)
金融注意:
|
Dropout:训练时随机丢弃神经元,强制网络学习冗余表示
早停 (Early Stopping):验证集误差不再下降时停止训练 |
Batch Normalization:
|
生物神经元 → 数学抽象:
生物神经元:
树突 (接收信号) → 胞体 (整合) → 轴突 (输出)
↓ ↓ ↓
数学神经元:
x₁,...,x_p (输入) → Σ w_i x_i + b (加权和) → σ(z) (激活输出)
关键差异:
深度学习的核心洞见:
多层非线性变换可以学习层次化表示
低层学习简单特征(边缘/纹理),高层学习复杂概念(对象/语义)
1943: McCulloch-Pitts 神经元模型 (阈值逻辑单元)
1958: Rosenblatt 感知机 (单层, 可学习)
1969: Minsky & Papert《感知机》— 证明单层感知机局限性
→ 第一次AI冬天
1986: Rumelhart & Hinton 反向传播算法 (多层网络可训练)
→ 连接主义复兴
1998: LeCun LeNet-5 (CNN, 手写数字识别)
2006: Hinton 深度信念网络 (逐层预训练)— "Deep Learning"术语诞生
2012: AlexNet (ImageNet冠军, GPU训练) — 深度学习爆发
2014: GAN (Goodfellow), Seq2Seq (Sutskever)
2015: ResNet (152层, 残差连接), BatchNorm
2017: Transformer (Vaswani "Attention is All You Need")
2020: GPT-3 (175B参数) — 大模型时代
2022: ChatGPT — 生成式AI普及
三条主线:计算力(GPU) ↑ × 数据量(互联网) ↑ × 算法(BP/ReLU/BN/ResNet) ↑
问题根源:链式法则 + 深层网络
梯度消失 (Vanishing Gradient):
|∂a^(k)/∂a^(k-1)| < 1 (如sigmoid导数最大0.25)
→ 连乘L次 → 梯度指数衰减
→ 浅层学不到东西
→ 典型症状: 训练很久但浅层权重几乎不变
梯度爆炸 (Exploding Gradient):
|∂a^(k)/∂a^(k-1)| > 1
→ 连乘L次 → 梯度指数增长
→ 权重更新过大 → 损失NaN
解决方案对比:
| 方案 | 解决消失 | 解决爆炸 | 机制 |
|---|---|---|---|
| ReLU激活 | — | 正区间导数为1 | |
| 梯度裁剪 | — | 梯度范数超阈值则缩放 | |
| 残差连接 | — | 梯度高速公路 | |
| BatchNorm | 稳定每层激活分布 | ||
| 好的初始化 | Xavier/He确保初始方差 |
Internal Covariate Shift:网络参数更新 → 每层输入分布变化 → 训练不稳定
|
BatchNorm解决方案: 其中 |
为什么有效:
|
金融注意:BN假设batch间同分布 — 金融时序不满足→建议用LayerNorm
3.2 卷积神经网络CNN |
|
|
一维卷积(金融时间序列): |
二维卷积(图像):
|
|
关键参数:
|
金融应用:
|
1D卷积数值示例(金融时序):
输入 (价格序列): [10, 12, 11, 13, 14, 12, 15]
卷积核 (3日动量): [-1, 0, 1] ← 检测价格涨跌
步进计算:
pos 0: -1×10 + 0×12 + 1×11 = -10 + 11 = 1 (涨)
pos 1: -1×12 + 0×11 + 1×13 = -12 + 13 = 1 (涨)
pos 2: -1×11 + 0×13 + 1×14 = -11 + 14 = 3 (大涨)
pos 3: -1×13 + 0×14 + 1×12 = -13 + 12 = -1 (跌)
pos 4: -1×14 + 0×12 + 1×15 = -14 + 15 = 1 (涨)
输出特征: [1, 1, 3, -1, 1] ← 每日动量信号
核 [-1, 0, 1] 等价于简单的 "动量因子"——卷积网络通过自动学习卷积核来发现最优因子。
LeNet-5 (1998) → AlexNet (2012) → VGG (2014) → GoogLeNet/Inception (2014) → ResNet (2015)
识别手写 ImageNet突破 加深网络 Inception模块 残差连接
残差网络 (ResNet) 核心创新:
金融启示:残差连接思想广泛应用于金融时序建模——直接学习"残差"(价格变化)比学习绝对值更容易。
金融场景下DL训练的注意事项:
| 技巧 | 描述 | 金融应用 |
|---|---|---|
| 学习率调度 | 预热+衰减 | 先用大LR快速收敛,再用小LR精细调优 |
| 梯度裁剪 | 限制梯度最大值 | 金融数据极端值多,梯度爆炸常见 |
| 早停(Early Stopping) | 验证集误差不再下降时停止 | 防止在噪声上过拟合 |
| 学习率重启 | Cosine annealing | 跳出局部最优,重新探索 |
| 混合精度训练 | FP16混合FP32 | 加速训练50-100% |
| 批次归一化 | Batch Normalization | 稳定训练,允许更大LR |
# PyTorch训练配置(金融专用)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
scheduler = torch.optim.lr_scheduler.OneCycleLR(
optimizer, max_lr=1e-3,
steps_per_epoch=len(train_loader), epochs=100
)
# 梯度裁剪(金融重要!)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 早停
early_stopping = EarlyStopping(patience=10, min_delta=0.0001)
for epoch in range(100):
for batch in train_loader:
loss = train_step(batch)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()
scheduler.step()
val_loss = validate(model, val_loader)
if early_stopping(val_loss):
break
|
DL模型的超参数:
|
金融数据超参特点:
|
迁移学习:将在大规模数据上预训练的模型适配到金融领域
预训练: 全市场股票数据 → 学习通用市场表示
↓
微调: 特定板块/资产 → 适配目标资产
↓
在线学习: 持续更新 → 适应市场变化
金融应用场景:
| 场景 | 预训练数据 | 微调数据 | 优势 |
|---|---|---|---|
| 新股预测 | 全市场历史数据 | 新股上市后数据 | 解决冷启动问题 |
| 跨市场迁移 | 美股数据 | A股数据 | 弥补新兴市场数据不足 |
| 因子迁移 | 大型股票 | 中小盘股票 | 提高样本外表现 |
金融注意:深度学习在金融中的应用需要特别关注正则化、时序验证和迁移学习策略,以应对金融数据低信噪比的挑战。
|
金融K线图中的CNN模式识别:
|
可解释性价值:
|
限价订单簿 (LOB) 的CNN表示:
将最近40层订单簿表示为 40×(4+1) 矩阵:
每层: [买价, 买量, 卖价, 卖量, 成交量]
→ 类似"图像"的网格数据
CNN架构:
Conv2D(32, (2×1)) → 捕捉相邻价格层的关系
Conv2D(32, (4×1)) → 捕捉较大范围的价格模式
Inception Module → 多尺度模式
FC → 预测: 下一tick的价格方向
为什么CNN适合LOB:
3.3 循环神经网络RNN, LSTM, GRU |
|
标准RNN:
梯度消失/爆炸:
金融问题:金融序列中的长期依赖(如季度财报周期、宏观经济周期)需要模型记忆更长时间的上下文。
LSTM (Long Short-Term Memory) 通过门控机制解决长期依赖问题:
遗忘门:
输入门:
输出门:
|
金融建议:
|
LSTM主要变体:
| 变体 | 结构变化 | 特点 | 适用场景 |
|---|---|---|---|
| 标准LSTM | 遗忘门 + 输入门 + 输出门 | 完整记忆控制 | 通用时序建模 |
| 无遗忘门LSTM | 仅输入门 + 输出门 | 简化的记忆管理 | 短期时序(<20步) |
| 耦合门LSTM | 减少参数量 | 移动端/轻量部署 | |
| Peephole LSTM | 门控看到细胞状态 |
更精确的时序控制 | 需要精确计时的任务 |
| GRU | 重置门 + 更新门 | LSTM的简化版 | 训练速度优先 |
| ConvLSTM | 门控用卷积替代全连接 | 时空序列建模 | 订单簿动态预测 |
| 双向LSTM | 正向+反向 | 利用未来信息 | 非实时分析(财报) |
金融选型:标准LSTM是金融时序建模的默认选择;GRU适合高频场景(训练快);ConvLSTM适合订单簿分析(含空间结构)。
|
双向RNN (BiRNN):
|
堆叠RNN (Stacked RNN):
|
金融注意:堆叠层数不是越多越好,金融数据通常2-3层足够,更深容易过拟合。
RNN的时间展开:
前向: h_t = tanh(W_h h_{t-1} + W_x x_t + b)
损失: L = Σ_t L_t(ŷ_t, y_t)
反向: ∂L/∂W_h = Σ_t ∂L_t/∂W_h
需要从t=T一直反向传播到t=1
→ 计算图深度 = 序列长度 × 网络层数
截断BPTT (Truncated BPTT):
不分摊到 完整序列(可能数千步)
而是 序列切分为K步的块
每个块内做完整BPTT,块之间隐藏状态传递
典型K=20-50 (金融日频), K=100-200 (分钟频)
为什么RNN需要梯度裁剪:
长序列 + 循环权重 > 1 → 梯度指数爆炸
→ 权重更新 |ΔW| 可达 10^6
→ 损失直接NaN,训练崩溃
两种裁剪方式:
# 1. 按范数裁剪 (By Norm)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 如果 ||g|| > max_norm → g = g * max_norm / ||g||
# 保持梯度方向,限制步长
# 2. 按值裁剪 (By Value)
torch.nn.utils.clip_grad_value_(model.parameters(), clip_value=0.5)
# g[g > 0.5] = 0.5, g[g < -0.5] = -0.5
# 简单粗暴,但破坏梯度方向
金融建议:训练RNN/LSTM时必须使用梯度裁剪。max_norm=1.0是安全默认值。
用具体数字走查LSTM:
假设: h_{t-1}=[0.5, -0.3], x_t=[1.0, 0.5], 所有门权重=0.5, bias=0
遗忘门: f_t = σ(0.5·[0.5,-0.3,1.0,0.5]) = σ(0.85) = 0.70
→ 保留70%的旧记忆
输入门: i_t = σ(0.5·[0.5,-0.3,1.0,0.5]) = σ(0.85) = 0.70
→ 写入70%的新信息
候选记忆: c̃_t = tanh(0.5·[0.5,-0.3,1.0,0.5]) = tanh(0.85) = 0.69
→ 新候选信息值
新记忆: c_t = f_t·c_{t-1} + i_t·c̃_t = 0.70·0.2 + 0.70·0.69 = 0.62
→ 遗忘旧信息+写入新候选
输出门: o_t = σ(0.5·[0.5,-0.3,1.0,0.5]) = σ(0.85) = 0.70
→ 输出70%的记忆
新隐藏: h_t = o_t·tanh(c_t) = 0.70·tanh(0.62) = 0.70·0.55 = 0.39
数值洞察:
- 所有门共享相同的输入→门值相同(简化版本)
- 实际中每个门有独立的权重→可以学习不同的门行为
- 遗忘门控制记忆保留→设置接近1(不完全遗忘)
|
Seq2Seq架构:
|
金融应用场景:
|
Attention + Seq2Seq:
在Decoder每步计算与Encoder所有步的注意力权重 → 解决长序列信息瓶颈
3.4 Transformer进阶Transformer in Finance |
|
输入序列: [x₁, x₂, x₃, ..., xₙ]
↓
[Token Embedding + Position Encoding]
↓
┌──────────────────────────────────┐
│ Multi-Head Self-Attention │
│ ┌──┐ ┌──┐ ┌──┐ ┌──┐ │
│ │H1│ │H2│ │H3│ ... │H8│ │
│ └──┘ └──┘ └──┘ └──┘ │
│ Concat + Linear │
└──────────────────────────────────┘
↓ Add & LayerNorm
┌──────────────────────────────────┐
│ Feed-Forward Network │
│ Linear → GELU → Linear │
└──────────────────────────────────┘
↓ Add & LayerNorm
↓ (重复N次)
[Encoder Output]
金融可视化:注意力权重热力图可以显示时间序列中哪些时间步"关注"了哪些其他时间步——揭示市场联动关系。
为什么需要位置编码?
正弦位置编码的性质:
金融类比:不同频率成分对应不同时间尺度——高频(日频变化)到低频(年频趋势)。
金融Transformer变体:
三阶段策略:
|
|
|
优势:
3.5 GAN与扩散模型Generative Models in Finance |
|
|
架构:生成器(Generator) vs 判别器(Discriminator)
flowchart LR
z["随机噪声 z"]:::input
real["真实样本 x"]:::real
subgraph GNet["生成器 Generator"]
direction LR
g["G(z)"]:::gen
end
fake["生成样本 G(z)"]:::fake
subgraph DNet["判别器 Discriminator"]
direction LR
d["D(x) / D(G(z))"]:::disc
end
out1["真实概率高"]:::out
out2["真实概率低"]:::out
z --> g --> fake
real --> d --> out1
fake --> d --> out2
d -. 对抗训练反馈 .-> g
classDef input fill:#EEF2FF,stroke:#6366F1,stroke-width:1.2px,color:#222;
classDef real fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222;
classDef fake fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222;
classDef gen fill:#FEF3C7,stroke:#D97706,stroke-width:1.2px,color:#222;
classDef disc fill:#DBEAFE,stroke:#2563EB,stroke-width:1.2px,color:#222;
classDef out fill:#F3F4F6,stroke:#999,stroke-width:1px,color:#222;
|
目标函数: 金融应用:
|
前向过程:逐步添加噪声直到纯噪声
逆向过程:学习去噪
vs GAN:
| 特性 | GAN | 扩散模型 |
|---|---|---|
| 训练稳定性 | 不稳定(模式崩塌) | 稳定 |
| 样本质量 | 高 | 更高(但生成慢) |
| 多样性 | 有限 | 丰富 |
| 计算成本 | 中等 | 高 |
金融潜力:扩散模型在生成逼真的市场路径方面显示潜力(优于GAN),可用于期权定价和风险管理。
案例1:合成收益率数据生成
|
应用场景:
案例2:市场情景生成
|
自编码器 (Autoencoder):无监督学习,学习数据的压缩表示
金融应用:
| 应用 | 原理 | 价值 |
|---|---|---|
| 异常检测 | 重建误差大=异常 | 市场操纵检测、交易异常 |
| 噪声过滤 | 去噪自编码器 | 从噪声行情中提取信号 |
| 因子提取 | 隐编码=风险因子 | 类似PCA但非线性 |
| 缺失值填充 | 从非缺失部分重建缺失 | 财报数据插补 |
# 使用自编码器进行金融异常检测
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
input_dim = X_train.shape[1]
encoding_dim = 8 # 压缩维度
# 自编码器
input_layer = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_layer)
decoded = Dense(input_dim, activation='linear')(encoded)
autoencoder = Model(input_layer, decoded)
autoencoder.compile(optimizer='adam', loss='mse')
# 在正常数据上训练
autoencoder.fit(X_normal, X_normal, epochs=50, batch_size=32)
# 计算重建误差
reconstructions = autoencoder.predict(X_test)
mse = np.mean((X_test - reconstructions) ** 2, axis=1)
# 高MSE = 潜在的异常交易行为
threshold = np.percentile(mse, 95)
anomalies = X_test[mse > threshold]
时间序列生成的最新进展:
| 方法 | 生成质量 | 训练稳定性 | 金融适用性 |
|---|---|---|---|
| GAN | 中等 | 不稳定 | 合成数据生成 |
| 扩散模型 | 高 | 稳定 | 情景生成 |
| VAE | 中等 | 稳定 | 隐含表示学习 |
| 自回归模型 | 高 | 稳定 | 时间序列预测 |
金融实践:扩散模型在2024-2025年迅速崛起,在生成逼真的金融时间序列方面显著优于GAN,特别适用于压力测试情景生成和期权定价中的路径模拟。
Minimax博弈:
两部分直观理解:
判别器D:
max log D(真实数据) + log(1-D(生成数据))
→ 真实数据给高分,生成数据给低分
生成器G:
min log(1-D(G(z))) ≈ max log D(G(z))
→ 让D误判生成数据为真实
训练不稳定的根源:
模式崩塌:生成器只能生成少数几种模式
真实数据分布: [模式A] [模式B] [模式C] [模式D]
GAN生成: [模式A] [模式C]
↑ B和D完全丢失 (collapse)
检测:生成大量样本 → 聚类 → 聚类数远小于真实数据模式数
Wasserstein GAN (WGAN)解决方案:
金融时间序列生成评估:
| 指标 | 评估什么 | 方法 |
|---|---|---|
| 收益率自相关 | 时序依赖 | 比较ACF图 |
| 波动率聚类 | 条件异方差 | 比较GARCH效应 |
| 尾部指数 | 极端值分布 | Hill估计量对比 |
| 协方差矩阵 | 多资产关系 | 比较相关矩阵Frobenius范数 |
| 预测效用 | 有用性 | 用生成数据训练→真数据评估 |
3.6 强化学习基础RL Fundamentals |
|
五元组
策略
目标:最大化累积折扣奖励
金融映射:
RL在金融中的参数化设计模式:
| 要素 | 设计原则 | 反例(应避免) |
|---|---|---|
| 状态空间 | 包含可观测变量+可计算特征 | 包含未来信息(前视偏差) |
| 动作空间 | 离散(方向)或连续(比例),与执行匹配 | 动作分辨率与交易约束不匹配 |
| 奖励函数 | 风险调整后收益,考虑交易成本 | 仅用原始收益(忽略风险) |
| 折扣因子γ | 短期任务γ≈0.9,长期γ≈0.99 | γ=1.0(无限远收益,训练不稳定) |
| 初始状态分布 | 覆盖不同市场周期 | 仅在牛市数据上训练 |
常见金融RL任务参数化:
| 任务 | 状态空间(S) | 动作空间(A) | 奖励(R) |
|---|---|---|---|
| 组合优化 | 价格+持仓+因子值 | 权重调整[0,1] | Sharpe/Sortino Ratio |
| 最优执行 | 剩余量+时间+价格+波动率 | 交易比例[0,1] | 实现价格 - 基准 - 冲击成本 |
| 做市 | 库存+价差+波动率+订单流 | bid/ask报价调整 | 做市收入 - 库存风险惩罚 |
| 期权对冲 | 标的价格+Greek+持仓 | 对冲比率调整 | PnL波动率惩罚(最小化风险) |
状态价值函数
Bellman期望方程:
Bellman最优方程:
关键 insight:V和Q通过自举(bootstrap)方式互相定义,构成迭代求解的基础。
核心更新公式:
off-policy:使用行为策略产生数据,但学习目标策略(贪心策略)
|
flowchart LR
s["当前状态 s"]:::state
qtab["Q表"]:::table
policy["行为策略
epsilon-greedy"]:::policy a["动作 a"]:::action env["环境"]:::env r["奖励 r"]:::result sn["下一状态 s'"]:::state maxq["查询下一状态最大Q值 max Q(s', a')"]:::calc update["更新 Q(s, a) 向目标值靠近"]:::update note["off-policy 用探索策略采样 用贪心目标更新"]:::note s --> policy qtab --> policy policy --> a a --> env env --> r env --> sn sn --> maxq qtab --> maxq s --> update a --> update r --> update maxq --> update update --> qtab policy -. 采样策略 .-> note maxq -. 目标策略 .-> note classDef state fill:#DDEBFF,stroke:#5B8FF9,stroke-width:1.2px,color:#222; classDef table fill:#F3E8FF,stroke:#8B5CF6,stroke-width:1.2px,color:#222; classDef policy fill:#FFF4CC,stroke:#C9A227,stroke-width:1.2px,color:#222; classDef action fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222; classDef env fill:#F3F4F6,stroke:#999,stroke-width:1px,color:#222; classDef result fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222; classDef calc fill:#DBEAFE,stroke:#2563EB,stroke-width:1.2px,color:#222; classDef update fill:#FDE68A,stroke:#D97706,stroke-width:1.2px,color:#222; classDef note fill:#F9FAFB,stroke:#6B7280,stroke-width:1px,color:#222; |
|
核心困境:
常见策略:
| 策略 | 描述 | 金融类比 |
|---|---|---|
| 概率ε随机探索 | 保留一小部分资金尝试新策略 | |
| UCB | 置信上界,不确定性高的动作更值得探索 | 对新资产/策略赋予更高权重 |
| 汤普森采样 | 从后验分布采样 | 贝叶斯组合优化 |
| 熵正则化 | 在目标函数中加入策略熵 | 鼓励策略多样化 |
金融意义:交易中"探索"意味着承担试错成本,"利用"意味着坚持已知有效策略。两者平衡直接影响到实盘表现。
为什么需要策略梯度?
基于价值的方法 (DQN) 局限:
策略梯度直接优化策略:
直觉理解:
∇log π(a|s) · R:
如果奖励R>0 → 提升这个动作的概率
如果奖励R<0 → 降低这个动作的概率
梯度方向 = "往产生高奖励的动作方向调整策略"
REINFORCE算法:
对每条轨迹:
计算每个时间步的回报 G_t
更新: θ ← θ + α·Σ ∇log π(a_t|s_t)·G_t
问题: 高方差(每条轨迹的回报波动大)
解决方案: 引入Baseline (通常是V(s)) → Actor-Critic
|
为什么需要两个网络?
|
flowchart LR
s["状态 s"]:::state
subgraph AC["Actor-Critic"]
direction TB
actor["Actor
策略网络 输入状态 -> 输出动作概率"]:::actor critic["Critic 价值网络 评估当前状态/动作好坏"]:::critic end a["动作 a"]:::action env["环境"]:::env r["奖励 r"]:::reward ns["下一状态 s'"]:::state adv["优势信号 A 比平均更好还是更差"]:::signal s --> actor s --> critic actor --> a a --> env env --> r env --> ns s --> adv r --> adv critic --> adv adv -.指导策略更新.-> actor r -.训练价值网络.-> critic ns -.时序反馈.-> critic classDef state fill:#DDEBFF,stroke:#5B8FF9,stroke-width:1.2px,color:#222; classDef actor fill:#FFF4CC,stroke:#C9A227,stroke-width:1.2px,color:#222; classDef critic fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222; classDef action fill:#F3F4F6,stroke:#999,stroke-width:1px,color:#222; classDef env fill:#E0F2FE,stroke:#0284C7,stroke-width:1.2px,color:#222; classDef reward fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222; classDef signal fill:#FCE7F3,stroke:#9333EA,stroke-width:1.2px,color:#222; |
金融中的Actor-Critic解释:
Actor (交易策略):
状态=市场特征 → 输出=各仓位概率
"在当前市场,应该持多少仓位?"
Critic (风险度量):
状态=市场特征 → 输出=期望累计收益
"在当前市场状态,未来期望收益是多少?"
→ 用于判断Actor做出的决策是否优于基准
状态空间设计模式:
| 模式 | 示例 | 适用场景 |
|---|---|---|
| 原始价格 | [S_t, S_{t-1}, ..., S_{t-n}] | 端到端学习 |
| 技术指标 | [RSI, MACD, BB, MA] | 特征工程辅助 |
| 组合特征 | [Delta, Gamma, Vega, Theta] | 衍生品对冲 |
| 混合状态 | [价格 + 指标 + 持仓信息] | 完整交易Agent |
动作空间设计:
离散: {做多, 空仓, 做空}
{买入10%, 买入5%, 不动, 卖出5%, 卖出10%}
优点: 简单, DQN可用
缺点: 粒度粗
连续: 仓位比例 ∈ [-1, 1]
优点: 精细控制, DDPG/PPO适用
缺点: 需要更复杂的探索策略
奖励函数设计模式:
# 1. 收益驱动
reward = portfolio_return
# 2. 风险调整
reward = (portfolio_return - risk_free) / portfolio_vol # Sharpe-like
# 3. 利润+惩罚
reward = pnl - λ₁·drawdown - λ₂·turnover - λ₃·transaction_cost
# 4. 差异奖励 (Differential Reward)
reward = r_t - baseline_r_t # 超过基准才有奖励
3.7 深度强化学习Deep RL: DQN, DDPG, PPO |
|
创新1:用神经网络近似Q函数
|
创新2:经验回放 (Experience Replay)
|
创新3:目标网络 (Target Network)
|
损失函数:
金融应用:离散动作的交易策略(买入/卖出/持有)
适用于连续动作空间的决策问题(如买卖数量、仓位比例、对冲比例)
|
DDPG 的 Actor-Critic 结构:
|
flowchart LR
s["当前状态 s"]:::state
sp["下一状态 s'"]:::state
actor["Actor\nμ(s)"]:::net
critic["Critic\nQ(s,a)"]:::net
targetActor["Target Actor\nμ'(s')"]:::target
targetCritic["Target Critic\nQ'(s',a')"]:::target
a["动作 a=μ(s)"]:::var
ap["目标动作 a'=μ'(s')"]:::var
q["当前价值 Q(s,a)"]:::var
qp["目标价值 Q'(s',a')"]:::var
y["TD目标\ny = r + γ Q'(s',a')"]:::result
s --> actor
actor --> a
s --> critic
a --> critic
critic --> q
sp --> targetActor
targetActor --> ap
sp --> targetCritic
ap --> targetCritic
targetCritic --> qp
qp --> y
classDef state fill:#DDEBFF,stroke:#5B8FF9,stroke-width:1.2px,color:#222;
classDef net fill:#FFF4CC,stroke:#C9A227,stroke-width:1.2px,color:#222;
classDef target fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222;
classDef var fill:#F3F4F6,stroke:#999,stroke-width:1px,color:#222;
classDef result fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222;
|
核心思想: Actor 负责输出动作,Critic 负责评估动作好坏,并利用目标网络提升训练稳定性。
金融应用:
当前最常用的 DRL 算法之一(通过限制策略更新幅度提升训练稳定性)
|
PPO 的核心思想:
|
裁剪的替代目标(Clipped Surrogate Objective): |
核心思想: PPO 通过裁剪目标函数限制策略更新幅度,在保证学习效率的同时提升训练稳定性。
优点:
PPO vs DDPG vs DQN:
| 特性 | DQN | DDPG | PPO |
|---|---|---|---|
| 动作空间 | 离散 | 连续 | 两者均可 |
| 训练稳定性 | 中等 | 不稳定 | 最稳定 |
| 样本效率 | 中等 | 高 | 低 |
| 实现复杂度 | 简单 | 中等 | 中等 |
金融推荐:大多数金融应用首选PPO(稳定性是金融的第一要求)
|
应用1:最优执行 (Optimal Execution)
|
应用2:期权动态对冲
|
|
应用3:做市商策略
|
应用4:投资组合管理 (Robo-Advisor)
|
|
为什么需要混合? DRL在金融中的局限性:
|
LLM+DRL架构:
flowchart TB
txt["新闻 / 财报 / 宏观文本"]:::text
mkt["市场数据"]:::state
llm["LLM\n文本理解 / 事件提取"]:::llm
fusion["状态增强\n市场特征 + 语义特征"]:::fusion
drl["DRL Agent\nPPO / DDPG"]:::agent
act["交易动作\n买 / 卖 / 持有 / 仓位调整"]:::action
env["市场环境"]:::state
rew["奖励"]:::result
exp["动作解释\n为什么买卖?"]:::explain
txt --> llm
llm --> fusion
mkt --> fusion
fusion --> drl
drl --> act
act --> env
env --> rew
rew --> drl
llm -.辅助解释.-> exp
drl -.决策依据.-> exp
classDef text fill:#F3E8FF,stroke:#8B5CF6,stroke-width:1.2px,color:#222;
classDef llm fill:#EDE9FE,stroke:#7C3AED,stroke-width:1.2px,color:#222;
classDef fusion fill:#FEF3C7,stroke:#D97706,stroke-width:1.2px,color:#222;
classDef agent fill:#DBEAFE,stroke:#2563EB,stroke-width:1.2px,color:#222;
classDef action fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222;
classDef state fill:#F3F4F6,stroke:#9CA3AF,stroke-width:1px,color:#222;
classDef result fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222;
classDef explain fill:#FFF7ED,stroke:#EA580C,stroke-width:1.2px,color:#222;
|
PPO训练中的常见问题与解决:
|
|
DRL金融应用注意事项:
|
flowchart TB
market["金融市场环境
价格 / 成交量 / 波动率 / 宏观信息"]:::state obs["全局状态 / 共享信息"]:::var subgraph agents["多Agent分工"] direction LR a1["Agent 1 股票策略"]:::net a2["Agent 2 期货策略"]:::net a3["Agent 3 期权策略"]:::net end act1["买入 / 卖出 / 持有"]:::var act2["做多 / 做空"]:::var act3["对冲 / 投机"]:::var portfolio["组合层 聚合各Agent动作"]:::target reward["共享奖励 组合PnL / 风险调整收益"]:::result market --> obs obs --> a1 obs --> a2 obs --> a3 a1 --> act1 a2 --> act2 a3 --> act3 act1 --> portfolio act2 --> portfolio act3 --> portfolio portfolio --> reward reward -. 反馈 .-> a1 reward -. 反馈 .-> a2 reward -. 反馈 .-> a3 classDef state fill:#DDEBFF,stroke:#5B8FF9,stroke-width:1.2px,color:#222; classDef net fill:#FFF4CC,stroke:#C9A227,stroke-width:1.2px,color:#222; classDef target fill:#FCE7F3,stroke:#DB2777,stroke-width:1.2px,color:#222; classDef var fill:#F3F4F6,stroke:#999,stroke-width:1px,color:#222; classDef result fill:#DCFCE7,stroke:#16A34A,stroke-width:1.2px,color:#222; |
MARL vs 单Agent:
|
模式1:LLM作为状态编码器
原始文本 → LLM → 语义嵌入 → 拼接数值状态 → DRL策略网络
模式2:LLM作为奖励信号
DRL动作 + 市场结果 → LLM评估 → 自然语言奖励 → 转化为数值奖励
模式3:LLM作为策略先验
LLM分析市场 → 生成粗粒度建议 → DRL精炼为具体动作
前沿研究 (2025-2026):
应用1:期权定价 (RL Pricing)
状态: [S_t, τ, σ_imp, moneyness]
动作: 期权价格调整 ΔP
奖励: -|RL价格 - MC价格|² (学习接近真实价格)
优势: 对奇异期权无需解析公式,直接从MC模拟中学习
局限: 不如MC精确,但推理速度快100倍+
应用2:动态资产配置
状态: [经济指标, 市场状态, 当前配置, 剩余期限]
动作: 仓位调整 (股/债/商品/现金)
奖励: 风险调整收益 - 交易成本
关键: 需处理非平稳性(市场状态在变化)
应用3:算法交易执行
问题: 如何在T时间内最优执行V股交易?
状态: [剩余时间, 剩余股数, 当前价格, 市场深度]
动作: 此刻卖出多少股
奖励: -Implementation Shortfall (执行价 vs 决策价)
经典方法: Almgren-Chriss → RL可直接学习更复杂的市场反应
四种融合模式:
| 模式 | 描述 | 金融示例 |
|---|---|---|
| LLM→DL | LLM输出作为DL输入特征 | LLM情感分数 → LSTM预测 |
| DL→LLM | DL输出作为LLM上下文 | CNN提取K线特征 → LLM生成分析报告 |
| Co-Training | LLM和DL同时训练,共享表示 | 联合文本+价格嵌入空间 |
| LLM as Controller | LLM决策调用哪些DL模型 | Agent选择LSTM/CNN/XGBoost |
LLM作为数据增强器:
# LLM生成训练数据的伪代码
def augment_training_data(financial_texts, labels):
augmented = []
for text, label in zip(financial_texts, labels):
# LLM改写原文 → 保持语义但改变措辞
variants = llm.generate_variants(
text,
prompt="用不同的金融术语改写,保持含义不变"
)
augmented.extend([(v, label) for v in variants])
return augmented
LLM作为RL的奖励模型:
3.8 实践环节课堂实践项目(5选1) |
|
可选数据源:
|
统一要求:
|
建议最低提交内容:
|
|
数据:Kaggle 信用评分竞赛数据 任务:
建议模型:
推荐特征处理:
|
建议输出:
最低完成标准:
可讨论问题:
|
|
数据:DigQuant A股 tick 数据 任务:
建议输入特征:
建议模型:
|
建议简化:
建议输出:
最低完成标准:
|
|
数据(任选其一):
任务方向(任选一个):
建议模型:
|
建议输出:
最低完成标准:
可讨论问题:
|
|
数据:DigQuant 盘口 / 订单簿数据 任务:
建议输入形式:
建议模型:
|
为什么这个项目有意思?
最低完成标准:
建议指标:
|
|
数据:DigQuant tick 数据 任务:
建议状态:
建议动作:
|
建议算法:
baseline:
最低完成标准:
建议指标:
|
建议让 AI 帮你做:
但你必须自己检查:
推荐汇报结构:
1. 我的问题是什么?
2. 我的数据与标签如何定义?
3. baseline 和主模型分别是什么?
4. 结果如何?
5. 这个结果在金融上意味着什么?
|
核心收获
预习准备
|
下周预告
|
经典教材
论文
DRL金融应用