📑 本文目录
LLMRAG基本面分析AI Agent自动化研报论文复现量化

用LLM和RAG自动读财报写研报:从arxiv论文到A股落地的完整复现


引子:你还在手动读财报?

每个做过基本面分析的投资者都经历过这个痛苦循环:财报季一到,几百页PDF堆积如山。营收、利润、现金流、附注……一个公司啃完可能要大半天,九个公司?一周都读不完。

但如果有一种方法,能自动抓取财报数据 + 宏观指标 + 新闻流,喂给大语言模型,让它每天早上给你推送一份结构化的投资简报呢?

2026年7月10日,波兰AGH大学的Bartosz Ziółko团队在arxiv发表了一篇论文,标题是 “Augmenting Fundamental Analysis with Large Language Models: A RAG-Based System for Generating Investor Briefs”(arxiv: 2607.09121)。他们做的事情正是上述设想:用GPT-4o + RAG架构 + SEC EDGAR数据,在4周时间内为9家公司自动生成投资简报,由9位个人投资者实测评估实用性。

这篇论文的独特价值在于:它不是又一个”ChatGPT预测股价”的研究,而是端到端的完整工作流——从异构数据采集到LLM推理再到用户评估,每一个环节都有明确的工程实现。

本文将做三件事:(1) 深度拆解论文核心架构;(2) 分析其设计决策的优劣;(3) 给出移植到A股的完整方案——用akshare替代SEC数据源、Chroma向量库本地零成本、GLM-5.2替代GPT-4o。


论文核心拆解:RAG驱动的投资简报管道

系统全景架构

论文的系统可以用一句话概括:将多源异构数据通过RAG喂给GPT-4o,生成四维结构化投资简报。

┌─────────────────────────────────────────────────────┐
│                   数据采集层                          │
│  ┌──────────┐  ┌──────────┐  ┌──────────────────┐   │
│  │ SEC EDGAR│  │ 宏观数据  │  │  新闻文章流       │   │
│  │ 10-K/10-Q│  │GDP/CPI/PMI│  │(PRNewswire/Yahoo)│   │
│  └────┬─────┘  └────┬─────┘  └───────┬──────────┘   │
│       │             │                │               │
│       ▼             ▼                ▼               │
│  ┌──────────────────────────────────────────────┐   │
│  │          数据预处理 + 结构化                   │   │
│  │  · 财报章节切分(业务/风险/财务/管理层讨论)    │   │
│  │  · 宏观指标时间序列对齐                        │   │
│  │  · 新闻按公司过滤 + 重要性排序                 │   │
│  └──────────────────┬───────────────────────────┘   │
│                     │                               │
│                     ▼                               │
│  ┌──────────────────────────────────────────────┐   │
│  │          RAG + GPT-4o 推理引擎                │   │
│  │  · Kitchin周期知识库(经济阶段判断)           │   │
│  │  · 启发式模板(营收增长> X% → "财务健康")     │   │
│  │  · 新闻聚类 (K-Means + LanceDB)              │   │
│  └──────────────────┬───────────────────────────┘   │
│                     │                               │
│                     ▼                               │
│  ┌──────────────────────────────────────────────┐   │
│  │          四维投资简报输出                      │   │
│  │  1. 买入理由(3-5条)                         │   │
│  │  2. 卖出理由(3-5条)                         │   │
│  │  3. 宏观经济阶段分析                           │   │
│  │  4. 总结与建议                                │   │
│  └──────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘

三个核心设计决策

论文中有三个设计决策特别值得注意,它们是整个系统能产生有价值输出的关键:

决策1:Kitchin周期知识库作为”分析锚点”

论文没有让GPT-4o”自由发挥”分析宏观环境,而是构建了一个基于Kitchin短周期(约40个月商业周期)的投资者知识库。系统首先根据PMI等指标判断当前处于周期的哪个阶段(扩张/放缓/衰退/复苏),然后根据周期阶段来评估公司前景。

例如,当PMI低于50时,系统判定为”经济放缓期”,然后指出在该阶段”能源、房地产、必需消费品和公用事业是最佳投资标的,而可选消费和科技板块可能表现不佳”。这是一个重要的约束——它防止了LLM在没有框架的情况下生成含糊的宏观评论。

决策2:启发式模板约束定性判断

论文明确指出,像”财务状况强劲”这样的定性标签不是由LLM自由判断的,而是由预定义的启发式模板驱动:

“如果营收增长大于X%且债务股权比小于Y%,则描述财务状况为’strong’”

