(Re-)Imag(in)ing Price Trends

CNN图像识别与股票价格趋势预测

Jiang, Kelly & Xiu (2023) — The Journal of Finance

课程目标与结构

本课程你将学到:

  1. 研究逻辑还原 — 理解作者从问题到方法的完整思维链
  2. 图像分析方法 — 掌握将时间序列转化为图像的核心技术
  3. CNN金融应用 — 理解卷积神经网络如何发现新的价格模式
  4. 复现能力 — 掌握完整的工作流程,能独立复现论文

课程结构(45分钟)

部分 主题
1-2 问题框架与方法论设计
3-4 CNN架构与实证结果
5-7 可解释性、迁移学习与复现指南
8 总结与讨论

Part 1

引入:技术分析的悖论

技术分析的矛盾地位

学术界的传统观点

  • EMH(有效市场假说):价格已经反映所有信息
  • 技术分析不应该"有用"

但现实是...

  • 87% 的基金经理使用技术分析(Menkhoff 2010 调查)
  • 18% 将其作为投资决策的主要部分
  • 动量效应(Momentum)是学术界公认最可靠的技术模式

核心问题

既然技术分析如此广泛使用,我们能否找到比传统动量/反向更好的价格趋势信号?

作者的三层递进问题

第1层:能否超越预定义模式?

  • 传统金融:研究者预先假设动量、反向等特定模式
  • 本文创新:让机器自动学习市场中真实存在的价格模式
  • 不再问"动量是否有用",而是问"什么模式最有用"

第2层:为什么用图像表示?

  • 技术分析本质上就是视觉模式识别
  • 交易者看K线图、移动平均线——这些是非结构化的视觉信息
  • 能否系统地让算法提取这些视觉模式中的信息?

第3层:发现的模式能否推广?

  • 时间尺度迁移:5日图表 → 60日预测
  • 地理迁移:美国市场 → 国际市场
  • 这是论文最具创新性的发现之一

研究设计的核心洞察

两个关键决策的协同效应

决策1: 将价格数据表示为图像
            +
决策2: 使用CNN建模
            ↓
    自动发现新的价格模式

为什么这两个选择互相增强?

  • CNN天然为图像分析设计 → 图像格式让CNN发挥最大能力
  • 图像保持视觉结构 → CNN能捕捉空间关系(非时间序列能比)
  • 不需要手工设计特征 → CNN自动学习最优的特征表示

关键信息

本文的核心创新不在于"用CNN预测股价",
而在于图像表示 + CNN 的组合揭示了传统方法无法发现的模式。

Part 2

方法论设计与选择逻辑

为什么选择CNN而非其他方法?

方法选择的三角权衡

需求 说明
灵活性 能捕捉复杂的价格模式
可解释性 能理解模型发现了什么
可行性 参数不能太多,计算可控

CNN vs 其他方案

方法 灵活性 可解释性 可行性
Logistic回归
1D CNN (时间序列)
2D CNN (图像)
全连接网络

关键:CNN的参数共享大幅减少参数量

  • 全连接网络:数十亿参数 → 不可行
  • CNN (I20模型):仅 708K 参数 → 完全可行

为什么用图像而非时间序列?

1D CNN vs 2D CNN 的本质区别

1D CNN (时间序列):

输入: [时间步] × [变量数]
卷积核: [K时间步] × [所有变量] ← 固定宽度,只在时间维度滑动

2D CNN (图像):

输入: [高度像素] × [宽度像素]
卷积核: [K高] × [K宽] ← 在两个维度灵活移动

1D CNN的根本局限

考虑价格序列: 第1-2天平,第3天涨1,第4天涨2

  • 1D卷积核只能提取线性差分
  • 无法区分"涨1"和"涨2"的不同预测价值(除非依赖非线性激活)
  • 2D卷积核:可以将"无变化"、"小涨"、"大涨"作为不同特征处理

图像表示的四大优势

1. 空间相关性捕捉

传统: [r₁, r₂, r₃, r₄, r₅]  ← 一维向量
图像: OHLC柱 + 移动平均线 + 成交量条的视觉排列
→ 关键:多个信息源的"相对空间位置"被同时感知

