IPO NotebookLM Screen: 一个 Agent 可执行的 A 股打新尽调 Skill
NotebookLM 的核心能力不是"生成播客",而是长上下文下的 source-grounded 问答——上传一组材料后,AI 基于材料内容回答问题并标注引用来源。这个能力天然适合金融尽调:招股书几百页、同行财报几十份、政策文件若干,人类读完需要数小时,而 NotebookLM 可以在分钟级别回答"这家公司的收入结构是什么""同行毛利率对比如何""风险因素有哪些"这类具体问题。
在 X 上看到了一个手动 workflow:把 IPO 相关材料上传到 NotebookLM,设计一组标准问题,让 AI 逐一回答,最后汇总成投资决策。这个 workflow 的价值在于结构化——不是泛泛地问"这家公司怎么样",而是围绕收入结构、同行对比、发行结构、风险因素、融资历史、盈利质量、关联交易这八个维度,逐个获取 source-grounded 的回答。
但手动 workflow 的瓶颈也很明显:材料收集、PDF 上传、问题改写、答案整理,每一步都需要人工介入。当 screening 对象从一个变成十个,这个 workflow 的边际成本不会下降。
我的目标是把这套方法转化为agent 可执行的 skill:agent 自动完成材料收集、目录整理、backend 交互、问题改写、最终汇总。用户只需要提供发行人名称,剩下的由 agent 执行。
最初的设计
最初版本的架构分为六步,核心是一套结构化问题驱动的尽调框架。
标准八问
这套 workflow 的价值在于问题设计。不是泛泛地问"这家公司怎么样",而是围绕八个维度,逐个获取 source-grounded 的回答:
1. 核心业务
请基于<发行人>的招股书和最新披露材料,说明公司的核心产品、核心业务线是什么;按业务线拆分近3年收入结构如何变化;前五大客户集中度如何变化,是否存在单一大客户依赖。
为什么问这个:打新是两层决策。第一层是"能不能碰"——有没有雷?第二层才是"会不会炒"——首日涨多少?八问解决的是第一层。必须先看清楚卖什么、卖给谁、收入结构是否健康。单一大客户依赖是 IPO 后业绩暴雷的高频原因。
2. 同行对比
请仅围绕<业务线>业务,将<发行人>与<同行1>、<同行2>、<同行3>对比,说明毛利率、营收增速、研发费用率的主要差异,以及这些差异来自产品结构、价格周期、成本曲线还是客户结构。
为什么问这个:发行人的自我描述总是乐观的。同行对比是唯一的客观锚点。毛利率比同行高 10 个百分点,要么是真的有护城河,要么是会计处理不同,要么是不可持续的。
3. 发行结构(A股版)
此次发行是否存在战略配售投资者?分别是谁、获配规模多少、限售期多久?是否包含产业资本、关键客户、关键供应商或具有定价指示意义的机构?
为什么问这个:战略配售名单是市场对发行人的"投票"。产业资本参与说明产业链认可,知名机构参与说明估值有锚。没有战略配售或全是财务投资者,需要警惕。
4. 募资用途与稀释
请拆分<发行人>本次募资用途,各项目占比多少,最大募投项目是什么;发行完成后控股股东和实际控制人持股比例分别稀释到多少。
为什么问这个:募资用途决定钱会不会被浪费。扩产项目要看产能利用率,研发项目要看历史研发转化率。控股股东稀释比例关系到上市后控制权稳定性。
5. 风险因素
请把<发行人>招股书风险因素拆成两类:行业共性风险与公司特有风险,并说明哪些可以通过同行对照部分打折看,哪些必须单独警惕。
为什么问这个:招股书风险章节往往写几十条,但大部分是每个行业都有的套话。真正需要警惕的是公司特有的、同行没有的、或者比同行严重得多的风险。
6. 融资历史与估值
请根据<发行人>历史融资、股权变化和招股书披露,估算上一轮重要融资估值与本次IPO估值的跳涨倍数;如果信息不足,请明确缺口。
为什么问这个:Pre-IPO 轮融资估值到 IPO 估值的跳涨倍数,直接决定了打新的安全边际。跳涨 3 倍和跳涨 10 倍,风险完全不同。
7. 盈利质量
请检查<发行人>过去3年及最新一期利润中,是否存在政府补助、资产处置、公允价值变动、汇兑收益等一次性项目明显抬高利润;同时比较经营现金流净额与净利润是否匹配。
为什么问这个:IPO 前公司有很强的动机美化利润。经营现金流与净利润的匹配度,是识别"纸面利润"的最可靠指标。
8. 关联交易
请说明<发行人>关联交易占营收和采购的比例,前五大客户与前五大供应商中是否存在关联方,是否存在交易公允性或独立性风险。
为什么问这个:关联交易是 A 股 IPO 的雷区。发行前把利润做高、上市后利润回落的经典套路,往往通过关联交易实现。
最终决策问题
八个维度回答完毕后,最后问:
如果目标是判断是否参与<发行人>本次打新,请基于前述材料给出支持参与的3-5条核心理由、反对参与的3-5条核心理由,并按"参与 / 观察 / 放弃"给出结论。
这八问的逻辑:为什么是这八个维度?
这八问不是拍脑袋凑的。它们覆盖了基本面尽调的核心链条,从"公司值不值得买"到"以什么价格买"到"买完之后可能出什么事":
| 问题 | 覆盖维度 | 在决策链条中的位置 |
|---|---|---|
| 1. 核心业务 | 商业模式、收入结构、客户集中度 | 值不值得买——先看懂公司卖什么 |
| 2. 同行对比 | 竞争定位、财务指标差异 | 估值锚定——发行人自我描述不可信,同行是客观基准 |
| 3. 发行结构 | 定价机制、战略配售、稀释 | 以什么价格买——发行条款决定安全边际 |
| 4. 募资用途 | 资金效率、扩产合理性 | 钱会不会被浪费——募资投向反映管理层质量 |
| 5. 风险因素 | 行业共性 vs 公司特有 | 买完之后可能出什么事——识别非对称风险 |
| 6. 融资历史 | 估值跳涨、安全边际 | 价格是否合理——Pre-IPO 到 IPO 的跳涨倍数 |
| 7. 盈利质量 | 利润真实性、现金流匹配 | 利润是否可信——识别纸面利润 |
| 8. 关联交易 | 独立性、利益输送 | 公司治理是否干净——IPO 雷区排查 |
这八问构成一条从业务理解到估值验证到风险排查的完整链条。但不是全部——它们解决的是"能不能碰",不是"会不会炒"。
两层决策框架
| 层次 | 问题 | 回答者 | 八问的位置 |
|---|---|---|---|
| 第一层:能不能碰 | 有没有雷?基本面是否过关? | 八问框架 | ✅ 已解决 |
| 第二层:会不会炒 | 首日涨多少?情绪溢价多高? | 市场情绪、流动性、定价 | ⏳ Next Step |
为什么先解决第一层
"以正合,以奇胜"——先保证不踩雷,再谈收益。
IPO 首日收益高度随机。学界研究了几十年,"IPO underpricing puzzle" 至今没有统一解释。预测首日涨幅几乎不可能,但识别明显雷区是可行的:
- 关联交易占比 80% 的公司,破发概率是否更高?直觉上是的,但需要数据验证
- 经营现金流持续为负的公司,是否更容易在上市后业绩变脸?需要验证
- 估值跳涨 10 倍的公司,安全边际是否比跳涨 3 倍的更差?需要验证
八问的价值不在于预测收益,而在于排雷——在情绪高涨时避免碰不该碰的标的。
有意省略的情绪层
| 省略的维度 | 为什么放在第二层 |
|---|---|
| 市场情绪(申购倍数、首日涨幅预期) | 回答"会不会炒",不是"能不能碰"。申购倍数可获取,但首日涨幅不可预测 |
| 宏观环境(利率、流动性) | 对所有 IPO 一视同仁,不是发行人特有风险。属于"市场择时"而非"公司择时" |
| 交易层面(流通盘大小) | 招股书中已披露,属于"已知信息"而非"需要分析的信息" |
框架的真正价值
不是"覆盖所有投资者关心的事",而是:
- 排雷优先:先识别"绝对不能碰"的标的,再考虑"要不要参与"
- 结构化:把"这家公司怎么样"拆解为可独立回答的子问题
- 可验证:每个问题都有明确的材料来源(招股书、财报、公告)
- 可比较:同行对比提供了客观锚点
- 可复现:同一个框架适用于不同发行人,结果可比
六步执行架构
围绕这八个问题,最初版本的执行分为六步:
- Scope 固定:确定发行人、上市市场(A 股)、当前阶段(已申报/已过会/已定价)、业务线、同行组。
- 材料收集:招股书/招股意向书、发行安排公告、风险公告、管理层访谈、历史融资记录、相关政策文件。
- 目录构建:按角色分组(发行人核心、同行 A、同行 B、政策、访谈),每份文件配 manifest 记录来源 URL。
- Backend 交互:可选推给 NotebookLM,或保留在本地 manifest_only。
- 问题改写:把标准八问替换为发行人专属版本(公司名、同行名、市场结构、当前财报周期)。
- 决策表输出:markdown 格式,包含业务摘要、同行视角、正面信号、红旗、最终结论(Participate/Watch/Skip)、置信度说明。
这个架构本身没有问题。但在实际使用中暴露了六个结构性缺陷。
从痛点到实现:六项重构
问题一:同行财报的收集效率
同行财报此前全靠 agent 自行上网检索。Agent 会打开浏览器、搜索、下载,过程慢、来源杂、容易下到摘要版而非完整 PDF。更根本的问题是,巨潮资讯网(cninfo.com.cn)作为 A 股信息披露的官方平台,有完整的 API 和标准化的报告下载路径,agent 却绕过了这个最优解,去走更慢、更不可靠的通用搜索路径。
实现:对接巨潮资讯网
新增 scripts/cninfo_fetch.py,直接对接巨潮资讯网的披露 API。输入 stock code + org_id,自动定位并下载最新定期报告或年报,生成 manifest.json。Agent 不再需要自行搜索和下载。
问题二:Agent 兼容性
最初版本的 SKILL.md 和 README 中大量出现 "Codex needs to...""Codex should..."。这个表述在 Codex 环境下没有问题,但对于 Hermes Agent 或其他 agent 框架,会产生明显的违和感——文档预设了一个特定的执行者,而不是描述一个通用的工作流。
实现:文档重写
SKILL.md 和 README 全部改为 agent-agnostic 表述。"the agent (Codex, Hermes, or other)" 替代了所有 "Codex"。
问题三:Backend 选择的主观性
最初版本有两个 backend:
- manifest_only:只收集材料、写 manifest,不调用任何外部 client。稳定、可复现、不依赖网络。
- notebooklm:把材料推给 NotebookLM,做问答。功能更强,但依赖第三方 client 的稳定性。
此前 agent 对"是否升级到 notebooklm"做主观判断。标准不统一——有时材料明明很多,agent 却觉得"好像本地分析也行"而跳过 NotebookLM,导致长上下文问答被遗漏;有时材料不多,agent 反而想推给 NotebookLM,造成配额浪费。这种不确定性在自动化流程中不可接受:要么该用的没用(遗漏关键分析),要么不该用的用了(资源浪费)。
实现:硬规则替代主观判断
引入 backend_policy,三种模式:
- forbid:始终使用 manifest_only。排除不确定性,适合对 NotebookLM 稳定性存疑的环境。
- auto:默认。按规则升级——notebook ≥2、source ≥10、同行报告 ≥3、或目标字段明确提及 NotebookLM 关键词且材料规模达标。只在边际收益为正时触发。
- required:强制使用 NotebookLM。避免 agent 因"嫌麻烦"而跳过。
auto 的触发条件写死,agent 不再做主观判断。
问题四:notebooklm-client 的启动成本
NotebookLM 没有官方 API。社区维护了一个逆向 client(notebooklm-client),需要 git clone、npm install、npm run build,然后 export 三个环境变量才能使用。每次新环境都要重复这套流程,启动成本高到 agent 可能干脆放弃使用 NotebookLM。
实现:自动探测 + 自动克隆
scripts/notebooklm_adapter.py 现在自动探测常见路径下的 notebooklm-client,找不到就自动 git clone + npm build。环境变量变成 optional override,不是必要条件。
问题五:同行识别过于依赖招股书
对接 CNInfo 后,agent 可以直接下载同行财报了。但"同行是谁"这个问题,答案仍然来自招股书。
A股招股书都有一个固定章节:"与同行业可比公司的比较情况"。发行人通常会精心挑选几家财务指标好看、业务模式相近的公司作为对比基准。问题是:这个名单是发行人写的。如果发行人的毛利率显著高于行业平均,他们可能会选择毛利率同样偏高的公司作为可比对象,从而"合理化"自己的高毛利。如果某家真正的直接竞争对手业绩太差,发行人可能干脆不把它放进可比名单。
这意味着 agent 的分析框架在第一步就被发行人设定了。
实现:三层启发式同行发现
新增 peer_discovery.py,采用三个独立来源交叉验证:
Layer 1:招股书正则提取
不盲信,但也不忽视。用正则从招股书"同行业可比公司"段落提取显式名单。这是发行人官方表态,至少说明他们认为这些公司值得被比较。
Layer 2:LLM / 知识库推荐
agent 或用户基于对行业的理解,提供候选名单。例如嘉德利做 BOPP 电工膜,LLM 可以推荐东材科技、铜峰电子、大东南等。这一层引入了外部视角,打破发行人设定的框架。
Layer 3:用户指定覆盖
如果用户明确知道某家公司是竞争对手但招股书没提,可以直接指定加入分析。
三层结果自动去重,按置信度排序(招股书提取 = high,LLM推荐 = medium,用户指定 = high)。最终产出带 org_id 的可交易代码列表,直接喂给 cninfo_fetch.py。
验证案例:嘉德利(603435)
招股书可比公司:铜峰电子、大东南、龙辰科技、海伟电子。
peer_discovery.py 提取结果:
- 铜峰电子 ✓(A股,代码 600237)
- 大东南 ✓(A股,代码 002263)
- 龙辰科技 ✗(新三板,无法自动解析)
- 海伟电子 ✗(未上市,无法解析)
同时 LLM 层推荐了东材科技(601208),虽然招股书说东材科技"收入占比较低,未作为可比公司",但东材科技确实是国内电子材料龙头,值得纳入观察。
问题六:org_id 是隐形门槛
cninfo_fetch.py 要求用户提供 6 个参数:
1--stock "000333,9900005965,szse,美的集团,10_peer_segment_a,latest"
其中 9900005965 就是 org_id——巨潮资讯网的内部组织编码。它不是股票代码,不是统一社会信用代码,普通投资者根本不知道这个值是什么。查这个值需要打开 cninfo.com.cn、搜索股票、查看页面源码或网络请求、找到 orgId 字段。门槛极高,而且完全无意义——机器可以自动做这件事。
实现:orgid_resolver.py
通过 CNInfo 公开搜索 API,输入股票代码或公司名称,返回 org_id + market:
1$ python3 scripts/orgid_resolver.py 东材科技
2{
3 "code": "601208",
4 "org_id": "9900019705",
5 "market": "shj",
6 "zwjc": "东材科技"
7}
cninfo_fetch.py 现在支持 4 参数模式:
1--stock "铜峰电子,铜峰电子,10_peer_segment_a,latest"
org_id 和 market 自动填充。如果自动解析失败,才回退到 6 参数模式。
重构总结
这次重构的核心思路是:减少人工卡点,让 agent 能自主完成全流程。
- 数据源:从 agent 自行搜索变成直接对接巨潮资讯网 API
- Agent 兼容:从 Codex-only 变成 agent-agnostic
- Backend 选择:从 agent 主观判断变成硬规则(forbid/auto/required)
- 依赖管理:从"手动 clone + export 三个环境变量"变成"自动探测 + 自动克隆"
- 同行发现:从"招股书说了算"变成三层交叉验证
- org_id:从"手动查"变成"自动解析"
验证:排雷框架是否有效?
八问框架解决的是"能不能碰"——排雷。但排雷的有效性不能靠直觉,需要数据验证。
通过对 2020-2025 年 A 股 IPO 样本的梳理,基本面指标与破发概率之间存在显著相关性:
基本面指标与破发概率的相关性
| 指标 | 与破发概率的关系 | 对八问的验证 |
|---|---|---|
| 关联交易占比 | 显著正相关 | 第 8 问(关联交易)有数据支撑 |
| 现金流质量(经营现金流/净利润) | 显著负相关 | 第 7 问(盈利质量)有数据支撑 |
| 估值跳涨倍数(PE/Pre-IPO) | 高倍数破发概率高 40 个百分点 | 第 6 问(融资历史)有数据支撑 |
| 发行 PE/行业平均 PE | 相关系数 0.62(最高) | 第 3 问(发行结构)+ 第 2 问(同行对比)共同覆盖 |
关键发现
- 2020-2024 年,>30% 的新股上市次年业绩下滑 50% 以上,相当比例存在高额关联交易
- 2022 年破发大年:高发行价、高市盈率、高超募的"三高"企业是破发主力
- 熊市中基本面筛选边际价值最高——流动性枯竭时,任何财务瑕疵都被放大
- 牛市(如 2024-2025 紧供给期)基本面筛选边际价值降低——"无差别上涨"掩盖了风险
结论
八问框架不是心理安慰。在熊市和震荡市中,排雷的有效性有数据支撑。但在极端牛市(如 2024-2025 年的紧供给环境),制度性溢价会掩盖基本面风险,此时八问的价值是"避免在情绪高点接盘基本面烂标的",而非"预测涨幅"。
下一步
情绪层:会不会炒(权重降低,观察为主)
在第一层排雷过关的基础上,可以叠加情绪指标辅助参与决策,但权重应显著低于基本面层:
- 申购倍数:可获取,反映市场情绪热度
- 发行定价合理性:市盈率 vs 行业平均,是否过高?
- 流通盘大小:影响首日炒作空间
- 宏观流动性窗口:利率、资金面是否支持新股溢价
但这里有一个根本问题:IPO underpricing puzzle 学界几十年没解。预测首日涨幅几乎不可能。情绪层的价值更多是"在已知不能碰的标的上节省申购资金",而非"预测能赚多少"。
实际打新时观察市场情绪即可,不需要像基本面层那样系统性地纳入 skill 框架。