这个设计让分析过程透明、可重复、不受LLM潜在偏见影响。这是工程化的关键思维——把领域专家的判断规则编码为约束条件,LLM只负责执行和叙述。

决策3:新闻排序框架而非简单情感分析

系统没有对新闻做简单的正面/负面分类,而是构建了一个8级新闻重要性排序框架:

优先级信息来源
1公司季报/年报
2央行决策与公告
3宏观经济数据(通胀、就业、经济活动)
4重大公司事件(并购、重组、高管变动)
5内部人交易和大型机构投资者操作
6竞争对手或同行业其他公司的报告
7新闻文章(关注情感、新颖性、时效性)
8分析师报告(评级和目标价)

这个排序框架在实际运行中展现了令人印象深刻的能力。以NVIDIA为例,系统在11月18-19日处理了13条新闻,正确地将”估值里程碑预测”和”Blackwell芯片过热风险”排在最前面,而把分析师Jim Cramer的评论和三星供应链新闻排在后面。


五个典型案例:系统能力全景展示

论文在4周运行期间生成了大量投资简报,精选了5个案例展示系统的不同能力维度。以下逐一拆解:

案例1:Tesla — 跨域综合能力

系统在分析Tesla时展现了最核心的能力:将异构数据源综合成连贯的投资论点。

它正确从10-Q报告中提取了营收251.8亿美元、P/E 76.73等数字,从新闻中识别出内部人卖出(Vaibhav Taneja、Kimbal Musk),然后将其与宏观环境(PMI低于50 → 经济放缓 → 不利可选消费和科技板块)综合到一起。

生成的简报包含明确的”买入理由”(强劲财务状况、能源业务增长52%、技术创新)和”卖出理由”(P/E 76.73高估、监管不确定性、宏观放缓、内部人卖出),结构清晰且事实准确。

案例2:NVIDIA — 信息过载下的新闻排序

这是对系统能力的极限测试——13条新闻在一天内涌来,包含估值预测、芯片过热风险、财报前瞻、名人观点(孙正义看多、Druckenmiller清仓)、竞争对手动态(AMD裁员)。

系统的表现:

  • 正确识别了三个主导叙事:前瞻性估值潜力、Blackwell技术风险、即将到来的财报事件
  • 把负面新闻(芯片过热)排在第2位,紧跟正面估值新闻之后——展现了识别风险的敏锐度
  • 按逻辑层级排列:公司核心信息 > 知名投资者评论 > 生态系统新闻

论文指出的缺陷:模型在总结Druckenmiller和Laffont卖出NVIDIA的动机时,只捕捉到了”卖出”行为,但没有充分区分”因为公司不好”而卖出和”因为估值太高”而卖出。这个细微差别对投资决策至关重要。

案例3:NVIDIA/Amazon/Tesla — 地缘政治风险量化

系统从Q3财报中自动提取了各公司对中国和台湾市场的营收敞口,并计算了潜在损失比例:

公司中国+台湾营收占比潜在风险
NVIDIA29.44%$268.4亿 / 总$911.66亿
Tesla约20.7%$148.93亿 / 总$719.83亿
Amazon23%(国际部门)精确数据未披露

这个案例展示了RAG的关键优势:LLM不是凭空”猜”风险,而是从财报原文中提取具体数字进行计算。

案例4:Energy Fuels (UUUU) — 小盘股深度分析

对于这家铀矿公司,系统展现了更高级的能力:基于提取数据进行prompt引导的财务计算。

系统正确提取了现金4,746万美元、市值12亿美元、季度亏损1,200万美元,然后计算出”现金/市值比约4%“和”按当前亏损速度可存活约4个季度”的现金消耗跑道。这超越了简单的文本摘要,进入了定量分析领域。

案例5:韩国戒严令 — 黑天鹅事件应对

2024年12月3日韩国戒严令是一个完全不可预测的事件。系统为三家相关公司生成了风险评估:

  • Coinbase:识别了监管风险升级、声誉影响、合规成本增加
  • NVIDIA:分析了供应链中断风险(韩国供应商)和投资者情绪变化
  • Lululemon:最精彩的案例——系统从财报中提取了韩国门店数据(全球721家中的19家),计算出韩国市场仅占门店总数的2.64%,因此影响有限

这种”根据公司具体业务特征进行差异化风险分析”的能力,是传统模板化研报无法实现的。


9位投资者实测反馈

论文最大的亮点不在于技术实现,而在于真实的用户评估。4周后对9位参与者进行了结构化问卷调查:

