| 方法 | 优势 | 局限 | BNBC选择 |
|---|---|---|---|
| 情感词典 | 可解释 | 信息量低、词义歧义 | ✗ |
| Bag-of-Words | 实现简单 | 18K维、丢失词序 | 作为LDA输入 |
| LDA | 降维(18K→180)、无监督、可解释 | 计算成本高 | ✓ 核心选择 |
| 有监督ML | 预测能力强 | 需标注、难解释 | ✗(后续LLM论文) |
核心思想:模拟"写文章"的过程,反复迭代直到收敛
## 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 | 其他所有词的主题)
## 按概率重新分配主题
| K值 | 问题 | 示例 |
|---|---|---|
| K=50 | 混合多个独立主题 | "航空+破产"合并为一个主题 |
| K=180 | 主题纯净、可解释 | "航空"和"破产"分离 |
| K=250 | 过于细化,捕捉一次性事件 | 收益不显著增加 |
手动检查也支持K=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激增 |
标准LDA使用全样本估计 → 时刻t的主题估计包含未来信息 → 预测回归有偏
标准LDA: θ̂_t ← 用全部数据 (1:T) 估计 → 有前视偏差
oLDA: θ̂_t ← 仅用 1:t 的数据估计 → 无前视偏差 ✓
BNBC使用gensim包的oLDA(变分推断而非Gibbs采样)
需要4年burn-in期使对数似然估计稳定
标准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% |
"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} 调整市场仓位
| 策略 | 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策略在降低最大回撤方面表现优异
BNBC的BoW → LDA 流程:
原始文本 → 分词 → 词频向量(18K维) → LDA降维(180维)
↓
可解释但有信息损失
三个根本问题:
将Step 1(文本表示)委托给全球顶级研究团队的预训练模型
研究者只需关注Step 2(计量建模)
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" 是负信号
句子1: "Strong earnings" → 词频: {strong:1, earnings:1}
句子2: "Not strong earnings" → 词频: {not:1, strong:1, earnings:1}
↑ 增加了一个词,但"strong"信号不变
输入: 数十亿个互联网文本 (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取平均 → 文章级表示
输出: 直接进入下游回归/分类
| 数据库 | 描述 | 规模 |
|---|---|---|
| Refinitiv RTRS | 路透实时新闻 | 美国3百万+文章 |
| Refinitiv 3PTY | 第三方存档 | 3百万+文章 |
| News Alerts | 仅标题的快速新闻 | 3百万+条 |
| CRSP | 美国股票数据 | 1996-2019 |
| Datastream-EIKON | 国际股票数据 | 16个市场 |
情感分析:
收益预测:
有意使用最简模型,以凸显文本表示本身的重要性
| 模型 | 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 |
| 模型 | 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 |
| 参数量 | 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 |
| 市场 | 语言 | 文章数 | 月均覆盖股票 |
|---|---|---|---|
| 美国 | 英文 | 3,038,025 | 2,593 |
| 英国 | 英文 | 571,285 | 454 |
| 日本 | 日文 | 310,244 | 645 |
| 中国(港) | 中文 | 182,363 | 247 |
| 德国 | 德文 | 178,039 | 163 |
| ... | ... | ... | ... |
核心要点:
① 仅保留核心版面 (A, B, C)
② 轻量词形还原(非Stemming,因为Stemming过于激进)
③ 同时使用uni-gram和bi-gram
④ 频率过滤 < 0.1%
⑤ 最终 DTM: 763,887 × 18,432
迭代次数: 300
超参数: α = 1, β = 1
- α 控制文档的主题分布稀疏度
- β 控制主题的词分布稀疏度
- α=β=1 为均匀先验(无偏好)
估计结果不包含先验(直接用计数比例)
============================================
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
最终: 可解释 + 轻量 最终: 黑箱 + 高效
宏观分析 微观收益预测
============================================
## 用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词是否可解释
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免费运行
BNBC复现:
LdaMulticore,num_topics=180)LLM复现:
文本 → 经济预测
/ \
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 (2024) | LLM论文 (2023) | |
|---|---|---|
| 表示 | LDA主题 (180维) | BERT embedding (1024维) |
| 监督 | 无监督 | 有监督(股票收益标签) |
| 解释性 | 高 | 低 |
| 适用 | 宏观经济 | 个股收益 |
| 核心贡献 | 可解释的经济测量 | 高效的预测表示 |
方法选择:如果你要做一个文本分析的金融研究,你会选择LDA还是LLM?为什么?
因果性挑战:BNBC发现"recession"注意度能预测GDP,但新闻是反映还是驱动经济预期?如何区分?
LLM的边际改进:OPT从125M到2.7B参数Sharpe从4.39提升到4.51——这点改进值得巨大的计算成本吗?
实时应用:如果要在实际交易中使用这些方法,你会遇到什么挑战?
新方向:多模态融合(文本+价格图表+交易量)、因果推断、动态主题模型?
## 从新闻到收益预测:挖掘作者的研究逻辑
*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