返回交易笔记
TR Day 45

财报事件研究 — PEAD(盈余公告漂移)

PEAD 现象的历史脉络(Ball-Brown 1968 → Bernard-Thomas 1989 → 现代衰减)、SUE/EPS surprise/Sales surprise 三种 surprise 度量的取舍、行为金融对 underreaction 的三种主流解释

2026-06-23
Phase 2: 策略实战 + AI 信号
PEADBernardThomasSUEEarningsSurpriseEventDrivenBehavioralFinance

日期: 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 论文核心步骤

  1. 样本:1974-1986 NYSE/AMEX 所有公告
  2. surprise 度量:用 SUE = (actual EPS − seasonal-walk expected EPS) / σ
  3. 分组:每个季度按 SUE 排序,分 10 个 decile portfolio
  4. 持有期:从 t+1 到 t+60,每日计算 size-adjusted abnormal return(剔除规模因子收益)
  5. 结果
    • Top decile (SUE 最高) 60 天平均 abnormal return ≈ +3.2%
    • Bottom decile (SUE 最低) 60 天平均 ≈ −3.1%
    • Long-Short spread ≈ 6.3% / 60 天,年化约 25%
  6. 稳健性:分子样本(大/中/小盘)、分年代、控制规模/beta 均显著

2.2 论文还做了什么——后人常忽略

Bernard-Thomas 不止报告了「PEAD 存在」,他们还做了三件远更深刻的事:

  1. PEAD 在「下一次财报公告日」附近会有第二次跳跃——证明 underreaction 在每季度循环重演
  2. 机构 holding 比例越低的股票 PEAD 越强——铺垫了「散户 underreaction」的现代解释
  3. 盈余的「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 WalkE[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 起△(备选)
EstimizeFree tier / Pro $$★★★美股 2011 起,crowdsourced
Yahoo FinanceFree★★美股,但 estimate 可能滞后✓ 备份
yfinance PythonFree★★earnings_dates + estimates✓ 主用
NASDAQ Earnings CalendarFree★★日期可靠,consensus 简化✓ 日历
SEC EDGARFree★★★★★(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
46Claude/GPT 解读 10-Q transcript抽 sentiment score → 增强 SUE
47Earnings Call 实时分析 pipeline转写 → 情感分类 → tradable signal
48IV Crush + Earnings Straddle期权侧策略(股价 PEAD vs IV 暴跌)
49Earnings Iron Condor / Calendar卖 vol + 买股票多头 = 复合策略
50Week 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 StraddleLong 100 股Sell 1 ATM call + 1 ATM putDelta ~+100,加收 vol premium
Long PEAD + Short Strangle (OTM)Long 100 股Sell OTM call + OTM put上下都有 buffer,更安全
Short PEAD + Short CallShort 100 股Sell ATM callDelta ~−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 字 今日完成度:理论 ✓ / 代码框架 ✓ / 实操(你自己执行)/ 笔记 ✓