构建固收+的Skill(一): 读转债公告

中金研究

随着 Agent 普及,很多长提示词开始被称为 Skill。我们不能说这一定是错误的,但这不够。这篇文章不打算先给 Skill 下定义,而是从一件已经验证可行的小项目说起:“读公告”。以下既可以理解为步骤,也可以作为提示词,一步步地输入给Agent并验收,借此可以一步步实现和我们最终结果近似的Skill。

一、构建的第一步:“有且仅有”

image

作为转债研究人员,我们要求可以描述为:给我一份“含且仅含有效信息”的公告梳理。

有效的定义是:

• 标的范围:仅与已发行转债的标的,或者转债的一级发行有关

image

• 对范围内的标的,也仅关注与投研决策有关的公告

• 公告的内容可能很长,仅提取“实质性”信息内容

验收标准:此处可以使用Plan 模式,此时Agent已经明确目标,并可能已经大致建立了流程和后续验收标准。我们的流程大体分为:获取公告、筛选合格公告、提取有价值信息、合并成文。

二、获取:从脚本开始

获取本身是相对简单的一步,仅需明确可信、可用的数据源。但是,如果一次性先提取了全部的公告标题、公司名称、日期信息等,再将筛选工作甩到工作流的下一步,可能造成LLM大量阅读验证的负担,我们需要在此提议“获取通道”。

我们采用了两个获取通道:

第一条通道是按发行人名单抓取。名单既包括已经发行转债的公司,也包括尚处于预案、审核或注册阶段的拟发行人。这样可以抓到标题中没有“可转”字样、但对正股或转债研究有意义的公告,例如业绩预告、控制权变化、监管处罚和重大合同。

第二条通道是按“可转”等关键词补漏。它用于发现尚未进入名单的新发行项目,或者名称和名单维护尚未覆盖的公告。

这一步可以完全使用代码完成,而非Agent自主执行,避免大量消耗token和引入不稳定。

图表1:读取脚本代码示意

def fetch_today_for_cb(active_issuers: list, start_date: str, end_date: str,
max_pages: int = 20) → list:
“”"
Args:
active_issuers: 已发转债发行人(仅用于统计)
start_date / end_date: 日期范围
max_pages: 每个全文关键词最多翻页数

Returns:
去重后的 Announcement 列表
“”"
all_anns: list =
seen_keys: set = set()

defadd_unique(anns):
for ann in anns:
key = ann.pdf_url orf"{ann.title}|{ann.date}"
if key notin seen_keys:
seen_keys.add(key)
all_anns.append(ann)

三个关键字走全文搜索(PDF 内容 + 标题)

for kw in ("可转债", "可转换公司债券", "转债"):
    add_unique(_search_fulltext(kw, start_date, end_date, max_pages=max_pages))

logger.info(f"抓取完成: 总计 {len(all_anns)} 条去重后公告(3 个关键字全文搜索)")
return all_anns

资料来源:中金公司研究部

大验收标准:运行脚本后,可获得当日所有发行人的(可选择小批量以便人工检查),及带有“可转”关键字的公告。并多运行几个交易日检验。人工应关注的点在于:

1、除了不报错以外,是否是采用脚本完成的提取,而非临时调用浏览器工具等技能或子代理;

2、是否建立了稳定的发行人名单调取机制,并带有刷新机制。

三、筛选:成本为先,模型兜底

如果把所有标题都交给 Agent 判断,技术上可以做到,但这不是一个经济的方案。标题筛选具有大量稳定、重复的模式,适合先用代码处理,剩余再使用LLM判断兜底。
我们建立的是两类关键词:

• 正面词:明确重要的标题进入候选集,例如“发行公告”、“提前赎回”、“年度报告”等;

• “负面词”:大概率无关或机械性的标题直接过滤;

• 不能由规则确定的内容保留为中性,交给 Agent 复核,该公告与公司经营、股价、转债条款有关,还是仅仅例行公事,按规则披露的模版化内容。

这里我们建议不追求一次性把规则写全,毕竟一旦进入“负面词汇”名单,我们就没有人工复核的余地了。可以多运行几期,由研究员验收,并注入丰富、精炼词汇库。Skill与主观认知共通的一点应该是,存在逐步优化、提升的空间。

图表2:筛选脚本代码示意

deffilter_announcements(announcements: Iterable,
keyword_csv: str = “/data/keywords.csv”,
issuer_codes: set[str] | None = None,
issuer_names: set[str] | None = None,
report_date: str | None = None,
) → FilterResult:
“”" 对公告列表做关键词筛选 “”"
pos_kws, neg_kws = _load_keywords(keyword_csv)

pos_list, neg_list, neu_list = , ,
for ann in announcements:
title = ann.title
# 重复性提示公告跳过 | 消极词汇跳过
if _is_repetitive_notice(title) or _is_hard_skip(title, getattr(ann, “stock_name”, “”)):
continue
# 检查是否为定向转债
if _is_private_bond(ann):
continue

