独立顾问备忘 · 业绩会因子文献 → 产品契约 · 模拟数据
NovaCompute (NVCP) FY26 Q2 贯穿例子

Advisor brief · Factors → contracts

因子文献有用,但不是作为因子有用

Tone、Tone surprise、发言人加权、Casting、非回答、Fog 拆解、快数字慢语言——这批文献对 AI 原生业绩会产品的贡献, 是分段、分人、相对基线、看结构、分窗验证这五条纪律;把任何一条压成一个标量卖出去,就退化成 RavenPack 已经卖了十年的东西。

一句话结论

对人读一场业绩会,先看相对 bar 的 Δ 与承诺账本,再看谁的哪个问题没被回答、主持人叫了谁,最后才把 tone 残差当脚注扫一眼。文献的价值是告诉你看哪里,不是替你下结论。

对 Agent每条文献变成对象上的一个带基线、带证据的字段SectionSpeaker.roleToneSurprise{raw, baseline, numeric_control, residual}Question.answer_statusCasting.biasLedger.delta。工具永远不返回没有分解的标量。

不是:全文 tone 分 · sentiment 因子 · call score · 跨公司 tone 排名 · 「AI 提了 47 次」 · 通用摘要

三类判断:契约 / 回测故事 / 误用磁铁

直接变成产品契约
  • 分段:新闻稿 / 讲稿 / Q&A 三个对象,Q&A 是主文本(Price et al.)
  • 发言人角色:每个 span 挂 CEO / CFO / 分析师 / 主持人;分析师提问 = 需求侧分布
  • Tone 残差三元组:原始值 − 公司/CEO 习惯 − 数字 surprise 可解释部分(Tips & Tells)
  • 非回答分类:每个问题有 answer_status 与回答中数字个数
  • Casting 偏离:被点名者评级结构 vs 覆盖池 vs 自身历史
  • 分窗验证:Target 用新闻稿窗,Path 用会后 + 漂移窗,只校验方向
只是回测故事(用来说服,不用来做 UI)
  • Tone 预测异常收益的 t 值:横截面几万场的结论,对单场几乎无判决力
  • 「分析师提问权重 > 管理层回答」的具体系数:样本期依赖,换语料就变
  • FinBERT 优于词典:模型选型事实,不是产品特征
  • Fog 拆成 information vs obfuscation:方法论好,但单场噪声大,最多做提示
  • 文本信息慢定价(drift):证明分窗必要,不代表能预测漂移
容易误用
  • 输出原始 tone 分、跨公司比较 tone;CEO 换人不重置基线
  • 把 casting 写成「管理层作假」——它是概率偏离,不是指控
  • 把所有非回答标负面:Reg FD、竞争敏感是合法回避,需要单独类型
  • 用原始 Fog 当「清晰度」;技术密度高会被误判为遮掩
  • 用会后 1 小时股价当文本模型标签——快数字会把慢语言反向标注
  • 把因子 t=3 当作「这场会有 95% 概率偏负」
最关键的一条:横截面 alpha ≠ 单场判决。因子文献的显著性来自几万场业绩会的平均,落到一场 NVCP 的会上, 每个因子只是「值得再看一眼」的注意力路由。所以产品交付的是证据与基线,不是分数;对人是「看这里」,对 Agent 是「这个字段的 residual 与 n_baseline 是多少、原话在哪」。

因子文献 → 产品对象映射

文献线 发现(一句话) 产品对象 / 字段 性质 误用
Price et al. 2012 业绩会 tone 有增量信息;Q&A 段增量大于讲稿 Section ∈ {press_release, prepared, qa};Q&A 为主对象,讲稿降权 结构契约 全文一个 tone 分
Tips & Tells
Druz–Wagner–Zeckhauser
控制业绩与 CEO 习惯后的 Δnegativity 残差才预测分析师修正 ToneBaseline{firm, speaker, n_calls}
ToneSurprise{raw, baseline, numeric_control, residual}
残差契约 跨公司比原始 tone;换 CEO 不重置
FinBERT section-weight 分析师问句 tone 权重大于管理层回答 Speaker{role, name, firm, rating_on_stock} 挂每个 span;提问分布单列 结构契约
权重=回测参数
把系数当真理;「分析师更懂」
Casting Conference Calls 点名偏向看多分析师的会,后续基本面更差 Casting{called_buy_share, coverage_buy_share, bias, firm_hist_bias, uncalled_bears[]} 结构契约 写成「管理层撒谎」
非回答 taxonomy
(约 11%)
约一成问题得到非回答,可分类 Question{answer_status, non_answer_type, numbers_in_answer, script_reuse};率 vs 自身基线 结构契约 一律标负;忽略合法回避
Fog:information vs obfuscation 复杂度可拆成信息成分与遮掩成分 Complexity{info, obfuscation} 只作 hint,不进任何分 提示 · 低优先 原始 Fog 当清晰度
Fast numbers / slow language 数字 surprise 几分钟定价,文本要几天 ValidationWindow{press_release, call, t1, t5};Target 配短窗,Path 配长窗 验证契约(内部) 1h 股价校准文本
Fed / ECB:Target × Path 当期 vs 路径两维不可加;surprise 要相对预期 Surprise{target[], path[]}Bar{version, locked_at} 契约 合成一个分
RavenPack 等产业线 sentiment 因子已商品化;结构 / 承诺账本产品化不足 定位:不卖 tone,卖 Bar + Ledger + 结构字段 定位 再做一个 tone 因子

