第 10 课 · 政策面数据提取

公告与监管文本监控:绕过二手新闻,直接盯住法定义务披露的一手信息

预计用时:35 分钟 上一课:第 9 课 · 美股与加密货币对比

这节课你将得到什么

一个"今日公告雷达":扫一遍自选股在巨潮资讯上的最新公告,先用关键词体系分诊(监管/减持/重组/提价/分红),再对每条给出影响评级和一句可审计的理由,最后附上可点击的公告原文链接。这就是政策面监控的最小闭环:分诊 → 评级 → 取证。

和第 3 课的新闻情绪打分器相比,这节课换了信息源:从"别人嚼过的新闻"换成"公司自己签发的公告"。这个替换本身就是本课最重要的认知升级。

一、公告是一手信息,新闻是二手加工

A 股上市公司有法定的信息披露义务:重大事项、减持计划、分红方案、收到监管函……都必须以公告形式原文披露,巨潮资讯网(cninfo)就是证监会指定的信息披露平台之一。公告有三个新闻比不了的性质:

结论:政策面监控要从源头抓起,新闻流(第 3 课)适合做情绪温度计,公告流(本课)适合做事实触发器

二、数据从哪来:巨潮接口与降级链

脚本 scripts/announcement_monitor.pyak.stock_zh_a_disclosure_report_cninfo() 按股票代码查近 7 天公告,返回的字段里最有价值的是 公告链接——直达巨潮详情页的 URL。两个工程细节:

三、关键词分诊体系:先粗分,再精读

看脚本里的 KEYWORD_RULES,注意它是有序的,规则是"按优先级首匹配"——命中即定类、立即返回:

KEYWORD_RULES = [
    ("监管", ["监管函", "问询函", "警示函", "关注函", "立案调查", "行政处罚"]),
    ("减持", ["减持", "持股变动", "权益变动"]),
    ("重组", ["重组", "并购", "收购", "发行股份购买资产"]),
    ("提价", ["提价", "涨价", "调价", "价格调整"]),
    ("分红", ["分红", "利润分配", "派息", "股利"]),
]
设计决策为什么
按优先级首匹配,而非全部命中计数一条公告只进一个分诊桶,汇总才不会重复计数;一条标题同时含"收购"和"分红"时,由优先级仲裁,结果确定、可复现
"监管"排在最前优先级 = 紧急程度。监管函可能直接改变公司能否正常经营(立案、处罚),必须最先被看到;分红最不紧急,垫底
关键词宁窄勿宽不收录"增长""计划"这种万能词——误报会淹没雷达。漏报还有 LLM 层兜底,误报没有
关键词体系的天生盲区:什么都没说的标题

样本里的"贵州茅台重大事项公告"命中不了任何关键词——标题本身就是不透明的。还有"业绩预增公告""停牌公告"也都一样。这不是 bug,是关键词法的边界:分诊器的职责是把 80% 套路化标题快速归桶,剩下 20% 诚实地标记"未分类",交给 LLM 或人工读原文。一个假装什么都能分的分类器,比一个承认盲区的分类器危险得多。

四、动手:跑起来(无需 API Key)

演示模式内置 5 条 2026-07-21 真实抓取自巨潮的公告快照(含茅台提价对应的"重大事项公告"、交易所问询函回复、股东减持、中期分红提议、重组过会),零网络零 Key:

cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/announcement_monitor.py

你会看到(我已在你的环境实测通过):

运行模式:演示模式(内置样本 + 预计算评级)

今日公告雷达(2026-07-22)
========================================================
数据源:内置样本(2026-07-21 真实抓取自巨潮资讯的公告快照)

[未分类] 贵州茅台(600519)  2026-07-18
  标题:贵州茅台重大事项公告
  分诊:未命中任何关键词——这类标题必须读原文或交给 LLM
  评级:强利好 | 理由:正文确认飞天提价落地,直接增厚利润
  原文:http://www.cninfo.com.cn/new/disclosure/detail?stockCode=600519&announcementId=1225431263&orgId=gssh0600519&announcementTime=2026-07-18

[分红] 兴业证券(601377)  2026-07-21
  标题:兴业证券关于董事长提议实施2026年中期利润分配方案的提示性公告
  分诊:命中关键词「利润分配」
  评级:利好 | 理由:中期分红提议,真金白银回报股东
  原文:http://www.cninfo.com.cn/new/disclosure/detail?stockCode=601377&announcementId=1225433438&orgId=qsgn0000076&announcementTime=2026-07-21%2000:00:00

