两段式审计 · 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% 就打回」,而实现只在主副来源「同时」超标时才打回
- 审计只证明数字对得上,不证明结论正确——这一点官方资料也没写清楚
--seed 可复现同一批样本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 列,每个单元格算一个数据点)
python3 tools/report_audit.py extract --report report.md --seed 42 --dry-run
默认抽样比例是 15%(可用 --ratio 调整)。加 --seed 之后,同一份报告每次抽到的样本完全一致——这一步很重要,否则复核者抽不到同一批点,等于没法复现。
预期输出:抽样: 6 个(40 × 15% 向上取整)
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 股东方财富 主 + 巨潮资讯 副。回填两个来源而不是一个,正是为了让「单点错误」和「全局口径错误」能被区分开。
预期输出:两个来源都填好后进入判决
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% | 同上 | 判【准出】+ 警告 1 | 0 | 副来源单侧超标不构成拦截理由 |
| 只填主来源,偏差 3% | 同上 | 判【准出】+ 警告 1 | 0 | 不填第二个来源,等于自己拔掉刹车 |
| 主副来源偏差都在 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-valuation | PE、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 研报出现了其中任何一条表现,先别急着看结论,先把那个数字核一遍。
本板块依据 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 用这些站点完成。要自动化取数,可以另配本机的行情数据技能,但那属于另一条路线,与本项目无已证实集成。