正面反馈

  • 核心价值是聚合和综合大量异构信息的能力
  • 显著节省了数据收集时间,让投资者可以专注解读和决策
  • 动态、事件驱动的日报模式特别受欢迎

建设性批评

  • 分析深度需要加强——特别是大盘股(如Amazon)的定量预测不够细致
  • 用户希望自定义推送频率和内容——“我想知道监测多久推送一次?”
  • 缺少回测验证——系统被设计为简报生成器和顾问,不是投资决策系统,因此没有量化评估简报对实际投资收益的影响

论文承认的局限

  • 9人×9公司×4周的样本量只能作为方向性验证,不具统计显著性
  • 评估的是”感知效用”而非”投资表现”——这一点非常诚实

从SEC到A股:完整移植方案

论文用的是美股(SEC EDGAR + GPT-4o),如何移植到A股?以下是端到端的替代方案。

技术栈替换映射

论文组件美股原始方案A股替代方案替代理由
财报数据源SEC EDGAR 10-K/10-Qakshare stock_financial_report_sinaA股财报标准化接口
业绩快报SEC Form 8-Kakshare stock_ycj_em东方财富业绩快报
宏观数据GDP/CPI/PMI(FRED)akshare macro_china_* 系列中国宏观数据全套
新闻流PRNewswire/Yahoo Financeakshare stock_news_em东方财富新闻接口
LLM模型GPT-4o (OpenAI API)GLM-5.2 (本地/智谱API)MIT开源,1M上下文,零成本
向量数据库LanceDBChroma本地零依赖,Python原生
聚类算法K-Means + LanceDBK-Means + scikit-learn标准库即可
周期知识库Kitchin周期(美国-centric)中国库存周期 + 基钦周期中国宏观叙事框架

A股版RAG管道代码

以下是一个可运行的简化版管道,以7月14日涨幅前10中的今天国际(300532)为例:

import akshare as ak
import chromadb
from datetime import datetime, timedelta

# ===== 第1步:多源数据采集 =====

def fetch_a_share_data(stock_code: str, stock_name: str):
    """采集A股财报 + 业绩快报 + 新闻"""

    # 1. 财务报告(对应论文的SEC 10-K/10-Q)
    try:
        financial = ak.stock_financial_report_sina(
            stock=f"sh{stock_code}" if stock_code.startswith("6") else f"sz{stock_code}",
            symbol="资产负债表"
        )
        latest_report = financial.head(4).to_dict('records')  # 最近4个季度
    except Exception as e:
        latest_report = []
        print(f"财报获取失败: {e}")

    # 2. 业绩快报(对应论文的Form 8-K)
    try:
        ycj = ak.stock_ycj_em(date="20260930")  # 最新季报
        stock_ycj = ycj[ycj['股票代码'] == stock_code].to_dict('records')
    except Exception:
        stock_ycj = []

    # 3. 个股新闻(对应论文的PRNewswire)
    try:
        news = ak.stock_news_em(symbol=stock_code)
        recent_news = news.head(20)[['标题', '内容', '发布时间']].to_dict('records')
    except Exception:
        recent_news = []

    # 4. 宏观数据(对应论文的GDP/CPI/PMI)
    try:
        cpi = ak.macro_china_cpi_yearly()  # CPI同比
        pmi = ak.macro_china_pmi()         # 制造业PMI
        macro = {"cpi_latest": cpi.iloc[-1].to_dict(),
                 "pmi_latest": pmi.iloc[-1].to_dict()}
    except Exception:
        macro = {}

    return {
        "financial": latest_report,
        "earnings_preview": stock_ycj,
        "news": recent_news,
        "macro": macro
    }


# ===== 第2步:RAG文档构建与向量化 =====

def build_rag_index(data: dict, stock_name: str):
    """将多源数据构造成RAG可检索的向量库"""
    client = chromadb.PersistentClient(path="./chroma_db")
    collection = client.get_or_create_collection(
        name=f"stock_brief_{stock_name}",
        metadata={"hnsw:space": "cosine"}
    )

    doc_id = 0
    documents, metadatas, ids = [], [], []

    # 财报数据 → 按章节切分
    for report in data.get("financial", []):
        for key, value in report.items():
            if value and str(value).strip():
                documents.append(f"{stock_name} {key}: {value}")
                metadatas.append({"source": "financial_report", "field": key})
                ids.append(f"fin_{doc_id}")
                doc_id += 1

    # 新闻数据 → 每条单独索引
    for i, news in enumerate(data.get("news", [])):
        content = f"{news.get('标题', '')} {news.get('内容', '')[:500]}"
        if content.strip():
            documents.append(content)
            metadatas.append({"source": "news", "date": news.get('发布时间', '')})
            ids.append(f"news_{i}")

    # 宏观数据 → 作为一个综合文档
    if data.get("macro"):
        macro_text = f"宏观经济数据: {data['macro']}"
        documents.append(macro_text)
        metadatas.append({"source": "macro"})
        ids.append("macro_0")

    if documents:
        collection.add(documents=documents, metadatas=metadatas, ids=ids)

    return collection


