财务报表分析¶
项目背景与目标¶
上市公司财务报表分析是投研、信贷、风控等场景的基础工作,但传统人工分析面临三大痛点:报表数据量大(一份年报数百页)、勾稽关系复杂、横向纵向对比耗时。借助 AI Agent 能力,可以实现报表数据自动提取、关键指标计算、异常识别与结构化分析报告生成,将单家公司分析时间从数小时压缩到分钟级。
本项目目标是构建一个财务报表自动分析 Agent,输入为上市公司定期报告(PDF/HTML/Excel),输出为结构化指标表 + 多维度分析报告 + 风险提示。系统须保证数据准确性(与原始报表可追溯)、分析方法可解释、报告格式可定制。
需求分析¶
输入形态:年报/季报 PDF、巨潮资讯网 HTML、XBRL 实例文档、Excel 财务数据 输出内容: 1. 三大报表结构化数据(资产负债表、利润表、现金流量表) 2. 核心指标自动计算:偿债能力、盈利能力、运营能力、成长能力四类约 30 项 3. 同比/环比/行业对比分析 4. 异常项识别与解释(如应收激增、存货周转变慢、现金流与利润背离) 5. 结构化分析报告(Markdown / Word / PDF)
用户场景:分析师批量处理、信贷员快速尽调、散户自查、教学演示。
技术选型说明¶
| 模块 | 技术方案 | 选型理由 |
|---|---|---|
| PDF 解析 | PyMuPDF + LayoutLMv3 | 处理复杂表格与多栏版面 |
| 信息提取 | LLM + Function Calling | 灵活适配不同公司报表格式 |
| 指标计算 | Pandas + 公式引擎 | 精确数值计算,避免 LLM 算错 |
| 异常检测 | 规则 + 同比环比统计 | 可解释,符合审计要求 |
| 报告生成 | LangGraph + 模板引擎 | 多章节并行生成 |
| 向量库 | Chroma | 存储历史报表做同行对比 |
| 后端 | FastAPI | 异步处理大批量报表 |
| 任务队列 | Celery + Redis | 长任务异步化 |
架构设计¶
flowchart LR
IN[报表输入 PDF/HTML/XBRL] --> PARSE[解析层]
PARSE --> TXT[文本块]
PARSE --> TAB[表格结构]
TXT --> EXT[LLM 信息提取]
TAB --> EXT
EXT --> STD[标准化数据模型]
STD --> CALC[指标计算引擎]
STD --> VEC[(历史报表向量库)]
CALC --> ANOM[异常检测]
ANOM --> REP[报告生成 Agent]
VEC --> REP
REP --> OUT[分析报告]
CALC --> DB[(财务数据库)]
QUEUE[Celery 任务队列] --> PARSE
关键模块实现思路¶
模块1:报表解析与表格还原¶
PDF 解析是最大难点。采用"版面分析 + 表格重建"两阶段:先用 LayoutLMv3 识别页面区域(标题/段落/表格/页眉页脚),再对表格区域用线框与单元格坐标还原行列结构。无框表格需借助对齐位置与字体特征推断边界。
对 HTML 与 XBRL 输入可直接走结构化解析,无需 OCR。建议优先引导用户使用 XBRL 或交易所结构化数据,PDF 仅作兜底。
模块2:科目映射与标准化¶
不同公司报表科目命名差异大(如"应收账款" vs "应收款项"),需建立科目映射字典。LLM 在提取时输出标准科目名,再由规则引擎做二次校验:勾稽关系(资产=负债+权益、净利润流入现金流量表)必须成立,否则标记需人工复核。
def validate_articulation(bs: dict, pl: dict, cf: dict) -> list:
issues = []
if abs(bs["资产总计"] - bs["负债合计"] - bs["所有者权益合计"]) > 0.01:
issues.append("资产负债表不平")
if abs(pl["净利润"] - cf["经营活动净现金流"]) / pl["净利润"] > 0.5:
issues.append("利润与现金流背离过大")
return issues
模块3:指标计算引擎¶
指标计算必须用确定性的 Pandas/公式引擎完成,不能交给 LLM 计算(数值幻觉风险高)。预置 30+ 指标公式:流动比率、速动比率、资产负债率、ROE、ROIC、毛利率、净利率、存货周转率、营收增长率等。支持自定义公式扩展。
同行对比时从向量库检索同行业可比公司近 3 年数据,计算行业分位数。
模块4:异常识别与解释¶
异常识别采用"规则 + 统计"双轨:规则层检查显性风险(如应收账款增速 > 营收增速、商誉占净资产 > 30%、经营现金流连续 2 年为负);统计层计算各指标同比变化的 Z-Score,超出 ±2σ 标记为异常。
LLM 对每个异常生成解释:是什么、为什么可能发生、对投资者的含义、建议关注事项。解释须引用具体数值,禁止编造。
核心流程详解¶
单公司分析流程: 1. 用户上传报表 → 入队 Celery 任务 2. 解析层提取文本与表格 → LLM 抽取科目数据 3. 勾稽校验 → 通过则标准化入库,失败则标红待复核 4. 指标引擎计算 30+ 指标 → 与历史/同行对比 5. 异常检测 → LLM 生成异常解释 6. 报告生成 Agent 并行产出各章节 → 合并为最终报告 7. 报告附带数据溯源(每项指标标注原始报表页码)
部署与优化建议¶
- 解析缓存:同一报表重复解析命中缓存,避免重复 LLM 调用
- 模型分级:科目提取用 GPT-4o 保证准确率,报告润色用 mini 降本
- 批量处理:支持上传 ZIP 包批量分析,并行度受 LLM 配额限制
- 校验护栏:所有 LLM 输出的数值必须回写校验,与原始报表比对
- 版本管理:报表数据按披露日期版本化,支持回溯历史快照
常见问题与解决方案¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| PDF 表格错位 | 复杂合并单元格 | LayoutLMv3 + 人工规则修正 |
| 科目漏提取 | 罕见科目名 | 映射字典持续扩充 + 兜底关键词匹配 |
| LLM 数值错误 | 模型计算幻觉 | 数值一律走公式引擎,LLM 仅做文字 |
| 行业对比失真 | 可比公司选取不当 | 用申万行业分类 + 营收规模过滤 |
扩展方向¶
- 接入财报附注深度解读(如关联交易、或有事项)
- 增加财务舞弊识别模型(Benford 定律、M-Score)
- 支持跨国报表分析(IFRS 与中国准则差异调整)
- 输出可视化看板,关键指标趋势图