文本分析与金融

Bybee et al. (2024) "Business News and Business Cycles"
Chen, Kelly, Xiu (2023) "Expected Returns and Large Language Models"

课程导航

模块 内容
问题导入:为什么文本?
BNBC核心:LDA主题模型
BNBC应用:VAR与市场择时
LLM论文:从BoW到预训练模型
复现路线与讨论

第一部分:问题导入

为什么要关注文本数据?

传统宏观指标的瓶颈

数据滞后问题

  • GDP数据发布延迟约3周(BEA)
  • 就业数据也有1-2周延迟
  • 市场参与者的认知和预期往往先于数据反应

文本作为"经济体温计"

新闻媒体是信息中介,持续地将经济事件的认知转化为语言描述
—— Bybee et al. (2024)

  • 新闻 = 经济事件 + 市场解读 + 集体预期
  • 80万篇WSJ文章(1984–2017)= 浓缩的经济历史叙事
  • 新闻先行于经济数据

研究问题的三层递进

层次 问题 对应论文
描述 新闻能否定量反映经济状态? BNBC: 主题注意度 vs 宏观数据
预测 新闻能否预测宏观走势和股票收益? BNBC: VAR + 市场择时 / LLM: 截面收益
理解 改进的源头在哪?"更好的表示"还是"更好的方法"? 两篇论文的对比

文本分析的技术谱系

词典法 → Bag-of-Words → LDA主题模型 → 预训练LLM (BERT/RoBERTa/OPT)
  ↓           ↓              ↓                    ↓
可解释     高维稀疏      降维+可解释         上下文感知+高效
信息少     丢失词序      无监督+流式          黑箱但信息丰富

第二部分:BNBC核心方法论

LDA主题模型

从文本到数字:数据预处理

WSJ语料库构建(附录IA.A详细步骤)

原始WSJ文章 (Dow Jones Historical News Archive)
  ↓ ① 时间窗口:1984年1月 – 2017年6月
  ↓ ② 非字母字符→空格,转小写
  ↓ ③ 白空格分词,排除单字母词
  ↓ ④ 仅保留A、B、C版面(核心版面)
  ↓ ⑤ 排除周末文章
  ↓ ⑥ 排除非经济内容(体育、休闲等)
  ↓ ⑦ 排除特定标题模式(数据表、常规专栏)
  ↓ ⑧ 合并相同accession号的连载文章
  ↓ ⑨ 排除少于100词的文章
  ↓ ⑩ 去除停用词和URL相关词
  ↓ ⑪ 轻量词形还原(sses→ss, ies→y, 去ly/ed/ing)
  ↓ ⑫ 从uni-gram生成bi-gram
  ↓ ⑬ 排除出现频率<0.1%的词
  ↓ ⑭ 构建文档-词频矩阵(DTM)
最终:763,887 篇 × 18,432 个词

LDA的数学直觉

生成模型视角

一篇文章如何"被写出来"?

两步过程(每生成一个词):

  1. 选主题:从 (文章的主题分布)中抽取一个主题
  2. 选词:从 (该主题的词分布)中抽取一个词

关键参数

参数 含义 维度
文章对K个主题的注意力分配 K维概率向量
每个主题的词概率分布 K × V 矩阵

维度压缩:18,432 个词 → 180 个主题

为什么选LDA而不是其他方法?

方法 优势 局限 BNBC选择
情感词典 可解释 信息量低、词义歧义
Bag-of-Words 实现简单 18K维、丢失词序 作为LDA输入
LDA 降维(18K→180)、无监督、可解释 计算成本高 ✓ 核心选择
有监督ML 预测能力强 需标注、难解释 ✗(后续LLM论文)

BNBC的选择逻辑

  1. 需要可解释的主题 → 胜过黑箱神经网络
  2. 需要实时性 → oLDA支持流式处理
  3. 需要无监督 → 避免人工标注的主观性和成本

估计方法:Gibbs采样

直觉解释(附录IA.B)

核心思想:模拟"写文章"的过程,反复迭代直到收敛

## Collapsed Gibbs Sampler (Xiao & Stibor, 2010)
## 超参数: α=1, β=1, 迭代次数: 300

