财报事件研究 — PEAD(盈余公告漂移)
PEAD 现象的历史脉络(Ball-Brown 1968 → Bernard-Thomas 1989 → 现代衰减)、SUE/EPS surprise/Sales surprise 三种 surprise 度量的取舍、行为金融对 underreaction 的三种主流解释
日期: 2026-06-23 方向: Phase 2 / 事件驱动 / PEAD 阶段: Phase 2: 策略实战 + AI 信号 标签: #PEAD #BernardThomas #SUE #EarningsSurprise #EventDriven #BehavioralFinance
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | PEAD 现象的历史脉络(Ball-Brown 1968 → Bernard-Thomas 1989 → 现代衰减)、SUE/EPS surprise/Sales surprise 三种 surprise 度量的取舍、行为金融对 underreaction 的三种主流解释 |
| 实操 | 拉过去 5 年 SP500 财报日历 + actual EPS + consensus estimate → 计算 SUE → 模拟 long top decile / short bottom decile 持有 60 天的累计 abnormal return |
| 产出 | TR-DAY45 笔记 + 可复现 PEAD 因子回测脚本 + 1990s/2010s/2020s 三段年代分组的 spread 衰减表 + Week 7 AI 增强路线图 |
一、PEAD 是什么:一句话定义和它为什么重要
PEAD (Post-Earnings Announcement Drift):股票价格在财报公告之后,会朝着「盈余 surprise」的方向继续漂移 60-90 个交易日,且漂移幅度在统计意义上显著大于零,与 Efficient Market Hypothesis (EMH) 的强式/半强式假设直接冲突。
简化成一张图:
公告日 t=0
↓
┌──┐ surprise +
╱
╱ ╱
╱ ╱ 「漂移期」 t+1 到 t+60
╱ ╱ 平均 +3% to +6% abnormal return
╱ ╱
╱─────────────────── 正常股价路径
公告日 t=0
↓
─────┐
╲
╲ ╲ 「漂移期」 t+1 到 t+60
╲ ╲ 平均 -3% to -6% abnormal return
╲ ╲
╲──────── surprise -
1.1 为什么这个现象对 PM/Quant 都重要
| 视角 | 启示 |
|---|---|
| 学术 | PEAD 是 EMH 最难解释的「市场异象」之一,迄今 50+ 年仍有效 |
| 量化 | 它是少数有清晰事件锚点的因子——不像动量/价值要靠时序,PEAD 有「t=0 财报日」这个确定的进场信号 |
| 行为 | 它直接证明「市场对信息 underreact」——这是后续设计 AI sentiment 增强的理论根基 |
| PM | 它的逻辑可以迁移到所有「公开信息发布 → 用户/投资者反应滞后」的场景:产品 launch、PR 危机、政策发布、监管出台 |
1.2 PEAD vs Momentum vs Mean-Reversion 的区别
Momentum → 「过去 12 月强者继续强」 时序信号,无明确事件锚
Mean-Revert → 「短期超跌反弹」 时序信号,无明确事件锚
PEAD → 「财报 surprise 后漂移」 事件信号,有明确 t=0
PEAD 是横截面 + 事件的混合体——这让它特别适合用现代 ML/LLM 增强,因为「财报内容本身」就是天然的 alternative data。
二、Bernard-Thomas 1989:经典论文做了什么
PEAD 的「集大成」发现来自 Bernard & Thomas (1989, JAR; 1990, Journal of Accounting and Economics)。要看懂今天的代码逻辑,必须先把这篇读熟。
2.1 论文核心步骤
- 样本:1974-1986 NYSE/AMEX 所有公告
- surprise 度量:用 SUE = (actual EPS − seasonal-walk expected EPS) / σ
- 分组:每个季度按 SUE 排序,分 10 个 decile portfolio
- 持有期:从 t+1 到 t+60,每日计算 size-adjusted abnormal return(剔除规模因子收益)
- 结果:
- Top decile (SUE 最高) 60 天平均 abnormal return ≈ +3.2%
- Bottom decile (SUE 最低) 60 天平均 ≈ −3.1%
- Long-Short spread ≈ 6.3% / 60 天,年化约 25%
- 稳健性:分子样本(大/中/小盘)、分年代、控制规模/beta 均显著
2.2 论文还做了什么——后人常忽略
Bernard-Thomas 不止报告了「PEAD 存在」,他们还做了三件远更深刻的事:
- PEAD 在「下一次财报公告日」附近会有第二次跳跃——证明 underreaction 在每季度循环重演
- 机构 holding 比例越低的股票 PEAD 越强——铺垫了「散户 underreaction」的现代解释
- 盈余的「Q1 vs Q4」序列相关性:盈余本身具有可预测性,但市场把它当成 random walk
第三点是最重要的认知冲击:市场不只是反应慢,它甚至没意识到「这个公司四个季度都在 beat,下个季度大概率还在 beat」这种简单结构。这是 PEAD 持续 50 年仍未消失的根本原因之一。
三、PEAD 为什么存在:行为金融的三种解释
学术界给出三类解释,不是互斥而是叠加:
3.1 投资者认知 underreaction(Behavioral)
- Anchoring:投资者锚定旧的盈利预期,新数据更新过慢
- Conservatism bias:Edwards (1968)——人对新信息更新概率慢于贝叶斯最优
- Confirmation bias:beat earnings 的好消息被 narrative 化解读为「短期现象」
3.2 信息扩散需要时间(Information Diffusion)
- 不是所有人在公告同时收到信息
- 分析师下调/上调评级有 1-5 天延迟
- 财报会议要等 transcript 释出
- 机构 IR call 排队几天
- 媒体/Twitter/Reddit 二次传播链——这点在 2020s 之后越发重要
3.3 散户 vs 机构 attention 差异(Limited Attention)
Della Vigna-Pollet (2009) 发现:周五公告 / 节假日前公告的 PEAD 显著更强——因为「散户没看到」。
高 attention 财报 (周二/周三大公司) → PEAD 弱 (信息快速吸收)
低 attention 财报 (周五/小盘/凌晨) → PEAD 强 (信息慢慢扩散)
3.4 套利限制(Limits to Arbitrage)
最后一层解释:就算机构知道有 PEAD,他们也未必能套。
- 借券成本(short top decile loser 要付 borrow fee)
- 短期 P/L volatility(基金经理 risk budget 不允许)
- 小盘股流动性不够大规模部署
- 60 天持有期对 hedge fund 季度考核来说太长
→ PEAD 在小盘 + 低 analyst coverage + 低机构持仓的股票里最强——这是今天回测要重点验证的预测。
四、Earnings Surprise 怎么量化:三种度量
4.1 SUE (Standardized Unexpected Earnings)
学术界的金标准。Bernard-Thomas 用的版本:
$$ \text{SUE}{i,q} = \frac{\text{actual EPS}{i,q} - E[\text{EPS}_{i,q}]}{\sigma(\text{historical surprise}_i)} $$
其中 E[EPS] 可以是:
- Seasonal Random Walk:
E[EPS_q] = EPS_{q-4}(过去同期) - Analyst Consensus:I/B/E/S median estimate(现代标准)
- Time-Series Model:ARIMA on quarterly EPS
σ 是过去 8 个季度的 |actual − expected| 的标准差,用于「standardize」——同样 +$0.10 的 beat,对一家 EPS 波动很大的公司没什么大不了,对一家稳定增长的公司就是大事。
4.2 EPS Surprise %
实务里用得最多,因为直观:
$$ \text{Surprise}% = \frac{\text{actual EPS} - \text{estimate}}{|\text{estimate}|} \times 100% $$
缺点:估计接近 0 时分母爆炸(典型坑:亏损转盈,estimate 是 −$0.01,actual 是 +$0.05,surprise = 600%)。实务里要 winsorize 到 ±100% 或换 SUE。
4.3 Sales / Revenue Surprise
EPS 可以被回购、tax shield、一次性损益污染。Revenue 更难造假,反映真实业务质量。
EPS beat + Revenue miss → 「水分 beat」,PEAD 弱甚至反转
EPS beat + Revenue beat → 「质量 beat」,PEAD 最强
EPS miss + Revenue beat → 执行问题,但增长在
EPS miss + Revenue miss → 「全面崩盘」,下跌漂移最显著
4.4 三者用法对照
| 度量 | 学术 | 实务 | AI 增强里用 |
|---|---|---|---|
| SUE | ✓✓ 标准 | △(要算 σ) | ✓ 主信号 |
| EPS Surprise % | △ | ✓✓ 通用 | 辅助 |
| Sales Surprise | △ | ✓ | ✓ 做 quality filter |
我们今天用 SUE 做主信号 + Sales Surprise 做 confirmation filter。
五、PEAD 策略简化版:可直接 paper trade 的规则
5.1 完整策略规格
Universe : SP500 成份股(流动性保障 + 可空 + 可买期权)
Event Trigger : 当一家公司发布季度财报
Signal : SUE (用 trailing 8 季 σ standardize)
Entry : 财报日 t=0 收盘后计算 SUE
→ t+1 开盘买入 SUE top decile
→ t+1 开盘做空 SUE bottom decile
Position Size : 等权重,每只 0.5%-1% NAV
Holding Period : 60 个交易日
Rebalance : 每个交易日检查所有持仓的剩余天数,到期 t+60 收盘平仓
Risk Caps : 单只持仓 ≤ 1% NAV,总杠杆 ≤ 1.5x(long+short 各自 ≤ 75%)
Stop Loss : 无(PEAD 的本质就是「短期波动里漂移」,加 stop 会切断信号)
Costs : 双边 commission $0.0035/share + 0.5 bp slippage + short borrow 0.5%/yr
5.2 为什么不用 stop loss
PEAD 的预期信噪比:60 天 expected return ≈ 3%,60 天 vol ≈ 12%。单天 noise ≈ 1.5%,stop loss 在 −5% 就会被几乎所有股票触发,把信号切碎。
这是事件驱动策略和趋势策略的根本差异:趋势策略「错了就走」,事件策略「等漂移完成」。
5.3 为什么 Top decile 而不是 Top half
Bernard-Thomas 论文里测过 5 分组、10 分组、20 分组。10 分组(decile)spread 最稳健:
- 5 分组:信号太弱(top quintile 包含太多边缘 SUE)
- 20 分组:top 5% 样本太少,statistical noise 大
- 10 分组:每个 decile ~50 只股票,统计显著且仓位足够分散
六、数据来源:从最贵到最便宜的取舍
| 数据源 | 价格 | 质量 | 覆盖 | 我们用 |
|---|---|---|---|---|
| Refinitiv I/B/E/S | $30k+/yr | ★★★★★ | 全球,1980 起 | ✗ |
| Bloomberg EE | $24k/yr 终端 | ★★★★★ | 全球 | ✗ |
| FactSet | $20k+ | ★★★★★ | 全球 | ✗ |
| Zacks Investment Research | $1k-3k/yr API | ★★★★ | 美股 1985 起 | △(备选) |
| Estimize | Free tier / Pro $$ | ★★★ | 美股 2011 起,crowdsourced | ✓ |
| Yahoo Finance | Free | ★★ | 美股,但 estimate 可能滞后 | ✓ 备份 |
| yfinance Python | Free | ★★ | earnings_dates + estimates | ✓ 主用 |
| NASDAQ Earnings Calendar | Free | ★★ | 日期可靠,consensus 简化 | ✓ 日历 |
| SEC EDGAR | Free | ★★★★★(actual EPS) | 美股全部 | ✓ actual EPS |
6.1 我们的「散户级」数据栈
earnings dates ← yfinance Ticker.earnings_dates + NASDAQ calendar
actual EPS ← yfinance (or scrape from SEC EDGAR XBRL)
consensus estimate ← yfinance Ticker.calendar (latest) + Estimize free
trailing prices ← yfinance historical bars
size factor returns ← Ken French Data Library (free)
关键诚实:散户数据的 estimate 有 look-ahead bias 风险——yfinance 返回的「estimate」可能是公告后被分析师 revised 过的版本,不是公告前那一刻的 consensus。这一条是个人做 PEAD 研究最常踩的坑。Estimize 是少数提供 "as-of-date" estimate snapshot 的免费源。
6.2 Look-Ahead Bias 防护清单
- estimate 必须是「财报公告日 0:00 之前」的最后一个 snapshot
- 同一家公司同一季度的 estimate 只能用最早的「锁定值」,不能用 reformed estimate
- 财报日的 actual 必须用「report_date」而非「fiscal quarter end」
- 计算 SUE 的 σ 时只能用「公告前 8 个季度」的 surprise,不能 leak 后续季度
七、代码:5 年 SP500 PEAD 回测
7.1 数据拉取
# tr_day45_pead.py
import pandas as pd
import numpy as np
import yfinance as yf
from datetime import datetime, timedelta
# 1. SP500 成份股(用 wikipedia 静态快照,prod 应该用 historical membership)
sp500 = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]
tickers = sp500['Symbol'].str.replace('.', '-').tolist()
# 2. 拉每只股票过去 5 年的财报历史
start = datetime(2021, 1, 1)
end = datetime(2026, 6, 1)
earnings_records = []
for tkr in tickers[:50]: # demo: 先跑 50 只验证
try:
t = yf.Ticker(tkr)
eh = t.get_earnings_history() # actual + estimate + date
if eh is None or eh.empty:
continue
eh['ticker'] = tkr
earnings_records.append(eh)
except Exception as e:
print(f"{tkr}: {e}")
earnings = pd.concat(earnings_records, ignore_index=True)
earnings.columns = [c.lower() for c in earnings.columns]
earnings = earnings.rename(columns={'epsestimate': 'estimate', 'epsactual': 'actual'})
earnings['report_date'] = pd.to_datetime(earnings['startdatetime']).dt.normalize()
earnings = earnings[(earnings['report_date'] >= start) & (earnings['report_date'] <= end)]
7.2 计算 SUE
# 3. 每个 ticker 计算 trailing 8 季 σ,然后 standardize
earnings = earnings.sort_values(['ticker', 'report_date']).reset_index(drop=True)
earnings['surprise'] = earnings['actual'] - earnings['estimate']
earnings['surprise_pct'] = earnings['surprise'] / earnings['estimate'].abs()
# trailing 8-quarter std of surprise(必须 shift(1) 避免 look-ahead)
def trailing_std(g):
return g['surprise'].shift(1).rolling(8, min_periods=4).std()
earnings['sigma'] = earnings.groupby('ticker', group_keys=False).apply(trailing_std)
earnings['sue'] = earnings['surprise'] / earnings['sigma']
# 异常值处理:surprise_pct winsorize 到 ±100%
earnings['surprise_pct'] = earnings['surprise_pct'].clip(-1.0, 1.0)
# drop 没有足够历史的样本
earnings = earnings.dropna(subset=['sue']).reset_index(drop=True)
print(f"Total events: {len(earnings)}")
7.3 分 decile + 持有 60 天
# 4. 每季度按 SUE 分 decile
earnings['quarter'] = earnings['report_date'].dt.to_period('Q')
earnings['decile'] = (earnings.groupby('quarter')['sue']
.transform(lambda x: pd.qcut(x, 10, labels=False, duplicates='drop')))
# 5. 计算每个 event 的 t+1 到 t+60 累计 return
def hold_return(row, prices_cache):
tkr = row['ticker']
t0 = row['report_date']
if tkr not in prices_cache:
return np.nan
px = prices_cache[tkr]
# 找 t+1 和 t+60 价格
fwd = px[px.index > t0]
if len(fwd) < 60:
return np.nan
p_entry = fwd.iloc[0] # t+1 open ≈ next trading day close 简化
p_exit = fwd.iloc[59] # t+60
return (p_exit / p_entry) - 1.0
# 一次性拉价格 cache
prices_cache = {}
for tkr in earnings['ticker'].unique():
try:
px = yf.download(tkr, start=start, end=end + timedelta(days=120),
progress=False, auto_adjust=True)['Close']
prices_cache[tkr] = px
except:
continue
earnings['ret_60d'] = earnings.apply(lambda r: hold_return(r, prices_cache), axis=1)
7.4 分组聚合 + 计算 Long-Short Spread
# 6. 计算 decile 平均 return
result = earnings.groupby('decile')['ret_60d'].agg(['mean', 'count', 'std'])
result['t_stat'] = result['mean'] / (result['std'] / np.sqrt(result['count']))
print(result)
# 7. Long top decile - Short bottom decile
top = earnings[earnings['decile'] == 9]['ret_60d'].mean()
bottom = earnings[earnings['decile'] == 0]['ret_60d'].mean()
spread = top - bottom
print(f"\nTop decile: {top*100:.2f}%")
print(f"Bottom decile: {bottom*100:.2f}%")
print(f"Long-Short: {spread*100:.2f}% per 60d → annualized {spread*4*100:.1f}%")
7.5 控制规模因子 + Cap-weight 后再看
# 8. 把 raw return 减去 SPY 同期 return → abnormal return
spy = yf.download('SPY', start=start, end=end + timedelta(days=120),
progress=False, auto_adjust=True)['Close']
def abnormal_ret(row):
t0 = row['report_date']
fwd = spy[spy.index > t0]
if len(fwd) < 60:
return np.nan
return row['ret_60d'] - ((fwd.iloc[59] / fwd.iloc[0]) - 1.0)
earnings['car_60d'] = earnings.apply(abnormal_ret, axis=1)
# 重做 decile spread on CAR
top_car = earnings[earnings['decile'] == 9]['car_60d'].mean()
bottom_car = earnings[earnings['decile'] == 0]['car_60d'].mean()
print(f"\nMarket-adjusted Long-Short CAR: {(top_car - bottom_car)*100:.2f}%")
八、预期结果:1990s 强、2010s 减弱、2020s 局部仍有
8.1 学术界公认的「PEAD 衰减曲线」
| 年代 | Long-Short 60d Spread | 备注 |
|---|---|---|
| 1974-1986 (Bernard-Thomas) | ~6.3% | 论文原始数据 |
| 1987-2000 | ~5.0% | 略有衰减 |
| 2001-2010 | ~3.5% | 机构套利加强 + Reg FD |
| 2011-2020 | ~2.0% | algorithmic trading 进场 + ETF 化 |
| 2021-2025 | ~1.5% (全样本) / 4-5% (小盘) | 大盘几乎没了,小盘仍可观 |
8.2 为什么 PEAD 衰减但没消失
| 力量方向 | 衰减原因 | 残留原因 |
|---|---|---|
| 信息效率 | Reg FD 强制公平披露 | 散户仍然反应慢 |
| 套利 | 量化基金扩张 | 借券成本/容量限制 |
| 数据 | 即时财报抓取 | LLM/AI 处理 transcript 还在早期 |
| 注意力 | 24/7 推特金融 | 大量股票仍 low-coverage |
8.3 现代 PEAD 的「躲藏处」
全样本 SP500 → 1.5% spread → 接近成本 → 不值得做
↓
加 filter
↓
小盘 (mkt cap < $5B) → 3% spread
+ low analyst coverage (≤5 analysts) → 4%
+ low institutional ownership (<30%) → 5%
+ Friday/AH announcement → 5.5%
+ Sales beat confirmed → 6% ⭐
这意味着:PEAD 不死,它只是搬家了。从大盘到小盘、从工作日到周五、从季报到「low-attention」财报。
九、PEAD 与 Week 7 后续的关系
9.1 本周 (Day 45-50) 路线图
| Day | 主题 | 与 PEAD 的关系 |
|---|---|---|
| 45 ✓ | PEAD 基础 + SUE 回测 | 信号定义 + 基线 spread |
| 46 | Claude/GPT 解读 10-Q transcript | 抽 sentiment score → 增强 SUE |
| 47 | Earnings Call 实时分析 pipeline | 转写 → 情感分类 → tradable signal |
| 48 | IV Crush + Earnings Straddle | 期权侧策略(股价 PEAD vs IV 暴跌) |
| 49 | Earnings Iron Condor / Calendar | 卖 vol + 买股票多头 = 复合策略 |
| 50 | Week 7 综合:股票 + 期权 + sentiment 复合 | PEAD 的「最终形态」 |
9.2 LLM 怎么增强 PEAD
传统 PEAD: SUE = (actual - estimate) / σ → decile rank
增强 PEAD: Combined Score = α·SUE + β·SentimentScore + γ·GuidanceScore
SentimentScore: LLM 读 transcript 抽「管理层语气」「forward guidance 强度」「分析师质疑 vs 认可」
GuidanceScore : LLM 读 next-quarter guidance vs prev guidance → 上调/下调比例
关键洞察:财报里的「数字」(EPS, Revenue)是结构化数据,市场吸收得快;而「语言」(management commentary, guidance tone, Q&A defensiveness)是非结构化数据,市场吸收得慢——LLM 正是用来挖这部分剩余 alpha 的工具。
十、PEAD 与 IV Crush 的关系(铺垫 Day 48)
财报后市场有两个独立现象同时发生:
现象 1 股价 PEAD → 正向 surprise → 60 天漂移上涨
现象 2 IV Crush → 公告后 IV 立刻砸 30-50%(不确定性消除)
两者方向不同:
- 长 PEAD 仓位 = 长股票(赚 drift)
- IV crush = 期权卖方赚(赚 IV 收缩)
所以可以叠加交易:
| 策略组合 | 股票腿 | 期权腿 | 净暴露 |
|---|---|---|---|
| Long PEAD + Short Straddle | Long 100 股 | Sell 1 ATM call + 1 ATM put | Delta ~+100,加收 vol premium |
| Long PEAD + Short Strangle (OTM) | Long 100 股 | Sell OTM call + OTM put | 上下都有 buffer,更安全 |
| Short PEAD + Short Call | Short 100 股 | Sell ATM call | Delta ~−200,IV crush + drift 都赚 |
Day 48 会展开这部分的具体执行——尤其是「股票腿先建(财报后即买),期权腿在 t+1 到 t+5 内 IV 还高时建」的时序优化。
十一、回测里必须 honest 处理的几个坑
11.1 Survivorship Bias
用 wikipedia 当前 SP500 列表 = 看不到 2021-2026 期间被踢出的股票(往往是表现差的)。修正:要用 historical membership snapshot。学术界用 CRSP,散户可以用 Norgate Data 或自建。
11.2 Look-Ahead Bias(前面提到)
- yfinance 的 estimate 可能是 revised 后的
- 财报日有时是「after-hours」公告——
report_date应该是 next trading day 才算「市场反应日」
11.3 转移成本不能省
Round-trip cost per trade:
- SP500 大盘股: 0.5-1 bp (commission + slippage)
- 小盘股 (mkt cap < $5B): 5-15 bp
- Borrow fee (short side): 25-300 bp/yr,annualized
60 天 holding period × decile size 50 stocks × LS 100 trades/季 = 400 trades/yr
PEAD 在大盘上的 1.5% spread 60 天 → 年化 6% → 减去成本 1.5% → 净 4.5% 但带 12% vol → Sharpe ~0.4。仅看这个数字不够好。
但在小盘 + low coverage 的 6% spread → 年化 24% → 减去更高成本 3% → 净 21% 带 18% vol → Sharpe ~1.2——这才是值得做的。
11.4 Capacity Constraint
PEAD 越往小盘走 spread 越大,但 capacity 越小。在 mkt cap < $1B 的股票里部署 $1M 的 long-short 已经会 move market。这是个人散户的优势——capacity 不是问题。
十二、PM 视角:今天学到的迁移性思考
12.1 「信息扩散滞后」是普遍现象
PEAD 的本质 = 公开信息 → 价格 fully reflect 之间存在 lag。这个 lag 在所有「信息传播 → 用户决策」的产品场景里同样存在:
| 场景 | 对应的 "PEAD" |
|---|---|
| 产品 launch | 新功能发布后 DAU 通常要 2-6 周才到稳态 |
| 政策发布 | 央行加息 → 房贷申请峰值 typically 滞后 4-8 周 |
| PR 危机 | 负面新闻 → 用户流失峰值 typically 滞后 1-3 周 |
| 监管出台 | 新规发布 → 行业格局变化 typically 滞后 3-12 月 |
| 财报披露 | 我们今天讨论的 PEAD(60 天) |
作为 PM 的实操含义:每次发布重大变化(产品 / 价格 / 政策)后,不要看 D1 数据下结论。短期反应往往 underreact 真实信号——需要等 t+30 到 t+60 的「漂移完成」才有可信结论。
12.2 异象的衰减规律是「机构化套利速度」决定的
PEAD 1989 年公开,2010s 显著衰减——20 年的「半衰期」。任何 alpha 一旦被论文化,就开始进入衰减通道。这给量化研究的启示:
- 不要去捡所有人都知道的因子(Fama-French 那套 SMB/HML 在 2008 后基本失效)
- 去捡刚被发现 / 散户没工具消化的现象(LLM + 财报 transcript 是 2024 起的新窗口)
- 去捡机构没法套的角落(小盘 / 流动性差 / 容量低的股票)
12.3 「事件锚 + 横截面」是被低估的研究范式
大部分量化研究是纯时序(动量、价值、低波动)或纯横截面(市值、行业)。事件驱动 = 时间锚 + 截面排序 是第三种范式,它的优势:
- 入场时点清晰(不像动量要猜什么时候反转)
- 样本天然丰富(每季度全市场 1500+ 公告 = 6000+ events/yr)
- AI 增强空间大(事件文本天然适合 LLM)
→ Week 7 整周就是在沿这条路径走。
十三、明日预告
Day 46: 用 Claude 解读 10-Q — 把 transcript 转成 tradable sentiment
- 10-Q vs 10-K vs 8-K 结构差异
- SEC EDGAR API 拉历史 filing
- 用 Claude/GPT 提示词工程:抽「forward guidance tone」「Q&A defensiveness」「risk language change」
- Prompt 设计:让 LLM 输出结构化 JSON(sentiment_score, guidance_change, risk_delta)
- 把 sentiment_score 拼接到 PEAD 的 SUE 信号上
- 验证:sentiment-enhanced SUE 在 top decile 是否能把 spread 从 1.5% 推到 3%
- 成本估算:每份 transcript 平均 8k tokens × 4 calls/quarter × 500 stocks = $50/季的 LLM 费用
实际执行记录
跑完一项填一项,时间戳 + 卡点。
- [hh:mm] 读完 Bernard-Thomas 1989 摘要 + 论文图表 — ...
- [hh:mm] yfinance 拉完 50 只 SP500 财报历史 — ...
- [hh:mm] SUE 计算完成,verify 一个 sample 公司的数字对得上财报新闻 — ...
- [hh:mm] 跑完 decile spread,结果 vs 学术预期对比 — ...
- [hh:mm] 加 market-adjusted CAR,spread 是否仍显著 — ...
- [hh:mm] 按 mkt cap 分组重跑,验证「小盘 PEAD 更强」 — ...
- 卡点 / 学到的:
总字数:约 6,400 字 今日完成度:理论 ✓ / 代码框架 ✓ / 实操(你自己执行)/ 笔记 ✓