A 股上市公司公告自动分类 + 监管法规库。
把 CSRC / SSE / SZSE / BSE 的监管文档 抓回本地建库,把上市公司公告标题 自动打 type / sub_type / legal_ref 三标签,每个标签关联到具体法规条款。
解决一个具体痛点:你拿到一只股票的 1000+ 条公告,分钟级筛出"减持公告 / 异常波动 / 重大资产重组" 等高价值事件,治理类批量归并。
- 法律库: ~900 篇监管文档(CSRC 568 + SSE 129 + SZSE 188 + BSE 23),每篇带
status(active / amended / repealed) - 公告分类器 ontology: 11 大类 / 82 子类 / 87 个 golden test,实测全市场 250 万条公告 77% 命中
- 代码: 纯 Python 标准库 + regex,无重型依赖
- 可选:
python-docx(extract docx)、pdftotext(poppler,extract PDF)、playwright-cliwrapper(抓取 SPA listing)
数据规模会随抓取持续增长。本仓库只发代码,不分发监管 PDF — 用户自己跑 fetcher 脚本从官方源抓。
git clone https://github.com/rollysys/announcement_filter.git
cd announcement_filter
# 核心功能(只用 LegalCorpus + AnnouncementClassifier API)
pip install -e .
# 完整功能(含 docx 提取)
pip install -e ".[all]"系统依赖(只在跑 fetcher / extract 时需要):
# macOS
brew install poppler # 用于 PDF → txt
npm install -g @playwright/cli@latest # 抓 SPA listing 需要(可选)
# Linux
sudo apt install poppler-utils# 法律库根目录(将存 PDF / docx + manifest.json + extracted/)
export ARGUS_LEGAL_ROOT=$HOME/.argus_legal
mkdir -p $ARGUS_LEGAL_ROOT仓库已附带
data/manifest_public.json— 908 条法规的元数据索引(标题、类目、源 URL、sha256),你可以先用它探查清单,确认要哪些再跑 fetcher 抓 PDF。
# 看清单
python3 -c "
import json
d = json.load(open('data/manifest_public.json'))
print(f'snapshot: {d[\"snapshot_date\"]}, {d[\"documents_count\"]} docs')
"
# CSRC 公告(SSE 镜像,~350 条 PDF)— 最重要
python3 scripts/parse_sse_csrc_links.py # 先抓 listing
python3 scripts/fetch_csrc_via_sse.py # 再下 PDF(~10 min)
# SZSE 自己规则(~190 条 PDF/docx)
python3 scripts/parse_szse_listings.py
python3 scripts/fetch_szse_self.py
# 提取全文(供检索)
python3 scripts/extract_text.py
# 同步 status(从【已修订】【失效】前缀)
python3 scripts/update_status.py --apply
# (可选)生成你自己的 public manifest 给别人用
python3 scripts/export_public_manifest.py为什么 fetcher 仍然存在? manifest_public.json 只含元数据(URL + sha256),不含 PDF 全文。要做"应收账款"等关键词全文检索,你需要本地有 PDF + extracted txt — fetcher 就是干这个的。
# 把一只股票的公告 JSON 打标签
export ARGUS_DOSSIER_ROOT=/path/to/your/dossiers
python3 scripts/announcement_classifier.py 600519.SH
# 输出汇总
python3 scripts/announcement_classifier.py 600519.SH --summary
# 仅输出 jsonl
python3 scripts/announcement_classifier.py 600519.SH --jsondossier 目录结构(用户自己准备),classifier 三源 fallback:
$ARGUS_DOSSIER_ROOT/600519.SH/
├── announcements_full.json # 优先 1:聚合 JSON list,每条 {title, ann_date, ...}
├── announcements_index.json # 优先 2:轻量索引(只 title + meta)
└── announcements_full/ # 优先 3:子目录,每个 .json 一条公告
├── 20260331_2025年年度报告.json
├── 20260411_控股股东减持股份计划公告.json
└── ...
# 现行准则清单
python3 scripts/legal_query.py list --category csrc/disclosure_format
# 关键词搜索
python3 scripts/legal_query.py search "应收账款" --top 5
# 看某条法规全文
python3 scripts/legal_query.py show csrc-disclosure_format-2025-3 --full
# 法律库 stats
python3 scripts/legal_query.py statsfrom argus_legal import LegalCorpus, AnnouncementClassifier
corpus = LegalCorpus.load("/path/to/legal")
print(corpus.stats())
hits = corpus.search("重大资产重组", top=5)
classifier = AnnouncementClassifier(corpus=corpus)
result = classifier.classify({"title": "控股股东减持股份计划公告", "ann_date": "20260411"})
# → {type: "shareholder", sub_type: "reduce_plan",
# legal_ref: "csrc-disclosure_mgmt-order-224 / 减持管理暂行办法", ...}src/argus_legal/
├── __init__.py # 公共 API
├── ontology.py # 11 大类 / 82 规则 / 法律 mapping
├── corpus.py # LegalCorpus 类:list / search / get / stats
├── classifier.py # AnnouncementClassifier 类
├── fetcher.py # 4 站点 fetcher 公共基类(Downloader + ManifestWriter)
├── playwright_attach.py # 两层抓取:打开通知页 → 抽附件链接
├── listing_extractor.py # 抓 SPA listing 页通用接口
├── csrc_title_parser.py # CSRC 公告标题解析("[2025]3 号——《xxx》")
├── paths.py # ENV-driven 路径管理
└── tests/
└── test_ontology.py # 87 golden samples 回归测试
scripts/ # CLI 入口(都是 argus_legal 的瘦 wrapper)
├── legal_query.py
├── announcement_classifier.py
├── extract_text.py
├── update_status.py
├── cleanup_bad_ids.py
├── fetch_*.py # 4 个站点 fetcher
└── parse_*.py # listing 抓取脚本
| 变量 | 默认 | 用途 |
|---|---|---|
ARGUS_LEGAL_ROOT |
$HOME/.argus_legal |
法律库根目录(含 manifest.json) |
ARGUS_DOSSIER_ROOT |
$HOME/.argus_dossiers |
个股 dossier 根目录(分类器读) |
ARGUS_PLAYWRIGHT_CLI |
自动探测 | playwright_cli.sh 路径 |
src/argus_legal/ontology.py:RULES 是 list,每条:
("type", "sub_type",
[re.compile(r"模式 1"), re.compile(r"模式 2")],
"法律库 doc_id / 法规简称")加 / 改规则后跑测试:
python3 src/argus_legal/tests/test_ontology.py
# === ontology 测试 — 87/87 通过 ===本仓库 不包含 任何监管 PDF / docx 文件。所有数据由用户自己跑 fetcher 从官方源(csrc.gov.cn / sse.com.cn / szse.cn / bse.cn)抓取,fetcher 遵守:
- 速率限制(每文件间 1.5 - 2.5s 延迟,避免冲击官方站点)
- User-Agent 标识
- robots.txt 范围内
得到的文档版权归原发布机构(CSRC / 上交所 / 深交所 / 北交所)所有,本工具仅做本地索引 + 检索,不做任何 redistribute。
MIT(代码)。监管文档为公开法规,版权归原发布机构。