# ===== 第3步:投资简报生成(Prompt工程核心) =====

BRIEF_PROMPT_TEMPLATE = """你是一位专业的A股投资分析师。请基于以下检索到的数据,
{stock_name}({stock_code})生成一份结构化投资简报。

## 检索到的关键数据:
{retrieved_context}

## 中国宏观周期判断框架(参考基钦周期约40个月):
- 制造业PMI大于50:扩张期 → 利好成长股、周期股
- 制造业PMI小于50且趋势下行:放缓期 → 利好防御板块(公用事业、必需消费、医药)
- 制造业PMI触底回升:复苏期 → 利好早周期(可选消费、建材、化工)

## 输出要求(严格按照以下结构):

### 买入理由(3-5条,每条必须有具体数据支撑)
### 卖出/风险因素(3-5条,必须包含估值数据和潜在利空)
### 宏观经济阶段判断(基于PMI等数据,给出当前周期阶段及对该股的影响)
### 总结(一段话,平衡多空观点)

## 重要约束:
- 所有数字必须来自上方检索数据,不得编造
- 如果数据不足以支撑某个结论,明确说"数据不足"
- 定性判断(如"财务健康")必须有量化标准:如"资产负债率小于60%且营收增长大于10%"
"""

def generate_brief(collection, stock_code: str, stock_name: str, llm_client):
    """检索相关文档 + LLM生成简报"""
    # 检索各维度数据
    queries = [
        f"{stock_name} 营收 利润 资产负债",
        f"{stock_name} 估值 PE PB 市值",
        f"{stock_name} 新闻 利好 利空",
        "宏观经济 PMI CPI 周期"
    ]

    all_context = []
    for query in queries:
        results = collection.query(query_texts=[query], n_results=5)
        for doc in results['documents'][0]:
            all_context.append(doc)

    retrieved_context = "\n---\n".join(all_context[:20])  # 控制token量

    prompt = BRIEF_PROMPT_TEMPLATE.format(
        stock_name=stock_name,
        stock_code=stock_code,
        retrieved_context=retrieved_context
    )

    # GLM-5.2推理
    response = llm_client.chat.completions.create(
        model="glm-5.2",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=2000,
        temperature=0.3  # 低温度保证事实性
    )

    return response.choices[0].message.content

成本对比:美股方案 vs A股方案

成本项论文原始方案(美股)A股移植方案节省
LLM推理(月度)GPT-4o API约$200-500/月GLM-5.2本地部署 $0100%
数据源SEC EDGAR免费 + 新闻API付费akshare全免费100%
向量库LanceDB(云托管)Chroma(本地文件)100%
总月度成本约$250-600约$0(电费除外)-

实践启示:从论文到工程的五个关键教训

教训1:RAG的核心不是检索,是Prompt约束

论文最大的工程智慧在于用启发式模板和周期知识库来约束LLM的行为。如果没有”PMI低于50 → 放缓期 → 不利科技板块”这样的规则,LLM会生成看起来合理但缺乏分析框架的含糊文本。

教训2:新闻排序比新闻摘要重要得多

论文的8级新闻排序框架是核心差异化能力。在A股移植时,可以调整为:

优先级A股信息源
1定期报告(年报/季报/业绩快报)
2央行货币政策(LPR/MLF/降准)
3产业政策(发改委/工信部/证监会)
4重大公司事件(并购/重组/股权变更)
5龙虎榜/大宗交易/股东增减持
6同行业可比公司动态
7财经媒体新闻
8券商研报评级

教训3:定量计算需要prompt引导,不能依赖LLM自主判断

论文中Energy Fuels的”现金消耗跑道”案例表明,LLM可以执行定量计算(现金/亏损=存活季度数),但前提是在prompt中明确告诉它要做什么计算。在A股移植中,可以在prompt中加入:“请计算该公司的资产负债率、流动比率、毛利率,并与行业均值比较”。

