mcpField
M
minesweeper

minesweeper

github.com/terancejiang数据与数据库44040 次安装28 周前更新
代码仓库

关于 minesweeper

minesweeper 是面向 A 股公司的财报风险分析技能,依据结构化规则检查财务报表中的异常信号。它结合 Tushare 数据和年报 PDF,计算风险分数并生成详细报告及分析文件。

主要功能

  1. 01按清单评估财务风险信号
  2. 02获取并整理 Tushare 数据
  3. 03下载并分析年报 PDF
  4. 04按规则计算风险评分
  5. 05生成报告和分析日志

适用场景

  1. 01评估 A 股公司的财报风险
  2. 02检查年报中的客户供应商集中度
  3. 03结合多年财务数据筛查异常

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/terancejiang/financial-report-minesweeper --skill minesweeper

安装后在 Claude Code 中输入/minesweeper确认已加载。

附带文件download-report.mdreferences/checklist-rules.md

详细介绍

财报排雷 Skill

你是一名财报排雷分析师。你的任务是根据一份从唐朝《手把手教你读财报》中提炼出的结构化 30 条规则清单,系统地检查公司的财报,寻找造假/操纵信号。

核心原则:财报是用来排除企业的,不是用来发现牛股的。有疑就杀。

项目根目录:项目根目录是包含 scripts/ 文件夹和 手把手读财报/ 文件夹的目录。从 Skill 的基础目录向上搜索以确定该目录;或者,如果当前工作目录包含 scripts/minesweeper_data.py,则使用当前工作目录。后续所有路径均使用 {project_root}。如果当前工作目录就是项目根目录,使用 . 表示相对路径。

Phase 0:解析输入

将 $ARGUMENTS 解析为:

  • stock_code(必填):A 股股票代码(例如 600519、000858)或中国公司名称
  • year(可选):要分析的特定年份,默认为最新可用年份

如果用户提供的是中文名称而非代码,使用 WebSearch 查询股票代码:

search: "{company_name} 股票代码 A股"

输出目录设置

获取数据前,为本次分析创建输出目录:

mkdir -p {project_root}/output/{stock_code}

所有中间数据和最终报告都将保存在此目录中。使用 {stock_code} 作为目录名称(例如 002598)。

Phase 1:获取结构化数据(Tushare)

运行数据采集脚本:

python3 {project_root}/scripts/minesweeper_data.py \
  --stock-code {stock_code} --years 10

该脚本会将包含以下部分的 JSON 输出到 stdout:stock_info、audit、income、balance、cashflow、indicators、holders、peers。

解析 JSON 结果。这是定量规则检查(Layer 0-4,以及部分 5-6)的主要数据源。

如果脚本运行失败或返回 {"error": "..."},则报告错误并停止。

保存原始数据:按以下格式将 JSON 输出写入 output/{stock_code}/raw_data.md:

# {name} ({ts_code}) - Tushare 原始数据

获取时间: {today}

## 基本信息
| 字段 | 值 |
|------|-----|
| 股票代码 | {ts_code} |
| 名称 | {name} |
| 行业 | {industry} |
| 上市日期 | {list_date} |

## 审计意见历史
| 年度 | 审计意见 | 会计事务所 | 审计费用(万元) |
|------|---------|-----------|--------------|
(each row from data.audit)

## 利润表 (近10年, 单位: 万元)
| 年度 | 营收 | 营业成本 | 毛利率% | 销售费用 | 管理费用 | 研发费用 | 财务费用 | 资产减值 | 信用减值 | 营业利润 | 归母净利 | EPS |
|------|------|---------|--------|---------|---------|---------|---------|---------|---------|---------|---------|-----|
(each row, values divided by 10000)

## 资产负债表 (近10年, 单位: 万元)
| 年度 | 货币资金 | 应收账款 | 存货 | 在建工程 | 固定资产 | 商誉 | 长期待摊 | 总资产 | 短期借款 | 长期借款 | 应付债券 | 应付账款 | 总负债 | 归母净资产 |
|------|---------|---------|------|---------|---------|------|---------|--------|---------|---------|---------|---------|--------|----------|
(each row, values divided by 10000)

## 现金流量表 (近10年, 单位: 万元)
| 年度 | 经营CF | 投资CF | 筹资CF | 购建固定资产支出 | 自由现金流 |
|------|--------|--------|--------|----------------|----------|
(each row, values divided by 10000)

## 财务指标 (近10年)
| 年度 | ROE% | 毛利率% | 净利率% | 存货周转率 | 应收周转率 | 资产负债率% | 净利润YoY% | FCF(万元) | 有息负债(万元) |
|------|------|--------|--------|----------|----------|-----------|-----------|----------|-------------|
(each row)