「性质」列是本页的核心判断:结构契约进 schema;回测故事进 README 与投资人 deck;提示只在人读页脚注出现,Agent 工具不返回。

贯穿例子:NovaCompute(NVCP)FY26 Q2

虚构 AI 推理基础设施公司:卖机柜级推理系统 Nova Rack,同时运营托管推理云 NovaCloud。会议 2026-08-27 盘后。所有数字为模拟数据,仅用于展示每个文献对象在一场会里长什么样。

会前 Bar v2(8/26 18:00 ET 锁定)—— 数字基线 + 文本基线

项目公司指引卖方共识校正后 bar
FQ2 营收$2.05–2.15B$2.12B$2.17B
FQ2 毛利率41–42%41.6%41.7%
RPO(期末)~$10.0B$10.0B
FQ3 营收指引(预期)$2.34B$2.38B
FQ3 毛利率指引(预期)41.3%41.5%
文本 / 结构基线来源基线值
CEO 讲稿负面词占比近 12 场,同一 CEO3.1%
管理层 Q&A 回答负面词占比近 12 场4.4%
Δnegativity 对数字 surprise 的斜率公司自身回归GM −100bp ≈ +0.45pt
非回答率近 12 场 / 全市场9% / 11%
被点名者 Buy 占比 vs 覆盖池近 12 场 / 28 家覆盖68% / 64%(偏离 +4pt)

过去 12 季 9 次超指引中点(均值 +3.1%)→ 营收 bar = 中点 × 1.031。文本基线与数字基线一起版本化:CEO 换人、业务重分类都触发 bar 重建。

新闻稿数字(16:05 ET)—— Target

项目实际vs 共识vs 校正 bar
FQ2 营收$2.21B+4.2%+1.8%
FQ2 毛利率40.6%−100bp−110bp
Non-GAAP EPS$1.12+6.7%经营线 −1.9%
beat 来自 opex / 税率
RPO$9.6B−4.0%−4.0%
FQ3 营收指引$2.30–2.40B中点 +0.4%−1.3%
FQ3 毛利率指引39.5–40.5%−130bp−150bp

「vs 共识」那一列会生成 beat and raise 的标题;「vs 校正 bar」那一列才是 Target surprise。两列都保留,但只有后者进 surprise 对象。

讲稿句(Path 的原话)

“Demand for Nova Rack continues to exceed our ability to supply. We now expect the NR-3 platform to ramp in the second half of fiscal 2027.” — CEO 讲稿 · 上季原话 “first half of fiscal 2027” · 账本 L1 → 延期 2 个季度 · 负面词 0,tone 看不出来
“Gross margin reflected a higher mix of hosted capacity and one-time ramp costs. We expect margins to trend back toward our long-term framework over time.” — CFO 讲稿 · 上季 “return to 43% by the fourth quarter” · 账本 L2 → 去日期化 · Fog 上升 0.8 中 0.6 落在这一段
“Beginning this quarter, we will provide RPO on an annual basis and discuss bookings qualitatively on our calls.” — CFO 讲稿 · 账本 L3 → 季度 RPO 停披露 · 一级告警 · 词典情绪读作中性
“We remain confident in reaching a $10 billion revenue run-rate exiting fiscal 2027.” — CEO 讲稿 · 账本 L4 → 重申,但依赖已延期的 L1 · tension_with: [L1]

Q&A:14 个问题 · 8 位提问者 · 4 个非回答(28.6%,自身基线 9%)

