两段式审计 · 15% 抽样 · 本机实测 6 条输出

AI Berkshire 报告审计:怎么核验一份 AI 生成的投资报告

竞品文章大多展示漂亮的研究报告,却很少展示这份报告是否经得起核查。 AI Berkshire 在工具层放了两把尺子:tools/report_audit.py 负责按比例抽样核对报告里的数据点, tools/financial_rigor.py 与 tools/terminal_value.py 负责把算式与估值参数复算一遍。

  • 本页所有命令行与输出都是本站用 Python 3.11 在 Windows 上真跑出来的,不是抄 README
  • 本站实测到一处关键分歧:文档要求「任意点偏差 > 1% 就打回」,而实现只在主副来源「同时」超标时才打回
  • 审计只证明数字对得上,不证明结论正确——这一点官方资料也没写清楚
extract提取报告里的数据点,默认按 15% 抽样,--seed 可复现同一批样本
人工回填按市场填两个来源的实测值:fetched_value 与 fetched_value2
verdict逐点比对,输出【准出】或【打回】,退出码 0 或 1 可直接当门禁
终值复算含十年折现估值的报告,再跑一次 terminal_value.py audit 查 C1/C2/C3
报告审计流水线示意图。第四步是本站补上的:官方要求含十年折现估值的报告在准出前再跑一次终值审计,因为写报告的过程中可能回头改过 g 与 r,只有最后一次的参数才算数(依据 commit 55be4f7,非官方流程图)。

AI Berkshire · WHY AUDIT

AI 研报为什么需要一道审计

报告里可能出现的问题检查对象怎么查用哪个工具
市值算错,甚至差一个数量级股价 × 总股本 是否等于报告写的市值输入三个数,看偏差百分比与分档financial_rigor.py verify-market-cap
估值倍数口径不明(TTM / 年度 / 预测)PE、PB、市现率的分母是什么核对分母的来源与覆盖期间人工核对 + 报告抽检
财务数据不是一手资料营收、净利润与原始财报是否一致双来源交叉比对,看偏差落在哪一档financial_rigor.py cross-validate
币种混用(人民币 / 港币 / 美元)每一项数字的计价单位逐项标注币种,跨市场对比前先统一terminal_value.py audit 的 C1
折现率与永续增速超出合理区间r 与 g 的取值对照按币种分档的合理区间与增速硬上限terminal_value.py audit 的 C2
离散风险被塞进折现率β 与 r 的调整理由检查退市、政策这类风险是否单独列明terminal_value.py audit 的 C3
数字分布异常,疑似编造多期数字的首位数字分布做 Benford 检验(样本量够才有意义)financial_rigor.py benford
小数运算误差累积关键乘积与加减用十进制精确算,而不是浮点financial_rigor.py calc

审计要把三类陈述分开看:事实(2025 年营收为 X)、推断(收入增长主要来自 Y)、假设(未来 5 年收入增速保持 Z%)。工具只能核对第一类里的数字;后两类要么靠一手资料,要么必须显式写成假设。把假设写成事实,是本项目最想拦住的一种失误。

通过:数据点对得上有警告:单侧来源偏差超标无法验证:来源缺失或口径不可比明确错误:双侧来源都超标

本板块依据 AI Berkshire 官方仓库 commit 55be4f7 与本站 2026-09-28 实测整理。

AI Berkshire · EXTRACT

15% 抽样到底是怎么抽的

extract 怎么跑:五步复现一次抽样