for iteration in range(300):
    for each article t:
        for each word i in article t:
            ## 移除当前词的主题分配
            ## 重新计算 P(z_i = k | 其他所有词的主题)
            ## 按概率重新分配主题

估计结果

  • 主题 :180 × 18,432 的主题-词矩阵
  • 注意力 :763,887 × 180 的文档-主题矩阵
  • 汇总到月度 :衡量WSJ对主题k的月度新闻关注度

模型选择:为什么是180个主题?

Bayes因子 + 10折交叉验证

  • K从50到250,每10个估计一个模型
  • Bayes因子:比较后验概率,K≈170-180最优
  • 交叉验证:10折,平均对数似然最高

K值选择的经济学含义

K值 问题 示例
K=50 混合多个独立主题 "航空+破产"合并为一个主题
K=180 主题纯净、可解释 "航空"和"破产"分离
K=250 过于细化,捕捉一次性事件 收益不显著增加

手动检查也支持K=180:主题不混合,层次结构直观

180个主题:经济的多维面

主题层次结构

           ┌─── 经济增长 (Recession, Federal Reserve, ...)
           │
WSJ News ──┤─── 金融中介 (Banking, IPOs, Mortgages, ...)
           │
           │─── 行业 (Oil, Technology, Airlines, ...)
           │
           └─── 政治与文化 (Elections, International Relations, ...)

主题类型

类型 特征 示例
周期性主题 持续活跃 Federal Reserve {greenspan, yellen, fomc}
季节性主题 周期性出现 Elections {obama, romney, campaign finance}
突发性主题 由事件触发 Terrorism {taliban, suicide bomber, osama}
情感修饰词 修饰其他主题 Concerns {raise concern, major concern}

主题注意度的时序特征

六个典型主题的月度注意度

主题 关键词 时序模式
Recession unemployment, economic slowdown, bankruptcy 高持续性,2008年前后激增
Health Insurance hmo, health plan, blue cross Clinton医改 + Obamacare + 2016
Elections obama, romney, campaign finance 每4年高峰,2年小峰
Earnings Forecasts analyst poll, earn forecast 每季度激增
Terrorism taliban, osama, suicide bomber 9/11后结构性跳跃
Natural Disasters katrina, tsunami, hurricane 2005年Katrina激增

关键发现

  • 新闻注意度通常高度持续(波动聚集假说)
  • 新闻注意度与经济数据的相关性达 0.6–0.8

避免前视偏差:Online LDA

问题

标准LDA使用全样本估计 → 时刻t的主题估计包含未来信息 → 预测回归有偏

oLDA解决方案 (Hoffman, Bach, Blei 2010)

标准LDA:  θ̂_t ← 用全部数据 (1:T) 估计   → 有前视偏差
oLDA:     θ̂_t ← 仅用 1:t 的数据估计      → 无前视偏差 ✓

oLDA的关键优势

  • 批次处理:文档按时间顺序逐批输入
  • 主题连贯性:与滚动窗口不同,oLDA保持主题解释的一致性
  • 支持流式:新数据到来时更新,无需重新估计

BNBC使用gensim包的oLDA(变分推断而非Gibbs采样)
需要4年burn-in期使对数似然估计稳定

第三部分:BNBC的应用

应用一:新闻增强的宏观VAR

标准VAR vs 文本增强VAR

标准VAR (Baker, Bloom, Davis 2016):
  y_t = A₁y_{t-1} + A₂y_{t-2} + A₃y_{t-3} + ε_t
  y_t = [EPU, S&P 500, Fed Funds Rate, Employment, IP]

文本增强VAR:
  y_t = A₁y_{t-1} + B₁x_{t-1} + ε_t
  x_t = [Recession Attention]  ← 替代EPU

冲击响应结果

变量 Recession冲击 EPU冲击 (基准)
工业产出 (峰值) -1.99% (17月后) -0.98%
就业 (峰值) -0.92% (20月后) -0.34%
  • 新闻冲击效应是EPU的 2倍 (产出) 和 3倍 (就业)
  • 即使新闻排在VAR最后一位,效应仍然显著:产出-1.25%,就业-0.51%