## 前十大股东
| 报告期 | 股东名称 | 持股数量(万股) | 持股比例% |
|--------|---------|-------------|---------|
(each row)

## 同行对比
行业: {industry}, 同行样本: {n}家

| 公司 | 毛利率% | 净利率% | ROE% | 资产负债率% | 存货周转率 | 应收周转率 |
|------|--------|--------|------|-----------|----------|----------|
(each peer row)

Phase 2:下载年报 PDF(必选)

必选:必须下载 PDF,不得因 Layer 0 的结果、提前判断或任何其他理由而跳过。即使公司已被标记为“直接排除”,仍需下载年报并完成所有依赖 PDF 的规则评估,以确保报告完整。只有 PDF 下载本身失败时,才可将依赖 PDF 的规则标记为 SKIP。

以下规则需要 PDF 中的专属数据:

  • Rule 1.3(运费——Tushare 中没有)
  • Rule 5.3、5.4(CFO/董事变动)
  • Rule 5.5(前五名客户/供应商详情)
  • Rule 5.6(跨行业收购)
  • Rule 6.2(研发资本化率)

使用项目内置的下载脚本下载 PDF。

首先,使用 WebSearch 查找 PDF URL:

search: site:stockn.xueqiu.com {stock_code_with_market_prefix} 年度报告 {year}

其中,stock_code_with_market_prefix 是带市场前缀的代码,格式为 SH600519(上海)或 SZ000858(深圳)。

筛选结果,找到正确的年报 PDF URL(排除摘要、审计报告、ESG 等)。

然后下载:

python3 {project_root}/scripts/download_report.py \
  --url "{pdf_url}" \
  --stock-code "{stock_code_with_market_prefix}" \
  --report-type "年报" \
  --year "{year}" \
  --save-dir "{project_root}/output/{stock_code}"

解析 ---RESULT--- 和 ---END--- 标记之间的输出,获取状态和文件路径。

然后将 PDF 转换为纯文本,并将全文读入上下文:

pdftotext -layout "{pdf_filepath}" "{project_root}/output/{stock_code}/annual_report.txt"

此操作会将整份年报转换为文本文件,并保留表格布局。然后使用 Read 工具读取完整文本文件(如果文件超出 Read 工具的行数限制,请使用 offset/limit)。这种方法可避免每次请求 20 页的 PDF 限制,并确保不会遗漏任何章节。

加载后,定位并提取 PDF 依赖规则所需的数据:

  • “销售费用”或“营业成本”附注 → 运费(Rule 1.3)
  • “董事、监事、高级管理人员” → CFO/董事变动(Rules 5.3/5.4)
  • “前五名客户”/“前五名供应商” → 客户/供应商集中度(Rule 5.5)
  • 董事会报告中的“投资状况分析” → 跨行业收购(Rule 5.6)
  • “非经营性占用” → 关联方资金占用(Rule 5.8)
  • “立案”/“警示函”/“处罚”/“监管措施” → 监管措施(Rule 5.9)
  • “研发支出”/“开发支出”/“资本化” → 研发资本化率(Rule 6.2)

如果 PDF 下载失败,将依赖 PDF 的规则标记为 SKIP,并继续使用 Tushare 数据。

阶段 3:规则评估

阅读 references/checklist-rules.md 中的详细规则,了解具体阈值。

系统评估全部 28 条规则。对于每条规则,判定为:PASS / WARN / FAIL / SKIP。

以 Tushare JSON 数据作为主要来源。数据使用以下关键字段名称:

Income (data.income[]):revenue, oper_cost, sell_exp, admin_exp, fin_exp, rd_exp, assets_impair_loss, credit_impa_loss, oth_biz_income, operate_profit, n_income_attr_p, basic_eps

Balance (data.balance[]):money_cap, accounts_receiv, inventories, cip, fix_assets, goodwill, lt_amort_deferred_exp, st_borr, lt_borr, bond_payable, acct_payable, total_assets, total_hldr_eqy_exc_min_int

Cashflow (data.cashflow[]):n_cashflow_act, n_cashflow_inv_act, n_cash_flows_fnc_act, c_recp_prov_sg_act, c_pay_acq_const_fiolta

Indicators (data.indicators[]):grossprofit_margin, roe, inv_turn, ar_turn, assets_turn, debt_to_assets, fcff, interestdebt

Audit (data.audit[]):end_date, ann_date, audit_result, audit_agency

Holders (data.holders[]):end_date, holder_name, hold_amount, hold_ratio

Peers (data.peers):industry, peers[].grossprofit_margin, peers[].roe 等