#问题(摘)回答状态回答中数字讲稿复用
Q1Buy · 大行 “Can you quantify the NR-3 delay's impact on FY27 revenue?” 非回答 · deflect_to_demand 0 64%
Q2Hold · 中型 “What's the hosted mix now, and when does GM get back to 43%?” 部分 · refuse_timing 1(mix 34%) 22%
Q3Buy · 大行 “Great quarter. Can you talk about the demand environment?” 已回答(软球) 2 71%
Q6Buy · 精品 “Why move RPO to annual now?” 非回答 · cite_policy 0
Q9Buy · 大行 “Is the capex raise for hosted capacity or NR-3 tooling?” 非回答 · both_without_split 0
Q11Buy · 中型 “Any customer concentration change in the quarter?” 合法回避 · legit_refusal(客户保密) 0

Q11 是回避但不计入负面非回答——taxonomy 里必须有 legit_refusal,否则非回答率会被合规回避污染。Q1 才是信号:问的是量化,回的是需求叙事,零数字,讲稿复用 64%。

Casting:主持人叫了谁

覆盖池 28 家
Buy 64%
历史被点名均值
Buy 68%
本场被点名 8 位
Buy 87.5%
Buy / Overweight Hold Sell / Underweight

偏离 +23.5pt vs 覆盖池,+19.5pt vs 自身历史。4 家 Sell 中有 2 家在过去 3 场都提过问,本场未被点名。表述为「点名结构显著偏多头,历史上这类会后续基本面更弱」,不表述为「管理层回避空头」。

正确产品输出(可视化)

错误摘要(通用 LLM / sentiment 因子会给的)

「NovaCompute beat on revenue and EPS($2.21B vs $2.12B;$1.12 vs $1.05)。管理层表示需求持续超过供给,对 FY27 $10B run-rate 保持信心,NR-3 平台按计划 FY27 推进。Tone 0.68 偏正面。Sentiment factor +0.4σ。」

每一句都能在原话里找到依据,却漏掉了延期、去日期化、停披露、casting 与非回答率。

正确人读页(按这个顺序)

  1. Δ vs bar:营收仅 +1.8%;GM −110bp;FQ3 GM 再 −150bp;RPO −4%;EPS beat 非经营。
  2. 账本:NR-3 延 2Q;43% 目标去日期;季度 RPO 停披露;$10B 重申但与 L1 矛盾;capex +25%;hosted <30% 沉默(实际 34%)。
  3. Q&A:非回答 28.6%(基线 9%);NR-3 量化问题零数字。
  4. 结构:casting +19.5pt;提问集中 NR-3 / 毛利,回答回到需求。
  5. 脚注:Q&A tone 残差 +1.2pt(比数字该有的更负);讲稿残差 ≈ 0。

Target 栏 · 相对 bar 的残差

营收
+1.8%
毛利率
−110bp
EPS 经营线
−1.9%
RPO
−4.0%

名义「beat and raise」;相对校正 bar 只有营收一项小正。

Path 栏 · 指引与账本变化

FQ3 营收指引
−1.3%
FQ3 毛利指引
−150bp
NR-3 时间表
延 2Q
FY26 capex
+25%
季度 RPO
停披露

Target 与 Path 分列,不加总。停披露没有数值,但在 Path 栏必须占一行。

Tone surprise 分解 · 原始负面词占比 = 公司习惯 + 数字可解释 + 残差

管理层 Q&A 回答原始 6.1% → 残差 +1.2pt
习惯 4.4% +0.5 残差 +1.2
CEO 讲稿原始 3.3% → 残差 +0.1pt
习惯 3.1%
分析师提问原始 7.8% → 残差 +2.1pt
习惯 5.0% +0.7 残差 +2.1
公司 / 说话人习惯基线(n=12 场) 数字 surprise 可解释(GM −110bp × 斜率) 残差 = 才是 tone surprise

读法:讲稿是排练过的,残差 ≈ 0(Price et al. 的「讲稿信息量小」在这里就是这一行)。Q&A 里管理层比数字该有的更负 1.2pt;分析师提问更负 2.1pt——需求侧先变脸。Agent 拿到的是三个数加 n_baseline,不是 6.1%。

主题错位:讲稿供给 vs 分析师提问 vs 管理层回答

讲稿供给

需求/供给
40%
NR-3 时间
8%
毛利路径
14%
RPO/订单
4%
竞争/定价
6%

分析师提问

