返回 Skill 列表
extension
分类: 数据与分析无需 API Key

中港美上市公司财务指标查询

根据条件查询指定上市公司财务报表中的财务指标数据

person作者: user_81793785hubcommunity

Financial Excel Query Skill

从 workspace/excels/*.xlsx 里读结构化财务数据

应用场景

Agent 回答业绩类问题时,[fact] 数字必须来自可核验的结构化数据源。本 skill 就是这一层数据源:

  • 公司整体:营业总收入 / 毛利 / 营业利润 / 净利润 / YoY / 各项费用(→ query_income.py
  • 分部业务:各业务线(如淘天、Cloud)的分部收入、EBITA、EBITA 利润率、多层子分部(→ query_segments.py

Agent 拿到这两个脚本的 JSON 输出后,把数字塞进 [fact] 表格,再叠加 retrieve_filing_kb([filing-stated cause])+ web 搜索([external])综合分析。

数据源约定

workspace/excels/ 由上游其它 skill(futu-financial-report / segment-financial-report)生成,文件命名两套:

| 类型 | 文件名规则 | 例子 | |---|---|---| | 公司整体 | {MARKET}_{TICKER}_income_{yyyymmdd}_{hhmmss}.xlsx | US_BABA_income_20260628_141917.xlsx | | 分部业务 | {TICKER}_segments_{yyyymmdd}_{hhmmss}.xlsx | BABA_segments_20260630_210744.xlsx |

  • MARKETUS / HK / SH / SZ
  • 同 ticker 同类型的多个版本:脚本按文件名末尾时间戳降序取最新一份,其它忽略
  • 打开 Excel 时自动跳过临时锁文件(~$ 前缀)

Excel 内部结构(两类文件对齐):

| 布局 | 说明 | |---|---| | 第 1 列 | income = 指标名(营业总收入);segments = 分部名(可能带 ├─ 缩进标层级) | | 第 2 列 | income = 单位(百万人民币);segments = 指标(收入 / EBITA / EBITA 利润率(%)) | | 第 3 列起 | 每列一个 period,如 2026Q1 / 2025FY / 2024Q42025FY 视为完整财年 | | 第 1 行 | period 列头 | | 第 2 行(仅 income) | 财报日期 | | 第 3 行起 | 数据行 |

目录结构

workspace/skills/financial-metrics-query/
├── SKILL.md
├── config/
│   └── excel-format.json           # 文件名正则 + 列布局 + period 正则
└── scripts/
    ├── _common.py                  # 共用:文件挑选、period 过滤、单元格规范化
    ├── query_income.py             # 整体损益表查询
    ├── query_segments.py           # 分部业务查询
    └── requirements.txt            # openpyxl

前置准备

pip install -r workspace/skills/financial-metrics-query/scripts/requirements.txt

用法:query_income.py

# 最简:取 BABA 最新一份 income excel,返回全部指标全部 period
python workspace/skills/financial-metrics-query/scripts/query_income.py --ticker BABA --pretty

# 只要营业总收入 + 营业利润,最近两年全部季度
python workspace/skills/financial-metrics-query/scripts/query_income.py \
    --ticker BABA \
    --metrics "营业总收入,营业利润" \
    --fiscal-years 2024-2025 \
    --pretty

# 只要 FY 与 Q4
python workspace/skills/financial-metrics-query/scripts/query_income.py \
    --ticker 00700 --fiscal-periods FY,Q4 --pretty

# 精确 period 列表
python workspace/skills/financial-metrics-query/scripts/query_income.py \
    --ticker BABA --periods "2024Q3,2025FY,2026Q1" --pretty

query_income.py 参数

| 参数 | 说明 | 默认 | |---|---|---| | --ticker | 股票代码(自动 upper) | 必填 | | --metrics | 指标名子串(逗号分隔),任一命中即返回 | 全部 | | --fiscal-years | 财年过滤,2024 单年或 2022-2025 闭区间 | 不限 | | --fiscal-periods | 财期类型,如 FY,Q3,Q4 | 不限 | | --periods | 精确 period 列表,如 2024Q3,2025FY | 不限 | | --config | 配置文件路径 | config/excel-format.json | | --excels-dir | 覆盖 excels 目录 | workspace/excels/ | | --pretty | 缩进输出 | 关闭 |

用法:query_segments.py

# BABA 全部分部全部指标(可能很大,建议加过滤)
python workspace/skills/financial-metrics-query/scripts/query_segments.py --ticker BABA --pretty

# 只看云智能分部的收入与 EBITA
python workspace/skills/financial-metrics-query/scripts/query_segments.py \
    --ticker BABA --segment "Cloud" --pretty

# 只要一级分部(level=1)的收入
python workspace/skills/financial-metrics-query/scripts/query_segments.py \
    --ticker BABA --metric 收入 --max-level 1 --pretty

# 结合财年过滤
python workspace/skills/financial-metrics-query/scripts/query_segments.py \
    --ticker BABA --metric EBITA --fiscal-years 2024-2025 --pretty

query_segments.py 参数

| 参数 | 说明 | 默认 | |---|---|---| | --ticker | 股票代码 | 必填 | | --segment | 分部名子串过滤(大小写不敏感) | 全部 | | --metric | 指标名子串过滤 | 全部 | | --fiscal-years / --fiscal-periods / --periods | 同 income | 不限 | | --max-level | 只返回层级 ≤ N 的分部(Level 1 = 顶层) | 不限 |

输出格式

query_income.py 输出

{
  "success": true,
  "ticker": "BABA",
  "source": "US_BABA_income_20260629_220718.xlsx",
  "sheet": "利润表",
  "periods": ["2026Q1", "2025FY", "2025Q4", "2025Q3", ...],
  "report_dates": {"2026Q1": "2026-03-30", "2025FY": "2025-03-30"},
  "metrics": [
    {
      "metric": "营业总收入",
      "unit": "百万人民币",
      "values": {"2026Q1": 247652, "2025FY": 996347, "2025Q4": 236454, ...}
    },
    {
      "metric": "营业利润",
      "unit": "百万人民币",
      "values": {"2026Q1": 76235, "2025FY": 250986, ...}
    }
  ],
  "count": 2
}

query_segments.py 输出

{
  "success": true,
  "ticker": "BABA",
  "source": "BABA_segments_20260702_174907.xlsx",
  "sheet": "分部财务数据",
  "periods": ["2026Q1", "2025Q4", "2025Q3", "2025Q2", "2025Q1", ...],
  "rows": [
    {
      "segment": "Taobao and Tmall Group",
      "level": 1,
      "parent_segment": null,
      "metric": "收入",
      "values": {"2026Q1": 122220, "2025Q4": 159347, ...}
    },
    {
      "segment": "China commerce retail",
      "level": 2,
      "parent_segment": "Taobao and Tmall Group",
      "metric": "收入",
      "values": {"2026Q1": 116280, ...}
    },
    {
      "segment": "Customer management",
      "level": 3,
      "parent_segment": "China commerce retail",
      "metric": "收入",
      "values": {"2026Q1": 73024, ...}
    }
  ],
  "count": 3
}

失败时:{"success":false,"company":"BABA","error":"..."},退出码 2。

Excel 布局如何配置

config/excel-format.json 里的所有硬编码集中管理,涉及新格式时只改 JSON:

| 节点 | 用途 | |---|---| | excelsDir | Excel 存放目录(相对 workspace) | | income.filenamePattern | 整体损益表文件名正则(含 named group market/ticker/date/time) | | income.metricColumn / unitColumn / firstPeriodColumn | 各类列在 sheet 中的位置 | | income.reportDateRow / reportDateLabel | 财报日期所在行 | | segments.filenamePattern | 分部文件名正则 | | segments.hierarchyPrefixes | 分部名的层级前缀(├─ / └─ 等) | | periodFilter.periodTypeRegex | period 列名匹配(默认 20YYFY / 20YYQx / 20YYHx) |

Agent Prompt 集成建议

[fact] 数据源里应加入本 skill:

可用工具与分工:
- financial-metrics-query skill (query_income.py)  → 结构化"事实"来源:公司整体损益(营收/毛利/营业利润/费用/YoY)
- financial-metrics-query skill (query_segments.py)→ 结构化"事实"来源:分部业务数据(分部收入/EBITA/多层级)
- retrieve_filing_kb                             → [filing-stated cause] 原文片段
- ...

优先级:本 skill 是"结构化事实"的唯一入口,覆盖全部市场且延迟毫秒级。workspace/excels/futu-financial-report / segment-financial-report 两个 skill 负责生成。