2. 多层次时间信息在单一图像中编码

  • 日内波动(高-低范围)→ 垂直方向
  • 趋势方向(开-收)→ OHLC柱形状
  • 长期趋势(移动平均)→ 跨越图像的线条

3. 缩放不变性

  • 所有股票:最高价→图像顶部,最低价→底部
  • 不同价位的股票可使用同一模型

4. 非线性信息的自然编码

  • 波动率 = 垂直范围(Parkinson 1980)
  • 传统方法需要GARCH等模型;图像自然包含此信息

从数据到图像:OHLC图像构造

构造过程(学生应能复现)

步骤1: 用CRSP调整后的收益率重建价格序列
       p_{t+1} = (1 + RET_{t+1}) × p_t
       第一天收盘价标准化为1

步骤2: 价格归一化到 [0,1]
       normalized = (price - min) / (max - min)
       ← 这是核心设计!使所有股票在同一尺度

步骤3: 绘制图像
       - OHLC柱(黑色,每天3像素宽)
       - 移动平均线(连接的点)
       - 成交量条(底部1/5区域)

步骤4: 输出稀疏矩阵 (黑=0, 白=255)

图像尺寸规格

类型 宽度 高度 日均像素
5日图 15px 32px 3px/天
20日图 60px 64px 3px/天
60日图 180px 96px 3px/天

图像设计的关键选择

四种图像变体 (Appendix Figure IA.2)

配置 移动平均线 成交量条 性能
A 基础
B 短期好,长期差
C 混合
D (基准) 综合最优

其他设计选择

选择 选项 论文选择 原因
颜色 RGB涨跌色 黑白 去除冗余,降维
缺失数据 删除 留白 保留完整历史
收益率 原始价格 调整后收益率 去除拆股/分红影响
移动平均窗口 固定 =图表天数 自适应、信息完整

关键发现:图像表示比CNN更重要!

Appendix Table IA.IX / 论文 Table IX 的启示

方法 等权 Sharpe
2D CNN + 图像表示 2.16
Logistic + 图像缩放 2.00 ← 接近CNN!
1D CNN + 累积收益 0.40
Logistic + 标准时序 0.40

这意味着什么?

  • 图像表示贡献了约90%的性能提升
  • CNN的额外贡献仅约10%
  • 即使用简单逻辑回归,如果用图像表示也能达到接近CNN的效果

启示

复现论文时,正确的数据表示比模型选择更重要!
这是整个研究设计中最重要的实证发现之一。

Part 3

CNN架构详解

CNN的核心构建块

卷积 (Convolution) — 类比时间序列平滑

时间序列平滑:               CNN卷积:
取3个相邻点                 取3×3像素区域
[x_{t-1}, x_t, x_{t+1}]    ┌─┬─┬─┐
计算加权平均                │?│?│?│
滑动一步,重复              ├─┼─┼─┤  × 可学习权重矩阵
                           │?│?│?│
                           └─┴─┴─┘
权重是手工指定的                  在整个图像上2D滑动
                                权重通过训练学到!

关键组件

组件 作用 论文选择
卷积 提取局部特征 5×3 卷积核
激活函数 引入非线性 Leaky ReLU (α=0.01)
池化 降维+平移不变性 Max-pooling (2×1)
Batch Norm 稳定训练 每层使用
Dropout 防止过拟合 p=0.5 (仅FC层)

CNN信息流的逐层理解

深度学习的"深度"意味着什么?

第1层:捕捉原始特征
  • 局部价格上升/下降
  • K线的粗糙形状
  • 成交量峰值

     ↓

第2层:组合第1层特征
  • 连续上升的K线序列
  • 成交量与价格的共现模式

     ↓

第3层:学习完整模式
  • "头肩顶"形状?
  • "突破"形状?
  • 但这是自动学的,不是预定义的!

     ↓
最后:Softmax → P(上涨) 概率

三种模型配置

模型架构随图像大小自动调整

5日模型 (I5):              20日模型 (I20):           60日模型 (I60):
输入: 15×32                输入: 60×64               输入: 180×96
  ↓                          ↓                         ↓
Conv×2层                   Conv×3层                  Conv×4层
(64→128 filters)           (64→128→256)              (64→128→256→512)
  ↓                          ↓                         ↓