下面每一条命令都可以直接复制执行。预期输出来自本机实跑,不是推断。

  • 准备一份带表格的报告文件

    report_audit.py extract 从 Markdown 表格里抽取数据点,所以报告里的财务数据要写成表格形式。本站演示用的样本是 8 行 × 5 列,覆盖营业收入、净利润、毛利率、经营现金流、总市值、PE、PB、股息率。

    预期输出:总提取数据点: 40(8 行 × 5 列,每个单元格算一个数据点)

  • 先跑一次 dry-run,只看抽检清单
    python3 tools/report_audit.py extract --report report.md --seed 42 --dry-run

    默认抽样比例是 15%(可用 --ratio 调整)。加 --seed 之后,同一份报告每次抽到的样本完全一致——这一步很重要,否则复核者抽不到同一批点,等于没法复现。

    预期输出:抽样: 6 个(40 × 15% 向上取整)

  • 正式导出待填字段的 JSON
    python3 tools/report_audit.py extract --report report.md --seed 42

    去掉 --dry-run 后输出 JSON,每一项都带四个待填字段:fetched_value / fetched_source / fetched_value2 / fetched_source2。也就是说,工具不会自己去取数,取数这一步必须由你或 Agent 用一手来源完成。

    预期输出:JSON 数组,每项含 id、label、unit、reported_value 与四个待填字段

  • 按市场回填两个来源的实测值

    分市场的规定信源是:美股 macrotrends 主 + stockanalysis 副;港股 aastocks 主 + macrotrends 的 ADR 代号 副;A 股东方财富 主 + 巨潮资讯 副。回填两个来源而不是一个,正是为了让「单点错误」和「全局口径错误」能被区分开。

    预期输出:两个来源都填好后进入判决

  • 跑 verdict 出判决
    python3 tools/report_audit.py verdict --results results.json --report report.md

    判决同时给出人类可读结论和机器可用的退出码:【准出】对应 exit 0、【打回】对应 exit 1,所以可以直接挂到流水线里当门禁。

    预期输出:【准出】所有抽检数据通过,报告可发布 / 【打回】存在不通过数据点

  • 本板块依据 AI Berkshire 官方资料与本站实测输出整理,证据等级见事实与版本页。

    AI Berkshire · VERDICT

    判决怎么出:官方规则与实测行为的差别

    实测场景(报告值 100)文档要求(skills/investment-research.md)本站实测行为退出码你该怎么用
    主来源偏差 3%,副来源命中任意点偏差 > 1% → 【打回】只给「⚠️ 警告」,判决仍是【准出】0不能只看退出码,必须同时读警告计数
    主来源偏差 3%,副来源偏差 4%同上判【打回】1只有双侧都超标才会被拦住
    主来源偏差 0.5%,副来源偏差 4%同上判【准出】+ 警告 10副来源单侧超标不构成拦截理由
    只填主来源,偏差 3%同上判【准出】+ 警告 10不填第二个来源,等于自己拔掉刹车
    主副来源偏差都在 1% 以内≤1% 取主来源全部「通过」0正常路径,无需人工介入
    容差常量本身分档写作 ≤1% ✅ / 1–5% ⚠️ / >5% ❌源码 _TOLERANCE = 0.01(1%)—阈值一致,分歧在「谁负责拦」而非阈值大小

    这张表是本站读源码(report_audit.py 的判决分支)加四条对照实验得到的结论:实现里只有「主来源与第二来源同时超容差」才进入不通过集合;只要有一侧命中,就降级为警告,警告不计入失败,于是仍然输出【准出】。

    这不是让你不用这个工具,而是告诉你它到底拦住了什么。真正的用法是两条一起走: 一是必须填满两个来源(少填一个就永远打不出回),二是把警告也当成待办 (人工看那几条警告,而不是只看最后那行【准出】)。第三条退路是:把 --tolerance 收紧后自己再判一次。

    本板块依据 AI Berkshire 官方仓库 commit 55be4f7 与本站 2026-09-28 实测整理。

    AI Berkshire · FINANCIAL RIGOR

    六个核算子命令分别管什么

    子命令查什么本机实测输出分档 / 阈值注意点
    verify-market-cap股价 × 总股本 是否等于报告市值510 HKD × 9.11e9 股 vs 报告 4.65e12 → 「计算市值: 4.6461e+12 HKD」「偏差: 0.08%」「✅ 市值数据一致」≤1% ✅ / 1–5% ⚠️ / >5% ❌偏差 >5% 时会提示核对股本是否最新、单位是否一致、股价是否最新
    verify-valuationPE、PB、市现率、股息率四项比率按 510 / EPS 23.5 / BVPS 120 / FCF 25 / 股息 5 得 PE 21.7、PB 4.25、市现率 4.90%、股息率 0.98%,exit 0无内置分档,只做计算这些比率是算式结果,口径要自己标注(TTM 还是预测)
    cross-validate同一指标的多来源偏差7518 vs 7500(亿)→ 「所有来源偏差 ≤ 2.0%, 数据一致」默认容差 2.0%,可用 --tolerance 调官方规范写的是 1% 分档,与工具默认值不一致,要收紧得显式传参
    benford首位数字分布是否异常8 个数 → 「⚠️ 样本量不足: 8 < 50, Benford分析不可靠」样本 < 50 结论不可用README 没写这个前置条件;样本不足时它只提示、不报错,容易被误读成通过
    calc关键算式的十进制精确值0.1 + 0.2 → 「结果: 0.30」「精确值: 0.30000000000000004」Decimal 口径报告里写「方便读者」的浮点数,在对真值时会对不上
    three-scenario乐观 / 中性 / 悲观三档目标价510 元、EPS 23.5、3 年、PE 25·20·15 → 乐观 825.4(+61.8%)、中性 559.8(+9.8%)、悲观 352.5(-30.9%)需传 --shares(单位亿)区间宽度本身是结论的一部分,只报中间值等于隐藏了不确定性

    六个子命令在本机全部 exit=0。注意 verify-valuation 只做计算不给判断,benford 在样本不足时静默降级——这两处是「看起来在检查、实际没拦住」的典型位置。

    本板块依据 AI Berkshire 官方资料与本站实测输出整理,证据等级见事实与版本页。

    AI Berkshire · TERMINAL VALUE

    终值审计的三条硬约束

    硬约束检查什么人民币口径实测参数不通过说明什么为什么要单独列
    C1 币种与口径一致性r 与 g 是否与报告的计价币种匹配r 合理区间 [6.0%, 9.0%]混币种会把两个市场的利率环境糊在一起人民币与美元的无风险利率差好几个百分点
    C2 折现率与增速的间距r − g 是否足够大g 上限 2.0%(美元口径 ≤ 4%)间距过小会让终值倍数爆表,估值对 g 极度敏感g 动 0.5 个百分点,PE 可能差两位数
    C3 离散风险的归属退市、政策这类风险有没有被塞进 r 或 β需显式列明归属(例:退市:尾部档)把离散风险折成折现率,等于把风险的时间分布搞反抬 r 三个百分点对第 10 年现金流的惩罚是第 1 年的 2.6 倍,而退市风险是近似均匀的年度危害率
    终值倍数公式退出 PE 是怎么算出来的PE = (1 − g/ROIC) / (r − g);ROIC 20%、g 2%、r 8% → 「退出 PE = 15.0x」只给最终倍数,复核者无从验证工具会把留存率 10.0%、分子 0.9、分母 6.0pct 全部展开
    β 偏离 1.0 的理由非 1.0 的 β 有没有依据Rf 1.70%(观测)/ 2.5–3.0%(合成)+ ERP 5.18%β 随手填会让 r 变成「凑结论」的工具参数必须能追溯到来源,C3 要求逐条回显
    触发条件哪些报告必须跑这一步含十年折现估值的报告只跑了第七步的审计,漏掉最后一次参数改动写报告时若回头改过 g 或 r,准出前那一次才算数

    三条硬约束全部通过时,工具会输出「【准出】三条硬约束全部通过」。它与 report_audit.py 的分工是:前者管参数与口径,后者管数据点取值,两者互不替代。

    本板块依据 AI Berkshire 官方仓库 commit 55be4f7 与本站 2026-09-28 实测整理。

    AI Berkshire · FAILURE LEDGER

    AI 投研的七类失败模式台账

    失败模式典型表现根因用哪个工具能抓出来
    市值单位混淆人民币亿被当成港币亿,或漏掉一个零跨市场直接搬数字,没先统一币种verify-market-cap + 终值审计的 C1
    把预测值当历史值表里的「2026E」被写进事实段数据平台把预测与历史混在同一张表cross-validate(两个来源对不上)
    把新闻观点当事实「公司即将进军某赛道」出现在事实段检索结果没有分级,标题即结论报告抽检 + 人工核一手资料
    多 Agent 共享同一个错误来源四个视角都引用同一个错的数并行 Agent 读同一份材料,错误被复制四遍verify-market-cap / cross-validate
    资料多被误判为确定性高报告很长,结论却与市场共识雷同信息丰富度 A 级的陷阱:资料越多越容易趋同信息丰富度评级 + 偏见自查
    结论对某个增长率极度敏感g 动 0.5 个百分点,目标价差几十个百分点终值倍数对分母 r − g 极度敏感terminal_value.py sweep / 审计的 C2
    报告前后不一致摘要在说低估,正文在说不确定分段生成后没有做一致性检查extract 的跨表抽检 + 人工通读

    这张台账是本页最该被抄走的部分。它同时也是一份自检清单:如果你手上的 AI 研报出现了其中任何一条表现,先别急着看结论,先把那个数字核一遍。

    依据 commit55be4f7 · 2026-09-27 最后提交
    本页实测6 条命令在本机 exit=0;判决缺口由 4 条对照实验确定
    未实测项未端到端跑过 Claude Code / Codex 的 Skill(本机两者均未安装)
    证据状态本页所有输出均可按页内命令复现;异常结论以你自己那次运行为准

    本板块依据 AI Berkshire 官方资料与本站实测输出整理,证据等级见事实与版本页。

    AI Berkshire · FAQ

    报告审计常见问题

    只抽查 15% 的数据点,能信吗?

    抽样是成本与覆盖的折中,不是完备性证明。15% 意味着 40 个数据点里查到 6 个;如果报告的量级错误是系统性的(比如整张表都用了同一个错误汇率),抽样很容易命中;但单点错误有概率漏掉。所以正确心态是:抽检通过只说明「没有发现明显数据问题」,不说明「全部正确」。要提高把握,可以调大 --ratio,或对关键结论涉及的那几个数字做定向复核。以官方源文件为准。

    如果被判了【打回】怎么办?

    按官方流程,修正对应数据后重新抽检,直到准出。本页实测到的现实是:真正会触发【打回】的情形比文档写的窄——需要主副两个来源同时超容差。所以反过来说,如果你只看到【准出】就收工,可能会漏掉只有单侧超标的那几个点。建议的顺序是:先看警告条目,把每一条警告都查明原因(是口径差异还是真错),再决定是否接受这份报告。

    我能只跑 verdict,不跑 extract 吗?

    技术上可以——verdict 只要求你给它一个 results JSON。但跳过 extract 就意味着抽样的随机性由你自己负责,也就失去了「用固定 seed 复现同一批样本」这个能力。在需要别人复核你的审计结论时,这一步不能省:没有同一批样本,对方无法重复你的检查。

    报告里的数字是 LLM 算的吗?

    这个项目的设计是把算术从 LLM 手里拿走:金额、比率、折现倍数这类计算交给 financial_rigor.py 与 terminal_value.py(十进制精确运算),LLM 负责叙述与归纳。但要注意,这只是设计意图;本站没有实测过「LLM 是否每次都遵守」,也没有逐份检查过 3,018 份报告文件。所以审计的意义恰恰在于:不要相信设计意图,去核对具体数字。

    审计通过就代表结论正确吗?

    不代表。审计能检查的是「数据点取值对不对」「参数有没有越界」「算式有没有算错」,它无法判断生意判断本身对不对:护城河是否成立、管理层是否可靠、十年后行业还在不在,这些没有可复算的单一答案。本页把这句话放在最显眼的位置,是因为「工具跑出【准出】」最容易被误读成「结论已被验证」。真实的对应关系是:审计是必要项,不是充分项。

    A 股报告要用哪个数据源?

    按项目的规范,A 股是东方财富为主、巨潮资讯为副;美股 macrotrends 主 + stockanalysis 副;港股 aastocks 主 + macrotrends 的 ADR 代号 副;台股 FinMind 主 + Goodinfo 副。注意这套信源是写在 Skill 文档里的规范,不是工具帮你自动抓的:extract 只产出待填字段,取数得你自己或 Agent 用这些站点完成。要自动化取数,可以另配本机的行情数据技能,但那属于另一条路线,与本项目无已证实集成。

    下一步:拿你自己的报告跑一遍

    抽样、判决、算式核验三条命令都可以单独执行,不需要先装 Claude Code 或 Codex。跑完一次你就会知道:审计到底拦住了什么、又放过了什么。