需求/供给
7%
NR-3 时间
32%
毛利路径
29%
RPO/订单
18%
竞争/定价
14%

管理层回答

需求/供给
33%
NR-3 时间
12%
毛利路径
22%
RPO/订单
6%
竞争/定价
9%

读法:提问 32% 在 NR-3、18% 在 RPO,回答只给 12% / 6%,需求叙事从 7% 的问题里长出 33% 的回答。这是「发言人加权」文献的结构部分——三张分布图本身就是产品,权重系数留在回测里。

非回答率 · 本场 vs 自身基线 vs 全市场

本场 14 问 已回答 8 部分 2 非回答 3 合法 1 非回答率 28.6%(含合法回避)· 21.4%(剔除) 自身 9% 全市场 11% 条长 = 比例 × 572px;虚线为基线。剔除 legit_refusal 后仍是自身基线的 2.4 倍。

承诺账本结算(跨季状态机)

#承诺(上季原话)本季状态依据
L1NR-3 ramp 1H FY27延期 → 2H FY27讲稿 “second half of fiscal 2027”;Q1 零数字
L2GM 回到 43% by FQ4 FY26去日期化“over time”;Q2 refuse_timing
L3季度 RPO 披露停披露 → 年度“on an annual basis”;Q6 cite_policy
L4$10B run-rate exiting FY27重申 · 与 L1 矛盾“remain confident”;未解释 NR-3 延期如何兼容
L5FY26 capex $1.1–1.2B上修 +25%$1.4–1.5B;Q9 未拆分用途
L6Hosted mix <30% exiting FY26沉默 · 实际 34%讲稿未提;Q2 被动披露

六条里没有一条是 tone 能读出来的。沉默(L6)与矛盾(L4)是账本才有的状态——单场摘要器没有上季对象,结构上做不到。

分窗市场反应 · 快数字 / 慢语言(只校验分解方向,不进评分)

数字窗(快) 语言窗(慢) 0% 新闻稿 +1.9% 会后 −4.6% T+1 −7.3% T+5 −9.8% 16:05 17:00 开会 18:00 次日收盘 T+5

若用 16:30 的 +1.9% 给文本打标签,会把整场会标成「正面」。数字窗校验 Target(混合偏正确认 EPS 标题效应),会后 + 漂移窗校验 Path(偏负,与账本一致)。窗只做方向校验,不训练、不评分。

人读 vs Agent:同一批对象,两种渲染

人读页(渲染顺序)

  1. 一行 Δ:Target / Path 相对 bar
  2. 账本变化:延期 / 去日期 / 停披露 / 沉默 / 矛盾
  3. Q&A:谁问了什么没被答;率 vs 自身基线
  4. 结构:casting 偏离;三分布错位
  5. 脚注:tone 残差、复杂度拆解
  6. 每条可点回原话(evidence span)
页面是对象的视图,不是另一个摘要器。人读页上不出现任何对象里没有的句子。

对象层(唯一事实源)

  • Bar{version, locked_at, numeric[], text_baselines[]}
  • SectionSpan{speaker, role, text, topic}
  • Surprise{target[], path[]}(相对 Bar)
  • Question{answer_status, non_answer_type, numbers, script_reuse}
  • Casting{bias, firm_hist_bias, uncalled_bears[]}
  • ToneSurprise{raw, baseline, numeric_control, residual, n_baseline}
  • Ledger[]{status, tension_with[], evidence}
  • ValidationWindow{...}(内部)
每个数值字段必须带 baseline 与 evidence;没有基线的字段不允许存在。

Agent 工具(每个返回带证据的对象)

  • get_bar(ticker, fq, version?)
  • get_readout(ticker, fq) → Surprise + Ledger.delta
  • get_qa(ticker, fq, filter=non_answer)
  • get_casting(ticker, fq)
  • get_tone_surprise(ticker, fq, section, speaker_role)
  • get_ledger(ticker, open_only=true)
  • diff_calls(ticker, fq_a, fq_b)(pairwise Δ)
不提供 get_sentiment()get_call_score()summarize()。Agent 想要一句话,自己从对象里写,并附 evidence id。

Agent 工具返回示意 · get_readout("NVCP", "FY26Q2")

