总共28小时,整整3天半!

而且这还只是季报,如果是年报更厚。更崩溃的是,有些公司财报格式不统一,找数据像大海捞针。

我当时的想法是:这活儿能不能自动化?

一、解决方案:Python+AI自动分析流水线

先上架构图:

PDF财报 → 文本提取 → AI解析 → 结构化数据 → 自动分析 → 可视化报告
核心思路:

PDF解析:用Python提取财报文本
AI理解:用大模型读懂财报内容
数据提取:自动抓取关键财务指标
智能分析:AI生成分析结论
可视化:自动生成图表和报告
下面分享5个实战技巧。

技巧1:PDF财报文本提取

财报PDF通常有两类:

文字版PDF:可以直接复制文字
扫描版PDF:需要OCR识别
我用pymupdf处理文字版,paddleocr处理扫描版:

import fitz  # pymupdf
from paddleocr import PaddleOCR

def extract_pdf_text(pdf_path):
    """提取PDF文本,支持文字版和扫描版"""
    text = ""
  
    # 尝试直接提取文字
    doc = fitz.open(pdf_path)
    for page in doc:
        text += page.get_text()
  
    # 如果文字太少,说明是扫描版,用OCR
    if len(text) < 1000:
        print("检测到扫描版PDF,启动OCR...")
        ocr = PaddleOCR(use_angle_cls=True, lang='ch')
      
        for page_num in range(len(doc)):
            # 将页面转为图片
            pix = doc[page_num].get_pixmap(matrix=fitz.Matrix(2, 2))
            img_path = f"temp_page_{page_num}.png"
            pix.save(img_path)
          
            # OCR识别
            result = ocr.ocr(img_path, cls=True)
            for line in result[0]:
                text += line[1][0] + "\n"
  
    return text

踩坑经验:

有些财报是混合版(部分文字+部分图片),需要两种方法结合
OCR识别率约95%,关键数据建议人工复核
大文件建议分页处理,避免内存溢出

技巧2:用AI提取关键财务指标

财报里关键数据散落各处,我训练了一个提取Prompt:

import dashscope

def extract_financial_data(text, company_name):
    """用AI提取关键财务指标"""
  
    prompt = f"""
    请从以下财报文本中提取关键财务指标,以JSON格式返回:
  
    需要提取的指标:
    1. 营业收入(本期、上期、同比增幅)
    2. 净利润(本期、上期、同比增幅)
    3. 总资产
    4. 净资产
    5. 经营现金流
    6. 毛利率
    7. 净利率
    8. ROE(净资产收益率)
  
    财报文本:
    {text[:8000]}  # 限制长度,避免超出token限制
  
    请严格按以下JSON格式返回:
    {{
        "company": "公司名称",
        "revenue": {{"current": "本期营收", "previous": "上期营收", "yoy": "同比增幅"}},
        "net_profit": {{"current": "本期净利润", "previous": "上期净利润", "yoy": "同比增幅"}},
        "total_assets": "总资产",
        "net_assets": "净资产",
        "operating_cash_flow": "经营现金流",
        "gross_margin": "毛利率",
        "net_margin": "净利率",
        "roe": "ROE"
    }}
  
    注意:
    - 如果某项数据在财报中未找到,填"未披露"
    - 金额统一转换为亿元
    - 百分比保留2位小数
    """
  
    response = dashscope.Generation.call(
        model="qwen3-72b",
        messages=[{"role": "user", "content": prompt}],
        result_format="message"
    )
  
    # 解析JSON结果
    import json
    import re
  
    content = response.output.choices[0].message.content
  
    # 提取JSON部分
    json_match = re.search(r'\{.*\}', content, re.DOTALL)
    if json_match:
        return json.loads(json_match.group())
    else:
        return {"error": "解析失败", "raw": content}

实测效果:

提取准确率:约90%
处理时间:10秒/份财报
比手工快约720倍

技巧3:财务指标自动计算与对比

