Skip to content

rollysys/announcement_filter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

announcement_filter

A 股上市公司公告自动分类 + 监管法规库。

CSRC / SSE / SZSE / BSE 的监管文档 抓回本地建库,把上市公司公告标题 自动打 type / sub_type / legal_ref 三标签,每个标签关联到具体法规条款。

解决一个具体痛点:你拿到一只股票的 1000+ 条公告,分钟级筛出"减持公告 / 异常波动 / 重大资产重组" 等高价值事件,治理类批量归并。


现状(v0.2)

  • 法律库: ~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-cli wrapper(抓取 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

快速上手

1. 设置数据目录

# 法律库根目录(将存 PDF / docx + manifest.json + extracted/)
export ARGUS_LEGAL_ROOT=$HOME/.argus_legal
mkdir -p $ARGUS_LEGAL_ROOT

2. 抓监管文档(可选,只在需要法律全文检索时才需要)

仓库已附带 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 就是干这个的。

3. 公告分类(常用功能)

# 把一只股票的公告 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 --json

dossier 目录结构(用户自己准备),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
    └── ...

4. 法律全文检索

# 现行准则清单
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 stats

5. Python API

from 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 路径

Ontology 维护

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。


License

MIT(代码)。监管文档为公开法规,版权归原发布机构。

About

A-share regulatory corpus + announcement classification: ~900 Chinese securities regulatory docs + 82 ontology rules / 11 categories, real-world hit rate 77% on 2.5M announcements.

Topics

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages