📑 本文目录
用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财报中自动提取了各公司对中国和台湾市场的营收敞口,并计算了潜在损失比例:
| 公司 | 中国+台湾营收占比 | 潜在风险 |
|---|---|---|
| NVIDIA | 29.44% | $268.4亿 / 总$911.66亿 |
| Tesla | 约20.7% | $148.93亿 / 总$719.83亿 |
| Amazon | 23%(国际部门) | 精确数据未披露 |
这个案例展示了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-Q | akshare stock_financial_report_sina | A股财报标准化接口 |
| 业绩快报 | SEC Form 8-K | akshare stock_ycj_em | 东方财富业绩快报 |
| 宏观数据 | GDP/CPI/PMI(FRED) | akshare macro_china_* 系列 | 中国宏观数据全套 |
| 新闻流 | PRNewswire/Yahoo Finance | akshare stock_news_em | 东方财富新闻接口 |
| LLM模型 | GPT-4o (OpenAI API) | GLM-5.2 (本地/智谱API) | MIT开源,1M上下文,零成本 |
| 向量数据库 | LanceDB | Chroma | 本地零依赖,Python原生 |
| 聚类算法 | K-Means + LanceDB | K-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本地部署 $0 | 100% |
| 数据源 | 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股落地时同样应该坚持这个定位。
局限性分析
论文自身的局限
- 样本量不足:9人×9公司×4周的方向性验证,无法统计显著
- 缺少投资收益回测:评估的是”感知效用”而非”投资表现”——如果简报建议买入的股票实际跑输市场呢?论文没有回答这个问题
- 预处理依赖人工:内部人交易数据(SEC Form 4)是人工预处理后才喂给LLM的,不是全自动
- token限制:NVIDIA案例中,新闻量超出GPT-4o上下文窗口,需要分两步处理(先摘要再排序)
- 新闻源偏向英文:数据完全基于美国信息生态,无法直接验证中文新闻源的效果
实践者的额外质疑
- 周期框架的时效性:Kitchin周期(约40个月)是基于20世纪初美国经济的观察,在A股是否适用?中国经济的政策驱动特征远强于美国,简单的周期框架可能不够
- LLM幻觉的残余风险:即使有RAG约束,GPT-4o仍然可能在数字提取时出错。论文的Tesla案例中,虽然营收和P/E正确,但一些定性描述(如”强劲的财务状况”)可能受到训练数据中关于Tesla的正面叙事的影响
- 新闻源质量假设:论文隐含假设新闻文章包含有价值的信息。但A股的许多新闻是重复转载、公关稿或低质量评论,需要更强的噪声过滤
- 成本被低估:论文没有报告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(克拉科夫医科大学计算机科学系) |
| arXiv | 2607.09121 |
| 发布日期 | 2026-07-10 |
| 关键词 | NLP in Finance, LLM, RAG, Investor Decision Support, AI in Investment |
| JEL分类 | G11(投资组合选择), G14(信息与市场效率), G17(金融预测), C45(神经网络) |
相关阅读
- LLM Agent遇上量化交易:ICLR 2026产业落地全景 — LLM+量化的学术全景,本文是其中一个方向的深度展开
- 77篇LLM交易论文审计:可复现性危机 — 呼应本文对论文局限性的分析,可复现性是核心问题
- Alpha-GPT:人机交互因子挖掘平台 — LLM+量化的另一应用方向(因子挖掘 vs 基本面分析)
- 免费量化数据源完全指南 — akshare数据源使用指南,本文A股移植方案的基础
- DuckDB A股量化数据库搭建 — 数据存储方案,自动化管道的基础设施
- AI Agent量化自动化实战框架 — Agent自动化的整体框架,投资简报系统是其中一个子模块