提取原始数据后,还需要计算衍生指标:

import pandas as pd

def calculate_metrics(data):
    """计算财务指标"""
  
    # 基础指标
    revenue = float(data['revenue']['current'].replace('亿元', ''))
    net_profit = float(data['net_profit']['current'].replace('亿元', ''))
    total_assets = float(data['total_assets'].replace('亿元', ''))
    net_assets = float(data['net_assets'].replace('亿元', ''))
  
    # 计算衍生指标
    metrics = {
        '营业收入': revenue,
        '净利润': net_profit,
        '总资产': total_assets,
        '净资产': net_assets,
        '净利润率': round(net_profit / revenue * 100, 2) if revenue > 0 else 0,
        '总资产周转率': 0,  # 需要营业收入平均余额
        '权益乘数': round(total_assets / net_assets, 2) if net_assets > 0 else 0,
        'ROE': data.get('roe', '未计算'),
        'ROA': round(net_profit / total_assets * 100, 2) if total_assets > 0 else 0,
    }
  
    return metrics
def compare_companies(companies_data):
    """多公司对比分析"""
  
    df = pd.DataFrame(companies_data)
  
    # 排序
    df_sorted = df.sort_values('净利润', ascending=False)
  
    # 行业均值
    industry_avg = {
        '平均营收': df['营业收入'].mean(),
        '平均净利润': df['净利润'].mean(),
        '平均ROE': df['ROE'].mean() if 'ROE' in df else 0,
    }
  
    return df_sorted, industry_avg

技巧4:AI自动生成分析结论

数据有了,但老板要的是分析结论。让AI来写:

def generate_analysis(data, company_name):
    """AI生成财务分析结论"""
  
    prompt = f"""
    你是一位资深财务分析师,请根据以下财务数据,撰写一段专业的分析结论(200字左右):
  
    公司名称:{company_name}
  
    财务数据:
    {json.dumps(data, ensure_ascii=False, indent=2)}
  
    分析要点:
    1. 营收增长情况
    2. 盈利能力分析
    3. 与行业对比
    4. 风险提示
  
    要求:
    - 专业但不晦涩
    - 有数据支撑
    - 指出亮点和风险
    - 适合向老板汇报
    """
  
    response = dashscope.Generation.call(
        model="qwen3-72b",
        messages=[{"role": "user", "content": prompt}],
        result_format="message"
    )
  
    return response.output.choices[0].message.content

生成示例:

该公司2024年营收同比增长15.3%,净利润增长22.1%,盈利能力持续改善。ROE达到18.5%,高于行业平均水平(12.3%),资本回报能力较强。但需关注应收账款增长较快(同比+35%),现金流压力有所上升。建议重点关注回款情况。

技巧5:自动生成可视化报告

最后一步,把数据变成图表:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示
matplotlib.rcParams['axes.unicode_minus'] = False