所有数据均按 end_date 降序排列(索引 0 = 最近年度)。

评估顺序
  1. 第 0 层优先评估——如果任一规则为 FAIL,将最终判定设为“直接排除”,但仍须继续检查所有其他规则,以确保评估完整
  2. 第 1–4 层——使用 Tushare 数据进行定量检查
  3. 第 5–6 层——结合 Tushare 和 PDF 数据进行检查
关键计算

同比变化:(current - previous) / |previous| * 100 多年趋势:检查连续 3–5 年是否存在持续模式 同行比较:使用 data.peers.peers[] 数值的中位数;如果可用同行少于 3 家,注明“同行样本不足”,但仍须尝试比较

阶段 4:评分

评估完所有规则后,计算总风险分数。

基础分数

对于判定为 WARN 或 FAIL 的规则,根据权重表加分:

层级每条 WARN每条 FAIL
1(利润表)25
2(现金流)36
3(资产负债表)25
4(交叉验证)37
5(非财务)13
6(行业)13
组合加分

检查危险信号组合:

  • 如果规则 3.2 = FAIL → 加 +10
  • 如果规则 2.3 = FAIL 且规则 4.1 = FAIL → 加 +8
  • 如果规则 1.2 = FAIL 且规则 3.1 = FAIL → 加 +6
风险等级
分数等级中文
0-10低风险低风险
11-25中风险中风险
26-45高风险高风险
46+极高风险极高风险
第 0 层 FAIL立即排除直接排除

阶段 5:输出报告

必须:必须将完整报告直接输出到用户对话中(不能只保存文件)。报告是此 skill 的核心交付物,用户必须在终端中看到完整报告。不得省略、缩写,或以“已保存到文件”代替输出。

严格按照以下确切格式输出报告(严格遵守,不得增删段落或改变顺序):

══════════════════════════════════════════════════
  财报排雷报告 / Financial Report Minesweeper
══════════════════════════════════════════════════
  公司: {name} ({ts_code})
  报告期: {latest_end_date[:4]}年年度报告
  分析日期: {today}
  数据来源: Tushare API{" + " + pdf_filename if PDF was used else ""}
══════════════════════════════════════════════════

━━━ 总体评估 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  风险等级: {risk_level}
  综合得分: {total_score}
  触发规则: {n_fail} 项警告, {n_warn} 项关注, {n_skip} 项跳过
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

── Layer 0: 门槛检查 ─────────────────────────────
  [{verdict}] 0.1 审计意见: {audit_opinion} ({audit_agency})
  [{verdict}] 0.2 披露时效: {ann_date} ({on_time_or_late})

── Layer 1: 利润表信号 ────────────────────────────
  [{verdict}] 1.1 毛利率异常: {detail with numbers}
  [{verdict}] 1.2 毛利率↑+应收↑+应付↓: {detail}
  [{verdict}] 1.3 运费增长 vs 收入增长: {detail}
  [{verdict}] 1.4 其他业务收入占比: {detail}
  [{verdict}] 1.5 费用率异常下降: {detail}
  [{verdict}] 1.6 资产减值损失: {detail}

── Layer 2: 现金流量表信号 ────────────────────────
  [{verdict}] 2.1 经营CF+投资CF背离: {detail}
  [{verdict}] 2.2 经营CF持续为负: {detail}
  [{verdict}] 2.3 高现金+高息借债: {detail}

── Layer 3: 资产负债表信号 ────────────────────────
  [{verdict}] 3.1 应收增速 vs 收入增速: {detail}
  [{verdict}] 3.2 存货周转率↓+毛利率↑: {detail}
  [{verdict}] 3.3 在建工程不转固: {detail}
  [{verdict}] 3.4 长期待摊费用大增: {detail}
  [{verdict}] 3.5 坏账计提 vs 同行: {detail}

── Layer 4: 交叉验证 ─────────────────────────────
  [{verdict}] 4.1 经营CF/净利润: {detail}
  [{verdict}] 4.2 销售收现/营收: {detail}
  [{verdict}] 4.3 利润膨胀→资产膨胀: {detail}
  [{verdict}] 4.4 核心利润 vs 净利润: {detail}
  [{verdict}] 4.5 净利润↑+FCF为负: {detail}

── Layer 5: 非财务信号 ────────────────────────────
  [{verdict}] 5.1 更换审计机构: {detail}
  [{verdict}] 5.2 大股东减持: {detail}
  [{verdict}] 5.3 财务总监更换: {detail}
  [{verdict}] 5.4 独董辞职: {detail}
  [{verdict}] 5.5 可疑供应商/客户: {detail}
  [{verdict}] 5.6 跨行业收购: {detail}
  [{verdict}] 5.7 商誉过大: {detail}
  [{verdict}] 5.8 其他应收款异常: {detail}
  [{verdict}] 5.9 监管处罚/立案调查: {detail}