has_pos = any(kw in title for kw in pos_kws)
has_neg = any(kw in title for kw in neg_kws)

if has_pos:
polarity = “positive”
pos_list.append(FilteredAnnouncement(ann=ann, polarity=polarity))
elif has_neg:
polarity = “negative”
neg_list.append(FilteredAnnouncement(ann=ann, polarity=polarity))
else:
polarity = “neutral”
neu_list.append(FilteredAnnouncement(ann=ann, polarity=polarity))

return FilterResult(
    positive=pos_list,
    negative=neg_list,
    neutral=neu_list,
    skipped_repetitive=skipped_rep,
    skipped_hard=skipped_hard,
)

资料来源:中金公司研究部

验收标准:成功执行筛选逻辑,通过脚本直接认定的占比至少超过60%,否则应优化词汇库。小批量人工检查,不跳过指定公司的重要公告,也不跳过发行公告、预案、审核进度等。几处细节应关注:1、如赎回等虽然是重要公告,但上市公司会发布多次提示,应予区分;2、会夹杂定向转债的信息(多数二级市场投资者并不关注);3、即便很少,关注模型自主判断的部分是否合理。

四、提纯:不是“请总结 PDF”

下面将进入这个项目最大的“成本中心”: PDF 阅读。毕竟一份公告可能几十页,募集说明书和定期报告甚至达到数百页。即便到最后仍要阅读,我们也应该建立“逐级披露”的机制。

第一级:标题是否已经足够?

部分公告的研究信息已经完整体现在标题中。例如申请获得受理、上会通过、同意注册,乃至提议下修(转债研究员知道,这本身就是结果,否则会看到“不下修”公告),或例行的转股价格调整提示。这些公告可以保留阶段或汇总公司名单,不必下载和阅读 PDF。

第二级:能否只读固定章节?

上市公司公告的PDF通常都有outlines,这是天然的分割。对于格式相对稳定的公告,可以先由代码定位章节,再让 Agent 阅读少量文本。例如:

• 预案只看发行规模和募集资金用途;

• 发行公告只看发行规模、申购时间表和必要的核心条款;

• 赎回只看赎回登记日、最后转股日、最后交易日信息等等。

在实际构建的过程中,即便对于当下跑分最高的模型,我们仍进行了逐类训练。我们也建议先从转债固定条款、发行以及定期报告这几类开始,其他可以遇到之后再补全。

图表3:报告类型与章节映射字典

SECTION_HINTS = {
“cb_plan”: [“募集资金”, “发行规模”, “募投项目”, “本次发行方案”],
“cb_issue”: [“发行规模”, “发行总额”, “本次发行基本情况”, “发行情况”, “重要日期”],
“cb_issue_result”: [“原股东优先配售”, “网上认购”, “保荐人包销”, “包销情况”],
“cb_reset”: [“修正后转股价格”, “修正程序”, “修正后的转股价格”, “向下修正”],
“cb_redemption”: [“赎回条件满足”, “停止交易”, “赎回登记”, “赎回价”],
“cb_putback”: [“回售价格”, “回售申报期”, “回售资金到账”],
“cb_delist”: [“到期日”, “摘牌日”, “到期兑付”, “停止交易”],
“cb_start_convert”: [“转股价格”, “转股起止”, “开始转股”, “转股期”],
“rating_initial”: [“评级结论”, “主体信用等级”, “评级展望”, “信用评级报告”],
“rating_track”: [“跟踪评级”, “评级结论”, “主体信用等级”, “评级展望”],
“rating_change”: [“评级调整”, “评级结果”, “调整前”, “调整后”],
}

资料来源:中金公司研究部

第三级:先读有限个字符

前两级无法解决的问题,我们可以约定,Agent可先读有限个字符(例如10000字),再进一步判断是否值得全部读完。

验收标准:前两级可完成的解读,在多数交易日占比达到80% 以上。遍历主要的公告类型,均可顺利解读。对未分类的情况,Agent 应当可以汇报其基本情况。

成文:预先持久化是不失忆的关键

汇总结果不难,这里有一个细节是持久化。我们每天可能要阅读很多公告,过程中很可能堵塞Agent上下文,甚至已经发生压缩。因此,要避免Agent将对话记忆当做工作状态。我们把阅读结论从对话中移出,按 PDF ID 写入 data/agent_notes/YYYY-MM-DD.json。Agent在完成遍历后,再根据这个文件交付成果即可。

写在最后:为何是Skill

我们的建立过程,始终关乎两点:稳定与成本。业余投资者当然可以用提示词,比如“你是一个可转债分析师,请帮我整理今日公告…”等等,而以当下模型的能力,甚至也能做出一份初看之下可接受的结果,作为 demo 至少足够 —— 但这不是专业投资者真实可用的水平。模型的高能力意味着高参数,也自然意味着高随机性(灵活性的代价),和高成本 —— 至少我们可以用被浪费的Token,做更多有意义的工作。用脚本来提高效率,用验收标准来确保稳定,这是真正的Skill与长提示词最主要的差异 —— 即便后者也在很多场景下被称作Skill。

