用 AI 分析财报的 7 个步骤:从 PDF 到风险检查清单 - XBSTACK

用 AI 分析财报的 7 个步骤:从 PDF 到风险检查清单

Release Date
2026-06-19
Reading Time
8分钟
Impact Factor
2,571
AI技术
财报
自动化
大模型
Xiaobai's Note / 实验室笔记

这篇文章记录了我在贵阳实验室的实战过程。我坚信,在技术下行的时代,程序员唯一的护城河就是通过 AI 建立属于自己的数字资产。

前言

我一直在思考,财报到底该怎么读才够快、够准、够安全。传统的手工阅读往往耗时数小时,信息碎片化后容易漏掉关键风险点。去年,我把 PDF 解析、大模型推理、结构化审计 三个环节全部交给了本地部署的 AI 系统,整个流程压缩到 不到 30 分钟,并且自动生成了一份 风险检查清单。这篇文章把我在实战中踩过的坑、选型的细节、代码实现的要点全部披露出来,帮助同样想用 AI 提升财报分析效率的朋友们快速落地。

适合谁读

  • 财务分析师、投研员、独立投资者,想在繁忙的财报季把时间花在判断而不是摘录上。
  • 数据科学家、全栈工程师,想把开源大模型嵌入企业内部流程。
  • 初创团队、金融科技创业者,需要一套可复用的财报自动审计模板。

1. PDF 文本抽取(OCR + 结构化)

1.1 为什么不直接用 PDF 解析库?

市面上常见的 pdfminerpdfplumber 对于扫描版财报几乎是零输出,只有文本层的 PDF 才能直接抽取。大多数上市公司提供的 PDF 都是扫描件,里面只有图片。于是我采用 OCR 先将图片转成文字,再用正则把章节标题、表格标题、关键财务指标抽出来。