def generate_report(company_data, output_path="report.png"):
    """生成可视化报告"""
  
    fig, axes = plt.subplots(2, 2, figsize=(14, 10))
    fig.suptitle(f"{company_data['company']} 财务分析报告", fontsize=16)
  
    # 1. 营收与利润趋势
    ax1 = axes[0, 0]
    years = ['2022', '2023', '2024']
    revenues = [company_data.get(f'revenue_{y}', 0) for y in years]
    profits = [company_data.get(f'profit_{y}', 0) for y in years]
  
    ax1.plot(years, revenues, marker='o', label='营业收入', linewidth=2)
    ax1.plot(years, profits, marker='s', label='净利润', linewidth=2)
    ax1.set_title('营收与利润趋势')
    ax1.legend()
    ax1.grid(True, alpha=0.3)
  
    # 2. 财务指标雷达图
    ax2 = axes[0, 1]
    categories = ['ROE', '净利率', '周转率', '杠杆', '成长']
    values = [85, 70, 60, 50, 90]  # 示例数据
  
    angles = [n / float(len(categories)) * 2 * 3.14159 for n in range(len(categories))]
    values += values[:1]
    angles += angles[:1]
  
    ax2 = plt.subplot(2, 2, 2, projection='polar')
    ax2.plot(angles, values, 'o-', linewidth=2)
    ax2.fill(angles, values, alpha=0.25)
    ax2.set_xticks(angles[:-1])
    ax2.set_xticklabels(categories)
    ax2.set_title('财务健康度')
  
    # 3. 收入构成饼图
    ax3 = axes[1, 0]
    segments = ['主营业务', '其他业务', '投资收益']
    sizes = [80, 15, 5]
    ax3.pie(sizes, labels=segments, autopct='%1.1f%%', startangle=90)
    ax3.set_title('收入构成')
  
    # 4. 关键指标对比
    ax4 = axes[1, 1]
    metrics = ['营收(亿)', '净利润(亿)', 'ROE(%)', '毛利率(%)']
    values = [120.5, 15.2, 18.5, 35.2]
    colors = ['#2ecc71', '#3498db', '#e74c3c', '#f39c12']
  
    bars = ax4.bar(metrics, values, color=colors)
    ax4.set_title('关键指标')
  
    # 添加数值标签
    for bar in bars:
        height = bar.get_height()
        ax4.text(bar.get_x() + bar.get_width()/2., height,
                f'{height}',
                ha='center', va='bottom')
  
    plt.tight_layout()
    plt.savefig(output_path, dpi=150, bbox_inches='tight')
    print(f"报告已保存: {output_path}")

完整流水线整合
把上面5个技巧串起来:

def analyze_financial_report(pdf_path, company_name):
    """财报分析完整流程"""
  
    print(f"开始分析 {company_name} 的财报...")
  
    # 1. 提取PDF文本
    print("1/5 提取PDF文本...")
    text = extract_pdf_text(pdf_path)
  
    # 2. AI提取关键数据
    print("2/5 AI提取财务指标...")
    raw_data = extract_financial_data(text, company_name)
  
    # 3. 计算衍生指标
    print("3/5 计算财务指标...")
    metrics = calculate_metrics(raw_data)
  
    # 4. AI生成分析结论
    print("4/5 生成分析结论...")
    analysis = generate_analysis(metrics, company_name)
  
    # 5. 生成可视化报告
    print("5/5 生成可视化报告...")
    generate_report(metrics, f"{company_name}_report.png")
  
    return {
        "company": company_name,
        "metrics": metrics,
        "analysis": analysis,
        "report_path": f"{company_name}_report.png"
    }
# 批量分析
if __name__ == "__main__":
    reports = [
        ("company_a.pdf", "公司A"),
        ("company_b.pdf", "公司B"),
        ("company_c.pdf", "公司C"),
    ]
  
    results = []
    for pdf, name in reports:
        result = analyze_financial_report(pdf, name)
        results.append(result)
  
    # 生成对比报告
    df, industry_avg = compare_companies([r['metrics'] for r in results])
    print("\n行业对比:")
    print(df)
    print(f"\n行业均值: {industry_avg}")

效果对比

在这里插入图片描述

原来分析10家公司需要40小时(5天),现在只要3分钟。

踩坑总结
1、PDF格式不统一:不同公司财报排版差异大,需要写多个解析模板
2、AI提取有误差:关键数据务必人工复核,特别是正负号和小数点
3、OCR识别率:扫描版财报识别率约95%,复杂表格容易出错
4、API成本:大量调用大模型API费用不低,建议本地部署小模型
5、数据安全:财报涉及敏感信息,注意数据脱敏和权限控制

后续优化方向
1、接入更多数据源:财报只是基础,可以接入舆情、行业数据
2、预测能力:用历史数据训练预测模型,预测下季度业绩
3、异常检测:自动识别财务造假信号
4、报告自动化:直接生成PPT,一键汇报

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