图表4:本项目的文件结构

announce/
├── src/announce/
│ ├── init.py
│ ├── cli.py # CLI 入口
│ ├── list_maintain.py # 发行人名单维护(已发 + 拟发)
│ ├── fetch.py # 抓取
│ ├── filter.py # 关键词筛选
│ ├── extract.py # PDF 下载/缓存/段落截取 + Agent Note 读取
│ ├── report.py # Markdown 报告生成
│ ├── redemption.py # 赎回/不赎回事件 append-only 写入历史表
│ ├── no_reset.py # 不下修事件扫描/标准化写入历史表
│ └── classify.py # 公告类型分类(基于标题关键词)
├── data/
│ ├── keywords.csv # 公告关键词(positive/negative)
│ ├── issuers_active.csv # 已发转债发行人(每日从 Chan 同步)
│ └── issuers_proposed.csv # 拟发行/在审发行人
├── output/
│ └── YYYY-MM-DD.md # 每日报告
├── pyproject.toml
└── README.md

资料来源:中金公司研究部

风险

个券基本面超预期,宏观流动性收缩超预期,模型随机性风险

Source

文章来源

本文摘自:2026年7月24日已经发布的《构建固收+的Skill(一):读转债公告》

杨 冰 分析员 SAC 执业证书编号:S0080515120002 SFC CE Ref:BOM868
罗 凡 分析员 SAC 执业证书编号:S0080522070003 SFC CE Ref:BUL744
陈健恒 分析员 SAC 执业证书编号:S0080511030011 SFC CE Ref:BBM220

Legal Disclaimer

法律声明

特别提示
本公众号不是中国国际金融股份有限公司(下称“中金公司”)研究报告的发布平台。本公众号只是转发中金公司已发布研究报告的部分观点,订阅者若使用本公众号所载资料,有可能会因缺乏对完整报告的了解或缺乏相关的解读而对资料中的关键假设、评级、目标价等内容产生理解上的歧义。订阅者如使用本资料,须寻求专业投资顾问的指导及解读。
本公众号所载信息、意见不构成所述证券或金融工具买卖的出价或征价,评级、目标价、估值、盈利预测等分析判断亦不构成对具体证券或金融工具在具体价位、具体时点、具体市场表现的投资建议。该等信息、意见在任何时候均不构成对任何人的具有针对性的、指导具体投资的操作意见,订阅者应当对本公众号中的信息和意见进行评估,根据自身情况自主做出投资决策并自行承担投资风险。
中金公司对本公众号所载资料的准确性、可靠性、时效性及完整性不作任何明示或暗示的保证。对依据或者使用本公众号所载资料所造成的任何后果,中金公司及/或其关联人员均不承担任何形式的责任。
本公众号仅面向中金公司中国内地客户,任何不符合前述条件的订阅者,敬请订阅前自行评估接收订阅内容的适当性。订阅本公众号不构成任何合同或承诺的基础,中金公司不因任何单纯订阅本公众号的行为而将订阅人视为中金公司的客户。
一般声明
本公众号仅是转发中金公司已发布报告的部分观点,所载盈利预测、目标价格、评级、估值等观点的给予是基于一系列的假设和前提条件,订阅者只有在了解相关报告中的全部信息基础上,才可能对相关观点形成比较全面的认识。如欲了解完整观点,应参见中金研究网站(http://research.cicc.com)所载完整报告。
本资料较之中金公司正式发布的报告存在延时转发的情况,并有可能因报告发布日之后的情势或其他因素的变更而不再准确或失效。本资料所载意见、评估及预测仅为报告出具日的观点和判断。该等意见、评估及预测无需通知即可随时更改。证券或金融工具的价格或价值走势可能受各种因素影响,过往的表现不应作为日后表现的预示和担保。在不同时期,中金公司可能会发出与本资料所载意见、评估及预测不一致的研究报告。中金公司的销售人员、交易人员以及其他专业人士可能会依据不同假设和标准、采用不同的分析方法而口头或书面发表与本资料意见不一致的市场评论和/或交易观点。
在法律许可的情况下,中金公司可能与本资料中提及公司正在建立或争取建立业务关系或服务关系。因此,订阅者应当考虑到中金公司及/或其相关人员可能存在影响本资料观点客观性的潜在利益冲突。与本资料相关的披露信息请访http://research.cicc.com/disclosure_cn,亦可参见近期已发布的关于相关公司的具体研究报告。
本订阅号是由中金公司研究部建立并维护的官方订阅号。本订阅号中所有资料的版权均为中金公司所有,未经书面许可任何机构和个人不得以任何形式转发、转载、翻版、复制、刊登、发表、修改、仿制或引用本订阅号中的内容。


来源:https://mp.weixin.qq.com/s/vXst34Qn-OqydfqNKA0efg