{
  "ticker": "NVCP",
  "event": "FY26Q2_call",
  "event_time": "2026-08-27T17:00-04:00",
  "bar": { "version": "v2", "locked_at": "2026-08-26T18:00-04:00", "sandbag_adj": 1.031 },

  "target": {
    "revenue":      { "actual": 2.21e9, "bar": 2.17e9, "consensus": 2.12e9,
                      "vs_bar": 0.018, "vs_consensus": 0.042 },
    "gross_margin": { "actual": 0.406, "bar": 0.417, "vs_bar_bp": -110 },
    "eps":          { "headline_vs_consensus": 0.067, "operating_vs_bar": -0.019,
                      "drivers": ["opex", "tax_rate"] },
    "rpo":          { "actual": 9.6e9, "bar": 10.0e9, "vs_bar": -0.040 }
  },
  "path": {
    "fq3_revenue_guide_mid": { "value": 2.35e9, "bar": 2.38e9, "vs_bar": -0.013 },
    "fq3_gm_guide_mid":      { "value": 0.400, "bar": 0.415, "vs_bar_bp": -150 }
  },

  "ledger_delta": [
    { "id": "L1", "claim": "NR-3 ramp 1H FY27",
      "status": "delayed", "to": "2H FY27", "evidence": ["pr#14", "qa#1"] },
    { "id": "L2", "claim": "GM back to 43% by FQ4 FY26",
      "status": "de_dated", "evidence": ["pr#22", "qa#2"] },
    { "id": "L3", "claim": "Quarterly RPO disclosure",
      "status": "discontinued", "evidence": ["pr#25", "qa#6"] },
    { "id": "L4", "claim": "$10B run-rate exiting FY27",
      "status": "reiterated", "tension_with": ["L1"], "evidence": ["pr#31"] },
    { "id": "L5", "claim": "FY26 capex $1.1-1.2B",
      "status": "raised", "to": "$1.4-1.5B", "evidence": ["pr#27", "qa#9"] },
    { "id": "L6", "claim": "Hosted mix <30% exiting FY26",
      "status": "silent", "observed": 0.34, "evidence": ["qa#2"] }
  ],

  "qa": {
    "questions": 14, "questioners": 8,
    "non_answer_rate": { "raw": 0.286, "ex_legit": 0.214,
                         "firm_baseline": 0.09, "universe_baseline": 0.11, "n_baseline": 12 },
    "non_answers": [
      { "q": "qa#1", "topic": "NR-3 delay FY27 impact", "type": "deflect_to_demand",
        "numbers": 0, "script_reuse": 0.64, "asker_rating": "buy" },
      { "q": "qa#6", "topic": "RPO cadence change", "type": "cite_policy", "numbers": 0 },
      { "q": "qa#9", "topic": "capex split", "type": "both_without_split", "numbers": 0 }
    ],
    "legit_refusals": ["qa#11"]
  },

  "casting": { "called_buy_share": 0.875, "coverage_buy_share": 0.64, "bias": 0.235,
               "firm_hist_bias": 0.04, "uncalled_bears_active_prior_3": 2 },

  "tone_surprise": {
    "qa_mgmt":   { "raw_neg": 0.061, "baseline": 0.044, "numeric_control": 0.005,
                   "residual": 0.012, "n_baseline": 12 },
    "prepared":  { "raw_neg": 0.033, "baseline": 0.031, "numeric_control": 0.001,
                   "residual": 0.001, "n_baseline": 12 },
    "analyst_q": { "raw_neg": 0.078, "baseline": 0.050, "numeric_control": 0.007,
                   "residual": 0.021, "n_baseline": 12 }
  },

  "topic_mismatch": { "top_asked_unanswered": ["nr3_timeline", "rpo"],
                      "answer_overweight": ["demand_supply"] },
  "validation_windows": { "press_release": 0.019, "call": -0.046, "t1_close": -0.073,
                          "t5": -0.098, "use": "direction_check_only" },
  "do_not_render_as": ["beat and raise", "tone positive", "NR-3 on track", "call score"]
}

三个设计点:每个数值都带 baseline / n_baseline(Agent 可对 n=2 的新 CEO 基线自行降权);ledger 有 tension_with(L4 与 L1 的矛盾是对象级事实);do_not_render_as 把「容易误用」直接写进返回值。

刻意不做

合订观点: 这批因子文献真正的贡献是把「读业绩会」拆成了可检验的部件:段、人、基线、结构、窗。 产品把部件做成对象,让人按顺序看、让 Agent 按字段取;因子本身留在回测里当说服材料。 RavenPack 已经证明 tone 因子能卖,也证明了它卖不出溢价——溢价在 bar、账本与结构字段,因为那需要跨季状态,不是一次推理能得到的。