教训4:用户评估比学术指标重要

论文选择由9位真实投资者评估而非用ROUGE/BLEU等NLP指标,这是正确的选择。一份”准确率高”的摘要如果对投资决策没有帮助,就是无用的。在A股落地时,建议同样邀请2-3位实际做A股投资的人评估简报的实用性。

教训5:系统定位是”顾问”不是”决策者”

论文非常明确地指出系统是”简报生成器和顾问”,不是”投资决策系统”。这个定位至关重要——它既管理了用户预期,也规避了”AI推荐导致亏损”的法律风险。在A股落地时同样应该坚持这个定位。


局限性分析

论文自身的局限

  1. 样本量不足:9人×9公司×4周的方向性验证,无法统计显著
  2. 缺少投资收益回测:评估的是”感知效用”而非”投资表现”——如果简报建议买入的股票实际跑输市场呢?论文没有回答这个问题
  3. 预处理依赖人工:内部人交易数据(SEC Form 4)是人工预处理后才喂给LLM的,不是全自动
  4. token限制:NVIDIA案例中,新闻量超出GPT-4o上下文窗口,需要分两步处理(先摘要再排序)
  5. 新闻源偏向英文:数据完全基于美国信息生态,无法直接验证中文新闻源的效果

实践者的额外质疑

  1. 周期框架的时效性:Kitchin周期(约40个月)是基于20世纪初美国经济的观察,在A股是否适用?中国经济的政策驱动特征远强于美国,简单的周期框架可能不够
  2. LLM幻觉的残余风险:即使有RAG约束,GPT-4o仍然可能在数字提取时出错。论文的Tesla案例中,虽然营收和P/E正确,但一些定性描述(如”强劲的财务状况”)可能受到训练数据中关于Tesla的正面叙事的影响
  3. 新闻源质量假设:论文隐含假设新闻文章包含有价值的信息。但A股的许多新闻是重复转载、公关稿或低质量评论,需要更强的噪声过滤
  4. 成本被低估:论文没有报告4周运行的总API成本。对于9家公司×28天×每天多次推理,GPT-4o的成本可能相当可观

工程化落地路径

对于想实际构建A股版RAG投资简报系统的读者,建议分三个阶段:

阶段1:最小可行产品(1周)

  • 数据源:akshare stock_financial_report_sina + stock_news_em
  • 向量库:Chroma本地(零成本)
  • LLM:GLM-5.2(智谱API或本地部署)
  • 输出:markdown格式投资简报,手动推送

阶段2:自动化管道(2-4周)

  • 添加宏观数据自动采集(PMI/CPI/M2)
  • 加入DuckDB存储历史数据,支持时间序列对比
  • cron定时任务:每日盘前6:30自动生成简报 → 飞书推送
  • 新闻排序框架实现

阶段3:高级功能(1-2月)

  • K-Means新闻聚类(识别同一事件的多角度叙事)
  • Prompt引导的定量计算模块
  • 多公司横向对比(同行业PE/PB排名)
  • 用户反馈收集管道(评级1-5星 + 评论)

总结

这篇论文的最大贡献不是技术创新——RAG和LLM都不是新概念——而是完整端到端工作流的验证和用户评估。它证明了”LLM + RAG + 结构化Prompt约束”这个组合可以产生对个人投资者有实际价值的投资简报。

关键洞察是:系统的价值不在于LLM有多聪明,而在于如何用领域知识(周期框架、启发式规则、新闻排序体系)来约束LLM的行为。一个被良好约束的GPT-4o比一个自由发挥的GPT-5更有用。

对于A股实践者来说,这篇论文提供了一个清晰的工程蓝图。核心挑战不在于技术实现(akshare + Chroma + GLM-5.2足够了),而在于构建适合中国市场的分析框架——如何定义A股的周期阶段、如何排序A股的信息源、如何处理A股特有的数据质量问题。


论文信息

项目内容
标题Augmenting Fundamental Analysis with Large Language Models: A RAG-Based System for Generating Investor Briefs
作者Bartosz Ziółko, Kacper Dobrzeniewski
机构AGH University of Krakow, Poland(克拉科夫医科大学计算机科学系)
arXiv2607.09121
发布日期2026-07-10
关键词NLP in Finance, LLM, RAG, Investor Decision Support, AI in Investment
JEL分类G11(投资组合选择), G14(信息与市场效率), G17(金融预测), C45(神经网络)

相关阅读

💬 评论