Group-Lasso VAR选择:为什么只选Recession?

问题:180个主题不可能全进VAR

  • 自由度问题(Bernanke, Boivin, Eliasz 2005)
  • 需要模型选择 → Group-Lasso回归

方法

  • 每个变量的所有滞后项作为一个"组",整体选择或删除
  • 交叉验证选择最优λ

结果

"recession"注意度是压倒性的最强预测因子
它甚至超过EPU、VIX和消费者信心指数
交叉验证最优模型只选择了一个新闻主题:recession

叙事检索:从数字到故事

创新点

用模型指导人类阅读,而不是人类手工提炼叙事

四步流程

① VAR估计: E[GDP_{t+1} | θ_t, y_t]

② 贡献分解: 哪个主题对GDP预期变化贡献最大?
   → "recession"话题权重最大

③ 找代表性文章: argmax_i θ_{i, recession}

④ 人类精读: 理解这条新闻为何改变宏观预期

经典案例

时间 检索到的标题 经济含义
2001年4月 "Consumer Confidence Slides on Fears of Layoffs" 消费者悲观预期→需求下降
1987年11月 "Survey Finds Sharp Drop in Confidence after Stock Market Crash" 噪声冲击→短暂的预期下降
2015年9月 "Stocks Fell Further Amid Concerns Prices Don't Fully Reflect Worsening Global Growth" 异质信念传播

应用二:市场择时策略

策略构造

每月初 t:
  ① 用oLDA估计该月主题注意度 θ̂_t(无前视信息)
  ② 对去趋势的注意度用Lasso选择5个预测主题
  ③ 预测下月市场收益: r̂_{t+1} = β₀ + Σ_k β_k · θ̂_{t,k}
  ④ 按 r̂_{t+1} 调整市场仓位

实证结果 (Table VI)

策略 Sharpe比 年化收益 最大回撤
Buy-and-Hold 0.71 2.72% -47.09%
LDA (全样本) 0.99 3.79% -47.31%
oLDA (无前视) 1.04 4.01% -25.89%
R-Word指数 0.65 2.50% -46.98%
EPU 0.53 2.04% -77.66%
Welch-Goyal 15因子 0.53 2.03% -65.76%

oLDA策略在降低最大回撤方面表现优异

第四部分:LLM论文

从BoW到预训练语言模型

LLM论文的核心问题

BNBC方法的局限

BNBC的BoW → LDA 流程:
  原始文本 → 分词 → 词频向量(18K维) → LDA降维(180维)
                                         ↓
                                   可解释但有信息损失

三个根本问题

  1. BoW丢失词序:"not good" 和 "good" 的向量几乎相同
  2. 维度效率低:Step 2需要处理大量无信息的词
  3. 领域特定:LDA仅在WSJ上训练,不能迁移

LLM论文的解决方案

将Step 1(文本表示)委托给全球顶级研究团队的预训练模型
研究者只需关注Step 2(计量建模)

LLM vs BoW:直觉理解

关键区别:上下文感知

BoW方法 (BNBC):

句子: "Stock fell on negative earnings forecast"
分词: [stock, fell, on, negative, earnings, forecast]
向量: [1, 1, 1, 1, 1, 1]
问题: "negative" 修饰哪个词?无法判断

LLM方法 (BERT):

Token: [CLS] stock fell on negative earnings forecast [SEP]
       ↓
  Transformer层(12-24层自注意力)
       ↓
"earnings"的向量 编码了:
  • "negative"的上下文表示
  • "forecast"的上下文表示
  • 它们的交互作用
→ 模型知道 "negative earnings" 是负信号

否定词敏感性实验

BoW无法区分的两个句子

句子1: "Strong earnings"     → 词频: {strong:1, earnings:1}
句子2: "Not strong earnings" → 词频: {not:1, strong:1, earnings:1}
                                ↑ 增加了一个词,但"strong"信号不变

LLM如何处理

  • 句子1中 "earnings" 的向量 ≠ 句子2中 "earnings" 的向量
  • 因为 "earnings" 周围的上下文不同
  • 模型学到:not + 正面词 → 负面信号