展平 + FC + Softmax        展平 + FC + Softmax       展平 + FC + Softmax

参数量: 155K               参数量: 708K              参数量: 2.95M

训练关键参数

参数 说明
优化器 Adam lr=1×10⁻⁵
批大小 128
损失函数 Cross-Entropy 二分类: up/down
权重初始化 Xavier 加速收敛
停止准则 Early Stopping 验证集损失2轮无改进

训练策略与数据分割

关键:时间序列不能随机分割!

训练阶段 (1993-2000):
├─ 训练集: 70% 股票 (随机选取)
├─ 验证集: 30% 股票 (随机选取)
└─ 约50% "涨" / 50% "跌" 标签

测试阶段 (2001-2019):
└─ 全部股票 — 完全未见过的数据!

重要设计细节

  1. 不递归重训 — 受计算资源限制

    • 训练一次,模型在19年测试期保持固定
    • 论文认为递归重训可能进一步提升效果
  2. 5次独立训练取平均 — CNN优化是随机的

    • 每个模型配置独立训练5次
    • 取5次预测的平均值
  3. 面板模型 — 所有股票用同一个模型

    • 不是每个股票单独建模
    • 学到的模式是市场通用的

为什么这些正则化选择重要?

学生复现时必须理解的"为什么"

手段 为什么要做? 不做的后果
Batch Normalization 稳定每层输入分布 收敛慢,不稳定
Dropout (0.5) 随机关闭50%神经元 过拟合训练数据
Xavier初始化 使梯度在早期稳定 梯度消失/爆炸
Early Stopping 在验证集不改进时停止 过拟合
Leaky ReLU 避免神经元完全死亡 梯度流动受阻

附录Table IA.XI的敏感性分析告诉我们

改变 Sharpe变化
层数 3→2 显著下降
卷积核数 64→32或128 基本不变
Dropout 0.5→0.75 下降
激活 LeakyReLU→ReLU 显著下降
池化 (2,1)→(2,2) 显著下降

结论:结果对合理超参数变化鲁棒,但关键选择(层数、激活函数)很重要

Part 4

实证结果与经济意义

核心发现1:惊人的短期预测能力

Table I — 等权组合 Sharpe Ratio (5日持有期)

策略 Sharpe 对比
I5/R5 (CNN 5日图) 7.15 ← 最佳
I20/R5 6.75
I60/R5 4.89
TREND 2.92 传统最优
WSTR 2.84 传统最优
STR 1.76
MOM 0.07 动量在周频失效

市值加权组合

策略 Sharpe
I5/R5 1.49
I20/R5 1.74
WSTR 0.77
MOM 0.33

CNN在等权和市值权下都显著优于传统方法

不同持有期的表现

Table II — 月度与季度策略 Sharpe Ratio

模型 5日持有 20日持有 60日持有
I5 7.15 2.35 1.30
I20 6.75 2.16 0.37
I60 4.89 1.29 0.75
MOM 0.07 0.25 0.06
WSTR 2.84 1.23 0.65
TREND 2.92 1.39 0.38

关键观察

  1. 短期最强:5日图预测5日收益最强 (Sharpe=7.15)
  2. 所有持有期CNN都赢:即使在季度频率,CNN仍显著优于传统方法
  3. 月度策略可行:月度周转率~175%,与WSTR相当,但收益翻倍

收益的时间分解

Table III — 月度策略收益分解 (I20/R20)

时间段 I5 I20 I60 MOM WSTR
Day 1-5 SR=3.58 SR=2.50 SR=1.07 SR=-0.28 SR=2.11
Day 6-20 SR=0.42 SR=1.21 SR=0.83 SR=0.35 SR=0.33

解读

  • 大部分收益集中在第1周 — 这是价格模式最强的时候
  • 但第2-3周仍然显著 — I20模型在Day 6-20的Sharpe达1.2
  • 这说明CNN捕捉到了持续数周的价格模式,不仅仅是短期噪音

经济可行性

持有期 月周转率 交易成本调整后 Sharpe
5日 ~690% 4.03 (适合做市商/HFT)
20日 ~175% 1.47 (适合机构投资者)
60日 ~59% 0.91 (适合长期投资者)

核心发现2:CNN发现了全新的信号