[减持] 华康洁净(301235)  2026-07-21
  标题:关于股东减持计划期限届满的公告
  分诊:命中关键词「减持」
  评级:中性 | 理由:减持计划到期,实际减没减要读正文
  原文:http://www.cninfo.com.cn/new/disclosure/detail?stockCode=301235&announcementId=1225435429&orgId=nssc1000712&announcementTime=2026-07-21%2018:08:26

[监管] 冠城新材(600067)  2026-07-21
  标题:冠城新材关于上海证券交易所2025年年度报告信息披露监管问询函回复的公告
  分诊:命中关键词「问询函」
  评级:利空 | 理由:年报遭交易所问询,需看回复能否自洽
  原文:http://www.cninfo.com.cn/new/disclosure/detail?stockCode=600067&announcementId=1225433682&orgId=gssh0600067&announcementTime=2026-07-21%2000:00:00

[重组] 中化装备(600579)  2026-07-21
  标题:中化装备科技(青岛)股份有限公司关于发行股份购买资产并募集配套资金暨关联交易事项获得上海证券交易所并购重组审核委员会审核通过的公告
  分诊:命中关键词「重组」
  评级:利好 | 理由:发行股份购买资产过会,重组关键节点
  原文:http://www.cninfo.com.cn/new/disclosure/detail?stockCode=600579&announcementId=1225434286&orgId=gssh0600579&announcementTime=2026-07-21%2000:00:00

========================================================
分诊汇总:未分类 1 条 | 分红 1 条 | 减持 1 条 | 监管 1 条 | 重组 1 条
========================================================

提醒:雷达的职责是'分诊与取证',不是下单指令。
盘后看到利空公告,T+1 下你最早明天才能行动——这正是复盘时间该做的事。

对照样本读三个细节:第一,茅台那条"未分类"但评级是强利好——关键词层承认盲区,LLM 评级层(这里是预计算)补上判断,两层各管一段;第二,减持那条评级是"中性"而非利空——"减持计划期限届满"说的是计划到期,实际减没减、减了多少,标题里根本没有,理由字段如实说了"要读正文";第三,每条末尾的"原文"链接在终端里可以直接点开,跳到巨潮详情页核对全文。

真实模式拉取自选股近 7 天的公告(脚本里 WATCHLIST 可自行增删):

python scripts/announcement_monitor.py --real

我实测时巨潮接口通畅,拉到 6 条公告,其中"兴业证券半年度业绩预增""冠城新材半年度业绩预亏"等不在预计算表内的标题会标注"未评级(加 --live 现场评级)"。若接口被风控,会自动降级回内置样本——这个降级路径我用代理断网法实测过。

五、LLM 影响评级:演示与真实双轨

关键词只能告诉你"这是什么类别",不能告诉你"利好还是利空、多严重"——那是 LLM 的活。Prompt 完全沿用第 3 课的三原则:

你是一名A股政策面分析师。对用户给出的上市公司公告标题,判断它对该股的影响。
只输出JSON,不要输出任何其他文字:
{"impact": <"强利好"|"利好"|"中性"|"利空"|"强利空">,
 "reason": <不超过30字的判断依据,注明哪些信息需要读原文确认>}

结构化输出(进流水线)、标尺定义(五档评级,不许漂移)、要求理由(可审计)——外加 reason 里特意要求"注明哪些信息需要读原文确认",因为公告标题的信息量经常撑不起一个确定结论。真实模式:

export LLM_API_KEY="sk-你的key"
python scripts/announcement_monitor.py --live

环境变量沿用系列约定:LLM_BASE_URL 默认 https://api.deepseek.com,LLM_MODEL 默认 deepseek-chat,OpenAI 兼容协议。--live 模式我已写好但尚未实测(你机器上还没有 Key)——拿到 Key 后跑一次,有报错直接贴给我。

六、批判性思考:雷达是取证工具,不是交易信号

自测

凭记忆作答——答错比答对更能加固记忆。

延伸阅读

下一课预告

第 11 课 · 研报解读 Agent:公告是公司的自说自话,研报是卖方研究员的第三方解读——篇幅更长、观点更密、立场更需要打折。下一课让 Agent 学会读长文:摘要、观点提取、与公告事实交叉验证。

有任何不清楚的地方(比如关键词优先级设计、signal.alarm 超时、巨潮接口参数),直接问我——我是你的老师。