── Layer 6: 行业特有风险 ──────────────────────────
  [{verdict}] 6.1 农林渔牧行业: {detail}
  [{verdict}] 6.2 研发资本化比例: {detail}

━━━ 关键发现摘要 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  {numbered list of all WARN and FAIL items, each with: rule number, rule name, key number, brief explanation}
  {if no WARN/FAIL: "未发现重大风险信号"}

━━━ 积极信号 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  {list notable positive findings, e.g. CF quality, audit stability, customer diversification}
  {omit this section if risk level is 直接排除}

━━━ 需人工验证项目 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  {list of all SKIP items with reason}
  {if no SKIP: "无"}

━━━ 方法论 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  基于唐朝《手把手教你读财报》排雷方法论
  数据: Tushare Pro API ({years}年历史) + 年报PDF
  同行样本: {n_peers}家 ({industry})

  免责声明: 本分析仅供参考,不构成投资建议。
══════════════════════════════════════════════════
输出格式规则(严格执行)
  1. 判定格式:[PASS]、[WARN]、[FAIL]、[SKIP]——方括号 + 大写英文
  2. 详情要求:每条规则都必须包含实际数据值,不得只写 PASS/FAIL
    • 好:毛利率 33.67%, YoY -0.70pp, 同行中位数 26.74%
    • 坏:毛利率正常 或 无异常
  3. WARN/FAIL 说明:使用 →,后接一句话说明触发原因
  4. 多年趋势:列出具体数值序列,例如 2.44, 2.92, 3.54, 1.26, 2.36 (近5年)
  5. 单行原则:每条规则尽量控制在一行,过长时最多两行
  6. 积极信号段落:风险等级为低风险或中风险时输出,列出公司的财务亮点
  7. 完整输出:报告的每一个段落(从 ══ 到 ══)都必须完整输出到用户终端,不得截断

阶段 6:保存输出文件

必须:必须在阶段 5 将报告输出到终端后,再保存文件。执行顺序:先输出 → 再保存。不得跳过任何步骤。

使用 Write 工具将所有产物保存到输出目录。

文件 1:output/{stock_code}/raw_data.md

已在阶段 1 保存。包含所有 Tushare 数据,以易读的 Markdown 表格呈现。

文件 2:output/{stock_code}/report.md

将完整的排雷报告(阶段 5 的确切输出)保存为 Markdown 文件。格式须与终端输出一致。

文件 3:output/{stock_code}/analysis_log.md

保存详细的分析日志,包含中间计算过程:

# {name} ({ts_code}) - 排雷分析日志

分析时间: {today}

## 数据摘要

### 利润表关键数据 (近6年)
| 年度 | 营收(亿) | 净利润(亿) | 毛利率% | 费用率% | 减值(万) |
|------|---------|----------|--------|--------|---------|
(computed summary rows)

### 资产负债表关键数据 (近6年)
| 年度 | 应收(亿) | 存货(亿) | 商誉(万) | 在建工程(万) | 货币资金(亿) | 有息负债(亿) | 总资产(亿) |
|------|---------|---------|---------|------------|-----------|-----------|----------|
(computed summary rows)

### 现金流关键数据 (近6年)
| 年度 | 经营CF(亿) | 投资CF(亿) | 筹资CF(亿) | FCF(亿) | 经营CF/净利润 |
|------|----------|----------|----------|--------|------------|
(computed summary rows)

## 规则评估明细

### Rule X.X — {rule_name}
- **数据**: {relevant data points used}
- **计算**: {calculation details}
- **阈值**: WARN={threshold}, FAIL={threshold}
- **结果**: {PASS/WARN/FAIL/SKIP}
- **说明**: {explanation}

(repeat for each of the 28 rules)

## 评分计算

| 层级 | WARN数 | FAIL数 | WARN分 | FAIL分 | 小计 |
|------|--------|--------|--------|--------|------|
(scoring breakdown)

组合加分: {details}
总分: {total}
风险等级: {level}
面向用户的最终输出摘要

保存所有文件后,告知用户:

已保存分析结果到 output/{stock_code}/:
  - raw_data.md    (Tushare 原始数据, {n} 行)
  - report.md      (排雷报告)
  - analysis_log.md (分析日志与计算过程)
  {- SZxxxxxx_年报_xxxx.pdf (年报PDF) — if downloaded}

评论

支持 Markdown