实证发现

  • 当文章中否定词比例高时,LLM与BoW的预测差异最大
  • 结论:LLM通过捕捉文本的上下文细微之处获胜

LLM工作原理

预训练阶段(一次性投资)

输入: 数十亿个互联网文本 (Wikipedia, Common Crawl, Books)
任务: 预测被遮挡的词 (Masked Language Modeling)
      BERT: 随机遮挡15%的token,双向预测
      RoBERTa: 去掉NSP任务,更大batch,更多数据(160GB)
      OPT: 自回归下一个token预测
结果: 0.125B – 6.7B 参数的"语言理解引擎"

迁移学习(重复使用)

输入: 我们的金融新闻
方法: 冻结预训练权重,提取最后一层隐藏状态
      → 每篇文章的contextualized embedding (BERT: 1024维, OPT: 2560维)
      → 对所有token取平均 → 文章级表示
输出: 直接进入下游回归/分类

关键:不需要Fine-tuning

  • 只作为特征提取器,不更新预训练参数
  • 大大降低计算成本,便于复现

实验数据与方法

数据

数据库 描述 规模
Refinitiv RTRS 路透实时新闻 美国3百万+文章
Refinitiv 3PTY 第三方存档 3百万+文章
News Alerts 仅标题的快速新闻 3百万+条
CRSP 美国股票数据 1996-2019
Datastream-EIKON 国际股票数据 16个市场

建模框架(刻意保持简单)

情感分析: ← 逻辑回归

收益预测: ← 带Ridge惩罚的面板回归

有意使用最简模型,以凸显文本表示本身的重要性

美国市场:情感排序投资组合

等权多空策略绩效 (Table 6)

模型 EW L-S Sharpe EW Long Sharpe EW Short Sharpe
OPT (2.7B) 4.51 2.03 -0.35
RoBERTa 4.10 1.90 -0.14
BERT 3.65 1.82 0.00
Word2Vec 3.13 1.56 0.06
SESTM 3.61 1.69 -0.05
FinBERT 1.44 1.64 1.03

关键发现

  1. LLM > 传统方法: OPT和RoBERTa一致优于Word2Vec和SESTM
  2. 等权 > 市值加权: 小盘股的新闻反应更慢(EW SR=4.51 vs VW SR=1.24)
  3. 长短腿都有贡献: 但长腿的贡献更大

信息吸收速度:新闻序列分析

新闻警报 vs 文章

模型 EW 文章 EW 警报(TS1) EW 警报(TS2)
OPT 4.51 5.70 5.88
RoBERTa 4.10 5.90 5.63
BERT 3.65 4.95 4.28
Word2Vec 3.13 5.04 4.63

发现

  • 新闻警报(仅标题)> 完整文章:速度比信息完整性更重要
  • 第一序列(TS1) > 第二序列(TS2) >> 后续:信息被快速吸收
  • 到Day 3收益已基本消失:市场效率在新闻层面较强

模型规模:越大越好吗?

OPT模型规模与Sharpe比

参数量 EW Sharpe (文章) EW Sharpe (警报)
125M 4.39 5.47
350M 4.39 5.25
1.3B 4.46 5.25
2.7B 4.51 5.25
6.7B 4.45 5.25

启示

  • 收益递减:超过2.7B参数后性能反而下降
  • 短文本不需要大模型:警报的性能在各规模间基本一致
  • 最优规模约2.7B:对金融应用可能已足够

跨国验证

16个市场 × 13种语言

市场 语言 文章数 月均覆盖股票
美国 英文 3,038,025 2,593
英国 英文 571,285 454
日本 日文 310,244 645
中国(港) 中文 182,363 247
德国 德文 178,039 163
... ... ... ...

多语言BERT的迁移性

  • XLM-RoBERTa:预训练于100种语言的2.5TB数据
  • 关键优势:预训练LLM的跨语言迁移能力远超领域专用模型
  • SESTM需要为每种语言单独构建情感词典 → 不可扩展

第五部分:从论文到复现

附录的关键内容

数据处理流水线 (IA.A) — 14步