CNN预测与传统信号的相关性

CNN模型 与MOM相关性 与WSTR相关性 与TREND相关性
I5/R5 ≈0% -26% -34%
I20/R20 ≈0% ≈0% ≈0%
I60/R60 21% ≈0% ≈0%

这意味着什么?

  • CNN捕捉到的 动量或反向
  • 传统特征只能解释CNN预测变异的 约10%
  • 90%是全新的信息!

因子回归 (Table IA.I) 进一步确认

  • 控制Mkt, MOM, STR, WSTR, TREND后
  • CNN策略的 alpha仍然高度显著
  • R²仅18-28%,说明传统因子无法解释CNN策略

CNN学到了什么?—— Logistic近似

Table VIII — 用简单变量近似CNN预测

最重要的变量(按重要性排序):

  1. 前一天收盘价在高-低范围中的百分位数
  2. 前一天最高价的位置
  3. 前一天最低价的位置
  4. 前一天移动平均线的位置
  5. 前一天成交量

一个可解释的模式

"当收盘价在最近高-低范围的底部时,未来收益倾向于较高"

为什么这比动量更微妙?

  • 动量只看"过去涨了还是跌了"
  • CNN关注的是"价格在最近波动范围中的相对位置"
  • 这是一个非线性的、多维度的模式
  • 传统方法几乎不可能手工设计出这样的特征

交易成本与实际可行性

大盘股分析 (Table IV) — 仅用最大的500只股票

策略 等权 Sharpe 市值权 Sharpe
I5/R5 1.02 1.29
I20/R5 0.78 0.96
I60/R5 1.08 1.03
MOM 0.19 0.23
WSTR -0.30 -0.19

交易成本调整后 (Appendix Table IA.IV)

持有期 净 Sharpe 适用投资者
5日 4.03 做市商、高频交易
20日 1.47 机构投资者
60日 0.91 长期投资者

即使在最保守的设定下(大盘股+交易成本),CNN策略仍然盈利

Part 5

可解释性与模型诊断

CNN真的在识别有意义的模式吗?

Monte Carlo模拟验证 (Appendix Section IV.A)

实验设计:

  1. 生成 10,000 个虚假图表(纯随机游走)
  2. 让CNN判断:"这张图预示上涨吗?"
  3. 同时测试23种经典技术分析模式

结果:

图表类型 CNN预测"涨"的概率
随机游走图表 48.6% ≈ 50% ✓
真实"头肩顶"模式 56.3% 显著偏离50%

结论

  • CNN不是随机猜测 — 对随机图表给出≈50%概率
  • CNN能识别真实的技术模式 — 对已知模式给出偏离50%的预测
  • CNN能区分噪声和真实信号

经典技术模式的重新审视

23个技术分析模式的检验 (Appendix Section III)

发现:

  • 13/23 个模式确实与CNN预测相关
  • 但其中8个方向与传统智慧相反!

具体例子

模式 传统观点 CNN判断
杯柄模式 看涨信号 概率 < 50% (看跌!)
头肩顶 看跌信号 CNN识别为看涨

如何理解这个矛盾?

经典模式可能已经被市场充分定价了
CNN学到的是未被定价的模式 — 这才是真正能盈利的信息

模型鲁棒性总结

Appendix 敏感性分析的关键结论

数据表示敏感性 (Table IA.X):

  • 去掉成交量条 → 20日和60日图显著下降
  • 去掉移动平均线 → 混合结果
  • 过滤训练数据 → 一般无益
  • 限制训练股票数 → 无益

模型结构敏感性 (Table IA.XI):

  • 最关键:层数激活函数
  • 次重要:池化大小滤波器尺寸
  • 不太敏感:滤波器数量、Dropout概率、BN、Xavier

图像表示敏感性 (Table IA.XII):

  • 像素表示(更稀疏):Sharpe=6.40,仍然显著
  • 居中像素表示:Sharpe=5.24
  • 表示方式有影响,但所有变体都显著盈利

总体结论:结果对合理的变化鲁棒

Part 6

迁移学习与模式的普遍性

时间尺度迁移:高频 → 低频

核心问题:5日学到的模式能否预测60日收益?