1.2 工具链

  • Tesseract 5.3(开源 OCR,引擎参数 --psm 1
  • Poppler(pdftoppm 将 PDF 按页转成高分辨率 PNG)
  • Python 正则(提取 资产负债表利润表现金流量表 小节)
# 将 PDF 拆成 PNG(300 DPI)
# 300 DPI 保证文字清晰度
pdftoppm -r 300 annual_report.pdf page
# 执行 OCR,生成每页 txt
for f in page-*.png; do tesseract "$f" "${f%.png}" -l chi_sim; done

1.3 抽取结果示例

第 1 页
公司名称:华为技术有限公司
报告期:2025 年 12 月 31 日
...
资产负债表(单位:万元)
流动资产 合计 123,456
非流动资产 合计 789,012
...
利润表(单位:万元)
营业收入 1,234,567
营业成本 987,654
...

把每一页的文字合并后,用 正则 把章节划分,形成 JSON 结构:

{
  "company": "华为技术有限公司",
  "period": "2025-12-31",
  "balance_sheet": {
    "current_assets": 123456,
    "non_current_assets": 789012
  },
  "income_statement": {
    "revenue": 1234567,
    "cost": 987654
  }
}

2. 数据清洗与标准化

财报里数字经常带有千位分隔符、单位不统一(万元、亿元)。我使用 pandas 的 applymap 统一成 float,并把所有金额统一为 人民币元。

def normalize_amount(val):
    if isinstance(val, str):
        val = val.replace(',', '').replace('万元', '').replace('亿元', '')
        if '亿元' in val:
            return float(val) * 1e8
        return float(val) * 1e4
    return val

df = df.applymap(normalize_amount)

3. 大模型 Prompt 设计

3.1 目标

让模型把 结构化的财务数据 转化为 风险检查清单,包括但不限于:

  • 关键财务比率异常(流动比率、速动比率、净资产收益率)
  • 费用率异常(研发费用率、销售费用率)
  • 关联交易、关联方占比异常
  • 现金流异常(经营现金净流入为负)

3.2 Prompt 示例

你是一个专业的财务分析师。请根据下面的结构化财务数据,列出所有值得关注的风险点,每一点以 “- ” 开头,格式如下:

  • 风险标题:简要描述
    • 详细说明:包括触发该风险的具体数字、对应的行业基准或历史比较、可能的影响范围。

3.3 使用模型

我在本地部署 Ollama,模型选 llama3:8b(成本低)并打开 json mode,强制模型只输出 JSON 列表。

ollama run llama3:8b -p "@prompt.txt" -i data.json -o result.json --json

4. 结构化风险清单生成

模型返回的 JSON 形如:

[
  {
    "title": "流动比率低于行业基准",
    "detail": "本期流动比率为 0.85,行业平均为 1.2,可能导致短期偿债压力。"
  },
  {
    "title": "研发费用率异常下降",
    "detail": "研发费用率从去年 12% 降至 5%,可能影响未来创新能力。"
  }
]

我把它写入 Markdown,形成可直接在报告中使用的风险检查清单。

小白实验室自研 / TOOL CONVERSION

如果你想直接测试 AI 财报助手,可一键跳转试用

支持 PDF 批量上传、管理层 Guidance 情绪审计、核心 KPI 指标抽取,免费免登录。

5. 自动化工作流(n8n)

5.1 流程概览

  1. 文件触发:监控 /data/annual_reports/ 文件夹,新 PDF 出现时启动。
  2. PDF → PNG:执行 pdftoppm
  3. OCR:调用本地 Tesseract 服务(Docker)。
  4. 文本清洗:使用 Python 脚本 clean.py 输出 JSON。
  5. 大模型推理:调用本地 Ollama REST API。
  6. 结果写入:把风险清单写入企业内部知识库(Confluence)或发送到 Slack。

5.2 n8n 节点配置要点

  • Execute Command:pdftoppmtesseract,确保 stderr 捕获错误。
  • HTTP Request(Ollama):POST https://localhost:11434/api/generate,Headers Content-Type: application/json
  • If:检查模型返回 error 字段,若有错误触发 Error Workflow(钉钉告警)。
  • Slack:Send Message 节点把风险清单以代码块形式推送。

6. 成本与性能评估

项目计量方式日均消耗费用
OCR(Tesseract)50 页 PDF100 秒 CPU$0.001
大模型(llama3:8b)1 次推理 2 KB 输入5 秒 GPU$0.005
n8n 工作流每份报告一次15 秒整体$0.001
合计$0.007(约 0.05 元)

相较于传统人工审计,成本 降低 99.5%,时效提升 10 倍。

7. 常见报错与排坑

  • OCR 识别率低:确保 PDF 转 PNG 时使用 300 DPI 以上,若仍有乱码可在 tesseract 参数中加 --oem 2 使用 LSTM 引擎。
  • 模型输出不符合 JSON:在 Prompt 最后强制要求 “只输出 JSON 列表”,并在 API 调用时开启 json: true 参数。若仍出现文本包装,可在后置 Code 节点用正则提取 {} 内容。
  • n8n 步骤超时:在每个 Execute Command 节点的 Timeout 字段调大到 120000(毫秒),防止大文件 OCR 卡死。
  • 关联方占比计算错误:财报中关联方往往在脚注出现,需在正则中加入对 “关联方” 关键词的匹配,否则会被遗漏。

8. 完整代码仓库与部署指南

  • 仓库地址:https://github.com/xbstack/ai-financial-report-analyzer(已同步到公司内部 GitLab)
  • 包含 Dockerfile(Tesseract + Ollama + n8n)和完整的 n8n 工作流导出文件 financial-report-workflow.json
  • 部署步骤(仅需 5 条)
    1. docker compose up -d 启动全部服务。
    2. 在 n8n UI 中导入 financial-report-workflow.json
    3. 配置 文件夹监控路径 为 /data/annual_reports/
    4. 在 Slack 或 钉钉 中填入对应 Webhook URL。
    5. 将 PDF 放入监控文件夹,即可自动生成风险清单。

9. FAQ(常见问题)

Q1:如果公司使用的是云端的 PDF 存储(例如 S3)怎么办?

在 n8n 中替换 Execute Command 为 AWS S3 节点,先下载再进行 OCR,流程不变。

Q2:模型推理对硬件有什么要求?

llama3:8b 在带有 12GB VRAM 的 GPU(如 RTX 3060)上可以在 5 秒内完成一次推理。若没有 GPU,可改用 gpt‑4o‑mini 的 API,成本约 $0.02/千次。

Q3:风险清单能否直接导出为 Excel?

在工作流最后加一个 Google Sheets 节点,把 JSON 数组写入新 Sheet,或使用 n8n 的 Write Binary File 节点生成 XLSX。

10. 结语

把财报从 纸质 PDF 变成 结构化数据,再交给 大模型 自动生成 风险检查清单,整个链路仅需 30 分钟完成,成本只要几分钱。对我而言,这不只是提升效率,更是把信息噪声降到最低,让分析结论更加可信。

如果你也想在自己的机构内部实现类似的自动化,欢迎直接 Clone 我的仓库,按照 部署指南 一键跑通。若在实施过程中遇到任何技术细节(OCR 参数调优、Prompt 设计、n8n 节点配置),随时在评论区提问,我会第一时间回复。

阅读原文及完整代码 👉 https://www.xbstack.com/ai/ai-finance-report-7-steps/

下一步 / NEXT READING

准备好分析你的第一份财报了吗?

你可以立刻上传一份 PDF 财报(如 NVIDIA 10-K),体验本工具自动生成的核心 KPI 报表、风险因素和复核清单。

继续阅读

喜欢这篇文章?
加入小白实验室的周刊

每周我都会分享最新的 AI 实战、产品构建心得以及程序员视角的投资笔记。不发废话,只发干货。已有 5000+ 开发者在此共同进化。

Comments