核心要点:
  ① 仅保留核心版面 (A, B, C)
  ② 轻量词形还原(非Stemming,因为Stemming过于激进)
  ③ 同时使用uni-gram和bi-gram
  ④ 频率过滤 < 0.1%
  ⑤ 最终 DTM: 763,887 × 18,432

Gibbs采样 (IA.B) — 关键参数

迭代次数: 300
超参数: α = 1, β = 1
  - α 控制文档的主题分布稀疏度
  - β 控制主题的词分布稀疏度
  - α=β=1 为均匀先验(无偏好)
估计结果不包含先验(直接用计数比例)

模型选择 (IA.C)

  • Bayes因子 + 10折交叉验证
  • t-SNE可视化验证主题间距
  • 相干性度量测试主题是否有意义

实现堆栈对比

============================================
   BNBC方法 (LDA)          LLM方法 (BERT等)
============================================
步骤1: 数据预处理            步骤1: 加载原始文本
     14步清洗流程                 无需复杂清洗
     构建18K词汇表

步骤2: LDA训练               步骤2: 调用预训练模型
     Gibbs采样(300迭代)           Hugging Face API
     耗时: 12-24小时              耗时: 分钟级

步骤3: 主题提取               步骤3: 提取embedding
     θ̂_t (180维)                 向量 (1024/2560维)

步骤4: 特征工程               步骤4: 直接进入回归
     Lasso选择相关主题             Ridge/Lasso
     Group-Lasso for VAR

最终: 可解释 + 轻量            最终: 黑箱 + 高效
     宏观分析                      微观收益预测
============================================

复现路线图

Level 1: 快速验证逻辑

## 用scikit-learn在小数据上复现LDA
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(max_features=1000)
dtm = vectorizer.fit_transform(documents)

lda = LatentDirichletAllocation(n_components=20, random_state=42)
topic_proportions = lda.fit_transform(dtm)
## 检查每个主题的top词是否可解释

Level 2: LLM特征提取

from transformers import AutoTokenizer, AutoModel
import torch

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased")

inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
with torch.no_grad():
    outputs = model(**inputs)
embedding = outputs.last_hidden_state.mean(dim=1)  ## 1024维
## 可在Google Colab免费运行

Level 3: 完整复现

BNBC复现:

  1. 获取WSJ或类似新闻语料(可替代数据:Reuters、Financial Times等)
  2. 按附录IA.A的14步流程清洗数据
  3. 用gensim训练LDA(LdaMulticore,num_topics=180)
  4. 用oLDA做样本外预测
  5. 构建VAR并用Group-Lasso选择主题

LLM复现:

  1. 获取Refinitiv或类似新闻数据(可替代数据:新闻API、爬虫)
  2. 用Hugging Face提取embedding
  3. 构建等权多空投资组合
  4. 计算Sharpe比和统计检验

使用AI Agent辅助

  • Claude Code / ChatGPT:辅助数据清洗、代码调试
  • 重点:理解每一步的为什么,而不只是"跑通代码"

两篇论文的研究逻辑总结

同一问题的两种路径

                    文本 → 经济预测
                    /              \
          BNBC (LDA)              LLM论文 (BERT等)
          /          \              /           \
    宏观层面       微观层面      情感分析      收益预测
    VAR预测       市场择时      分类问题      截面回归
    可解释         可解释       黑箱          黑箱
    无监督         无监督       有监督        有监督
    WSJ            WSJ          Reuters       Reuters
    Sharpe=1.04   Sharpe=1.04   SR=4.51(EW)   SR=3.5-4.4(EW)

互补而非对立

  • BNBC: 适合理解"为什么"(宏观叙事、因果解释)
  • LLM: 适合预测"是什么"(高频交易、截面收益)
  • 共同启示: 文本中确实蕴含可预测经济走势的信息

课程总结

三个核心学习要点

1. 文本分析的价值

  • 文本不是替代数值数据,而是补充和领先指标
  • 新闻反映的"集体认知"先于经济数据
  • 从80万篇文章中提取的180个主题能解释25%的市场波动

2. 方法论演进的逻辑