实验设计 (Appendix Section IV.B):

  1. 用5日数据训练I5/R5模型(120K个图表!)
  2. 直接用在20日问题上(不重训)
  3. 用在从60日数据中采样的伪5日图表上

结果:

方法 20日 Sharpe 60日 Sharpe
基准(直接训练) 2.16 0.4-0.75
5日模型迁移 2.10 0.9-1.0
差异 42%相关 ← 不同信号! 迁移优于基准!

为什么这可能成立?

Mandelbrot 分形市场假说:

  • 股票价格在不同时间尺度上有自相似性
  • log(价格)的路径满足分形特性
  • 5日的上涨/下跌模式在60日中也有反映
  • CNN学到的几何特征(形状)可能是 scale-free 的

地理迁移:美国 → 26个国际市场

Table IA.VI — 国际迁移 Sharpe Ratio (I20/R20, 等权)

国家 股票数 本地重训 直接迁移 迁移-重训
美国 7,298 2.16
澳大利亚 886 1.97 2.20 +0.22
法国 955 -0.36 0.81 +1.17*
韩国 911 0.89 0.59 -0.30
新加坡 284 0.36 2.20 +1.83*
中国 662 0.82 0.06 -0.77
平均 661 0.30 0.70 +0.40

关键发现

直接迁移平均好于本地重训!

为什么直接迁移有时更好?

三个机制

1. 样本量陷阱

美国数据: 7,298只 × 19年 × 252天 = 巨大样本
小市场: 几百只 × 较短历史 = 数据稀疏
→ 本地重训可能过拟合,迁移反而避免了这个问题

2. 模式通用性

CNN从美国学到的模式可能是市场通用的
例如:"收盘价在最近范围内的位置"这个概念
在任何市场都适用

3. 统计功率

大样本学到的权重更稳定
小样本重训虽然本地化,但不稳定

实际建议

  1. 国内市场数据不足?直接迁移可能更好
  2. 但需要验证:市场结构相似性(流动性、交易机制)
  3. 不能盲目迁移,必须做样本外测试

Part 7

复现指南

从论文到代码:7步路线图

第1步: 数据准备
  ├─ 数据源: CRSP (美国) 或国内数据库
  ├─ 需要: Date, Open, High, Low, Close, Volume
  └─ 时间: 1993-2000(训练), 2001-2019(测试)

第2步: 图像生成 [最核心!]
  ├─ create_ohlc_image(prices, lookback=5/20/60)
  ├─ 价格归一化: (price-min)/(max-min)
  └─ 输出: (height×width) 黑白稀疏矩阵

第3步: CNN模型构建 (PyTorch)
  ├─ Conv2d → BatchNorm → LeakyReLU → MaxPool
  ├─ 2/3/4层, filters: 64→128→256→512
  └─ FC → Softmax → P(上涨)

第4步: 训练设置
  ├─ Adam (lr=1e-5), batch=128
  ├─ Dropout=0.5, L2=1e-6
  └─ Early Stopping (验证集2轮无改进)

复现路线图(续)

第5步: 样本外评估
  ├─ 分类: Accuracy, AUC-ROC, McFadden R²
  └─ 投资组合: 按P(up)排序→10分位→H-L策略→Sharpe

第6步: 投资组合构建
  ├─ 等权(EW) vs 市值权(VW)
  ├─ 持有期: 5/20/60天
  └─ 交易成本: 10bp(大股票), 20bp(小股票)

第7步: 稳健性分析
  ├─ 改变层数、滤波器、激活函数
  ├─ 改变图像表示方式
  └─ 样本外验证核心原则: 不能在测试集调参!

关键提醒

用概率排序做信号,不要用二分类!
这是最常见的错误之一。

五个常见错误

错误1: 前向偏差 (Look-ahead Bias)

## ❌ 直接用未来数据训练
## ✓ 严格按时间顺序,测试期完全不参与训练

错误2: 数据泄漏 (Data Leakage)

## ❌ 在训练前用全部数据标准化
## ✓ 只用训练集的统计量来标准化

错误3: 图像表示错误

## ❌ 用原始价格水平(不同股票不可比)
## ✓ 相对于各自范围的标准化 [0,1]

错误4: 用测试集调参

## ❌ 监控测试集性能来停止训练
## ✓ 只用验证集(1993-2000的30%)决定何时停止