BNBC (2024) LLM论文 (2023)
表示 LDA主题 (180维) BERT embedding (1024维)
监督 无监督 有监督(股票收益标签)
解释性
适用 宏观经济 个股收益
核心贡献 可解释的经济测量 高效的预测表示

3. 可复现性的三个层级

  • Level 1: 公开工具 + 小数据 → 快速验证逻辑
  • Level 2: 附录细节 → 完整管道
  • Level 3: 现代LLM APIs → 迭代改进

讨论

讨论问题

  1. 方法选择:如果你要做一个文本分析的金融研究,你会选择LDA还是LLM?为什么?

  2. 因果性挑战:BNBC发现"recession"注意度能预测GDP,但新闻是反映还是驱动经济预期?如何区分?

  3. LLM的边际改进:OPT从125M到2.7B参数Sharpe从4.39提升到4.51——这点改进值得巨大的计算成本吗?

  4. 实时应用:如果要在实际交易中使用这些方法,你会遇到什么挑战?

  5. 新方向:多模态融合(文本+价格图表+交易量)、因果推断、动态主题模型?

参考文献

核心论文

  • Bybee, L., Kelly, B., Manela, A., & Xiu, D. (2024). Business News and Business Cycles. Journal of Finance, 79(5), 3105-3148.
  • Chen, Y., Kelly, B., & Xiu, D. (2023). Expected Returns and Large Language Models. Working Paper.

关键方法论

  • Blei, D., Ng, A., & Jordan, M. (2003). Latent Dirichlet Allocation. JMLR.
  • Hoffman, M., Bach, F., & Blei, D. (2010). Online Learning for Latent Dirichlet Allocation. NeurIPS.
  • Yuan, M., & Lin, Y. (2006). Model Selection and Estimation in Regression with Grouped Variables. JRSS-B.
  • Devlin, J. et al. (2018). BERT. NAACL.
  • Liu, Y. et al. (2019). RoBERTa. arXiv.

数据与工具

  • gensim: Python LDA实现
  • Hugging Face Transformers: 预训练LLM
  • spaCy: 多语言NLP预处理

谢谢! -->

## 从新闻到收益预测:挖掘作者的研究逻辑

*45分钟专题讲座*

| 模块 | 内容 | 时间 | |:---:|------|:---:| | **一** | 问题导入:为什么文本? | 8 min | | **二** | BNBC核心:LDA主题模型 | 12 min | | **三** | BNBC应用:VAR与市场择时 | 10 min | | **四** | LLM论文:从BoW到预训练模型 | 10 min | | **五** | 复现路线与讨论 | 5 min |

## 两个关键背景 #### 同一研究团队的延续 - **Bryan Kelly** (Yale, AQR, NBER) 和 **Dacheng Xiu** (Chicago) 同时出现在两篇论文中 - BNBC (2024): 用 **LDA** 分析宏观新闻 → 理解经济周期 - LLM论文 (2023): 用 **BERT/RoBERTa/OPT** 分析个股新闻 → 预测收益 - **研究逻辑**:先用可解释的LDA验证"文本中有信号",再用更强大的LLM提取信号 #### 三份材料的关系 - 正文:核心发现与论证 - 附录:复现所需的技术细节(数据清洗、Gibbs采样、主题评估) - LLM论文:方法论的下一步演进 ---

## 课后作业 #### 任务1: 理解层(必做) - 阅读BNBC第I和II章:理解LDA数学 - 绘制"主题-经济含义"对应关系表 - 讨论:为什么"recession"话题预测力最强? #### 任务2: 实现层(推荐,三选一) - **A路线** (入门): 用Hugging Face BERT在100篇新闻上提取embedding,PCA降维到2D可视化 - **B路线** (进阶): 用scikit-learn在小型新闻语料上训练LDA (K=20-50),检查主题相干性 - **C路线** (高阶): 复现BNBC市场择时策略,用近5年市场数据回测 #### 任务3: 批判层(鼓励) - BNBC仅用WSJ,LLM用Reuters → 数据源偏差? - 新闻是因果地引发价格变化,还是仅仅相关? - 如何改进这些研究? ---

--- <!-- _class: lead