错误5: Sharpe比率计算

## ❌ 忘了年化
## ✓ 年化: daily_sharpe × √252

复现的技术栈建议

推荐工具链

步骤 工具 说明
数据获取 CRSP / Tushare / AKShare OHLCV数据
图像生成 Matplotlib / PIL 绘制OHLC图
模型构建 PyTorch Conv2d, BatchNorm2d
训练监控 TensorBoard / W&B 损失曲线
投资组合 Pandas / NumPy 回测计算
AI辅助 Claude Code / ChatGPT 代码生成与调试

利用AI Agent复现的建议

  1. 先写清楚需求 — 把论文方法描述作为prompt给LLM
  2. 分步验证 — 每一步都检查输出是否正确
  3. 图像生成先可视化 — 确保生成的图像是对的
  4. 从5日模型开始 — 参数最少,训练最快
  5. 与论文结果对比 — Sharpe ratio应在同一量级

Part 8

总结与反思

三层收获

第1层:方法论创新

  • 为什么CNN优于传统ML?
    → 自动特征提取,无需手工设计信号
  • 为什么图像表示优于时间序列?
    → 捕捉空间相关性(OHLC间的几何关系)
  • 为什么在金融中有效?
    → 技术分析的本质就是视觉模式识别

第2层:实证贡献

  • 发现的模式与传统信号独立(相关性<35%)
  • Sharpe比率 7.15(5日),显著超过传统方法
  • 直接迁移到国际市场时表现更好 → 模式具有普遍性

第3层:实现能力

  • 能独立复现完整工作流(数据→模型→策略)
  • 理解每个设计选择的权衡
  • 能诊断自己实现中的问题

未来研究方向

五个值得探索的方向

1. 多任务学习

  • 当前:单个模型预测单一持有期
  • 改进:同时预测5/20/60日收益,共享底层表示

2. 多模态融合

  • 当前:只用价格图表
  • 改进:融合新闻标题图像、财报数据

3. 可解释性增强

  • 当前:logistic近似只能部分解释
  • 改进:Grad-CAM可视化,显示图中哪些区域驱动预测

4. 实时交易系统

  • 在线学习 + 流数据处理 + 强化学习

5. 跨市场套利

  • 利用国际迁移特性设计套利策略

推荐阅读

复现论文所需的背景

CNN基础

  • Goodfellow, Bengio & Courville (2016), Ch.9
  • Gu, Kelly & Xiu (2020), "Empirical Asset Pricing via Machine Learning"

迁移学习

  • Pan & Yang (2009), Transfer Learning Survey

金融技术分析

  • Lo, Mamaysky & Wang (2000), Foundations of Technical Analysis
  • Jegadeesh & Titman (1993), Momentum effect

正则化

  • Srivastava et al. (2014), Dropout
  • Ioffe & Szegedy (2015), Batch Normalization

| 部分 | 主题 | 时间 | |------|------|------| | 1-2 | 问题框架与方法论设计 | 16 min | | 3-4 | CNN架构与实证结果 | 16 min | | 5-7 | 可解释性、迁移学习与复现指南 | 12 min | | 8 | 总结与讨论 | 1 min |

## 讨论 ---

## 附录:关键数据速查 #### 核心结果汇总 | 指标 | 5日 | 20日 | 60日 | |------|-----|------|------| | EW Sharpe (gross) | **7.15** | 2.16 | 0.75 | | VW Sharpe (gross) | 1.49 | 0.49 | 0.23 | | EW Sharpe (net, cost adjusted) | **4.03** | 1.47 | 0.91 | | 月周转率 | 690% | 173% | 59% | | 与MOM相关性 | ≈0% | ≈0% | 21% | | 模型参数量 | 155K | 708K | 2.95M | #### 论文关键表格索引 | 表格 | 内容 | |------|------| | Table I | 短期(5日)组合表现 | | Table II | 月度/季度策略表现 | | Table III | 收益时间分解 | | Table IX | 图像 vs 时间序列表示对比 | | Table XI | 迁移学习(时间尺度) | | Table IA.VI | 迁移学习(国际市场) | | Table IA.XI | 模型敏感性分析 | ---

--- <!-- _class: lead

## Thank You!