
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
引言
你是否想过,能不能用 Python 自动从美国证券交易委员会(SEC)拉取上市公司的财务数据,然后让 AI 帮你分析?
本文将介绍一个完整的实战案例:利用 EdgarTools 库从 SEC 获取 Alphabet Inc.(股票代码:GOOG)的损益表数据,结合 LangChain 框架和 Groq 大语言模型,搭建一套基于 RAG(检索增强生成) 的智能股票分析系统。整个过程只需要 Python 即可完成,非常适合正在学习 Python 的你。
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种让大语言模型(LLM)在回答问题时,先从外部知识库中检索相关信息,再基于检索结果生成答案的技术。简单来说,就是给 AI "开卷考试",让它带着资料来回答你的问题,从而大幅提高回答的准确性。
整体架构
这套系统的核心流程如下:
1. 使用 EdgarTools 从 SEC 拉取公司财务数据 2. 将数据转换为 LLM 友好格式,并拆分成小块文档 3. 使用 HuggingFace Embeddings 生成向量,存入 ChromaDB 向量数据库 4. 通过 LangChain 构建 RAG 检索链,使用 Groq(LLaMA 3.1 模型)进行智能问答
环境准备
在开始之前,你需要准备以下内容:
• 一个 Groq API Key(用于调用 LLM) • SEC 访问需要提供姓名和邮箱 • 使用 dotenv 包管理环境变量,避免硬编码敏感信息
主要依赖库版本参考:
langchain : 0.3.27
langchain_core : 0.3.76
langchain_groq : 0.3.8
langchain_chroma : 0.2.6
langchain_huggingface : 0.3.1
chromadb : 1.0.21
第一步:获取损益表数据
EdgarTools 提供了非常简洁的 API,只需几行代码就能获取任意上市公司的损益表:
from edgar import Company
def get_income_statement(ticker: str):
"""根据股票代码获取公司损益表"""
company = Company(ticker)
facts = company.get_facts()
return facts.income_statement()
# 指定股票代码
ticker = 'GOOG'
# 将损益表转换为 LLM 友好的上下文格式
llm_context = get_income_statement(ticker=ticker).to_llm_context()
转换后的 llm_context 是一个嵌套字典,包含了公司名称、CIK 编号、报表类型、覆盖年份以及具体财务数据等信息。以下是部分示例:
{
'company': 'Alphabet Inc.',
'cik': '1652044',
'statement_type': 'income_statement',
'periods': ['FY 2024', 'FY 2023', 'FY 2022', 'FY 2021'],
'currency': 'USD',
'scale': 'actual',
'data': {
'total_revenue_fy_2024': 350018000000.0,
'total_revenue_fy_2023': 307394000000.0,
'total_revenue_fy_2022': 282836000000.0,
'total_revenue_fy_2021': 257637000000.0,
# ... 更多字段
}
}
第二步:拆分文档并存入向量数据库
为了让 RAG 系统高效检索,我们需要把大块的 JSON 数据拆分成更小的文档块,然后生成向量嵌入并存入 ChromaDB。
from langchain_text_splitters import RecursiveJsonSplitter
from langchain_core.documents import Document
import json
# 创建 JSON 分割器,设置最大和最小块大小
json_splitter = RecursiveJsonSplitter(max_chunk_size=1000, min_chunk_size=200)
split_chunks = json_splitter.split_json(llm_context)
# 手动创建文档对象,并分配唯一 ID
documents = []
for i, chunk in enumerate(split_chunks):
# page_content 必须是字符串,同时为每个文档分配 ID
doc = Document(page_content=json.dumps(chunk), id=i)
documents.append(doc)
接下来,使用 HuggingFace 的 all-MiniLM-L6-v2 模型生成嵌入向量,并将文档持久化到 ChromaDB:
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from chromadb.config import Settings
# 初始化嵌入模型
embeddings_model = HuggingFaceEmbeddings(model_name='all-MiniLM-L6-v2')
# 创建向量数据库,数据保存在本地
vector_store = Chroma(
collection_name=COLLECTION_NAME,
embedding_function=embeddings_model,
client_settings=Settings(allow_reset=True),
persist_directory=CHROMA_DB
)
# 将文档持久化存储
vector_store.add_documents(documents)
第三步:构建 RAG 问答链
最后一步是初始化 LLM 并构建完整的 RAG 检索链:
from langchain_groq import ChatGroq
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 初始化 Groq LLM(确保已设置 GROQ_API_KEY 环境变量)
llm = ChatGroq(temperature=0.5, model_name='llama-3.1-8b-instant')
# 定义提示模板
prompt = ChatPromptTemplate.from_template(
"""
You are a helpful financial assistant. Answer the query below based on the provided context.
context: {context}
query: {input}
"""
)
# 创建文档链,将检索到的文档填充到提示中
document_chain = create_stuff_documents_chain(llm, prompt)
# 从向量数据库创建检索器
retriever = vector_store.as_retriever()
# 将检索器和文档链组合成 RAG 链
qa_chain = create_retrieval_chain(retriever, document_chain)
实战查询案例
系统搭建完成后,我们来看几个实际查询效果。
案例 1:查询覆盖年份
query = 'Which years are covered?'
response = qa_chain.invoke({'input': query})
print(response['answer'])
AI 回答: 数据覆盖的年份为 FY 2021、FY 2022、FY 2023 和 FY 2024。
案例 2:查询总营收
我们可以要求 LLM 以"百万"为单位汇报总营收,即使向量数据库中存储的是原始数值:
query = 'What are the total revenues in millions for 2024 and 2023?'
response = qa_chain.invoke({'input': query})
print(response['answer'])
AI 回答: 2024 年总营收为 350,018 百万美元,2023 年总营收为 307,394 百万美元。该数据与 Alphabet 10-K 年报一致。
案例 3:查询每股基本收益(EPS)
query = 'What is the basic earnings per share for 2024?'
response = qa_chain.invoke({'input': query})
print(response['answer'])
AI 回答: 2024 年每股基本收益为 8.13 美元。
案例 4:分析 EPS 趋势
RAG 系统不仅能检索数据,还能进行更深层次的分析:
query = 'Has the basic earnings per share over the period improved or deteriorated?'
response = qa_chain.invoke({'input': query})
print(response['answer'])
AI 回答: EPS 各年数据为——FY 2021:5.69,FY 2022:4.59,FY 2023:5.84,FY 2024:8.13。整体来看,每股基本收益呈改善趋势,表明公司盈利能力在持续提升。
案例 5:分析营收成本变化
query = 'Is there a reduction to the cost of revenue over the years?'
response = qa_chain.invoke({'input': query})
print(response['answer'])
AI 回答: 营收成本逐年递增(FY 2021:1,109 亿美元 → FY 2024:1,463 亿美元),年增幅分别为 13.7%、5.5% 和 9.7%,因此并未出现营收成本下降的趋势。
总结
本文通过一个完整的案例,展示了如何用 Python 搭建基于 RAG 的 AI 股票分析系统。整个技术栈的核心要点如下:
• EdgarTools 负责从 SEC 获取真实的财务数据,省去了手动下载和解析的麻烦 • LangChain 作为编排框架,将数据拆分、向量化、检索和生成串联起来 • ChromaDB 作为向量数据库,实现高效的语义检索 • Groq + LLaMA 3.1 作为推理引擎,不仅能回答事实性问题,还能进行趋势分析和数据换算
这套方案的扩展性也很强——文章中只演示了损益表的分析,但同样的方法可以轻松扩展到资产负债表、现金流量表等其他财务报表。如果你正在学习 Python 并对金融数据分析感兴趣,这是一个非常值得动手实践的项目。
参考文章
加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。 财经数据与量化投研知识社区
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架; 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程; 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考; 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能; 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础; 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题; 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
引言
你是否想过,能不能用 Python 自动从美国证券交易委员会(SEC)拉取上市公司的财务数据,然后让 AI 帮你分析?
本文将介绍一个完整的实战案例:利用 EdgarTools 库从 SEC 获取 Alphabet Inc.(股票代码:GOOG)的损益表数据,结合 LangChain 框架和 Groq 大语言模型,搭建一套基于 RAG(检索增强生成) 的智能股票分析系统。整个过程只需要 Python 即可完成,非常适合正在学习 Python 的你。
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种让大语言模型(LLM)在回答问题时,先从外部知识库中检索相关信息,再基于检索结果生成答案的技术。简单来说,就是给 AI "开卷考试",让它带着资料来回答你的问题,从而大幅提高回答的准确性。
整体架构
这套系统的核心流程如下:
1. 使用 EdgarTools 从 SEC 拉取公司财务数据 2. 将数据转换为 LLM 友好格式,并拆分成小块文档 3. 使用 HuggingFace Embeddings 生成向量,存入 ChromaDB 向量数据库 4. 通过 LangChain 构建 RAG 检索链,使用 Groq(LLaMA 3.1 模型)进行智能问答
环境准备
在开始之前,你需要准备以下内容:
• 一个 Groq API Key(用于调用 LLM) • SEC 访问需要提供姓名和邮箱 • 使用 dotenv 包管理环境变量,避免硬编码敏感信息
主要依赖库版本参考:
langchain : 0.3.27
langchain_core : 0.3.76
langchain_groq : 0.3.8
langchain_chroma : 0.2.6
langchain_huggingface : 0.3.1
chromadb : 1.0.21第一步:获取损益表数据
EdgarTools 提供了非常简洁的 API,只需几行代码就能获取任意上市公司的损益表:
from edgar import Company
def get_income_statement(ticker: str):
"""根据股票代码获取公司损益表"""
company = Company(ticker)
facts = company.get_facts()
return facts.income_statement()
# 指定股票代码
ticker = 'GOOG'
# 将损益表转换为 LLM 友好的上下文格式
llm_context = get_income_statement(ticker=ticker).to_llm_context()转换后的 llm_context 是一个嵌套字典,包含了公司名称、CIK 编号、报表类型、覆盖年份以及具体财务数据等信息。以下是部分示例:
{
'company': 'Alphabet Inc.',
'cik': '1652044',
'statement_type': 'income_statement',
'periods': ['FY 2024', 'FY 2023', 'FY 2022', 'FY 2021'],
'currency': 'USD',
'scale': 'actual',
'data': {
'total_revenue_fy_2024': 350018000000.0,
'total_revenue_fy_2023': 307394000000.0,
'total_revenue_fy_2022': 282836000000.0,
'total_revenue_fy_2021': 257637000000.0,
# ... 更多字段
}
}第二步:拆分文档并存入向量数据库
为了让 RAG 系统高效检索,我们需要把大块的 JSON 数据拆分成更小的文档块,然后生成向量嵌入并存入 ChromaDB。
from langchain_text_splitters import RecursiveJsonSplitter
from langchain_core.documents import Document
import json
# 创建 JSON 分割器,设置最大和最小块大小
json_splitter = RecursiveJsonSplitter(max_chunk_size=1000, min_chunk_size=200)
split_chunks = json_splitter.split_json(llm_context)
# 手动创建文档对象,并分配唯一 ID
documents = []
for i, chunk in enumerate(split_chunks):
# page_content 必须是字符串,同时为每个文档分配 ID
doc = Document(page_content=json.dumps(chunk), id=i)
documents.append(doc)接下来,使用 HuggingFace 的 all-MiniLM-L6-v2 模型生成嵌入向量,并将文档持久化到 ChromaDB:
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from chromadb.config import Settings
# 初始化嵌入模型
embeddings_model = HuggingFaceEmbeddings(model_name='all-MiniLM-L6-v2')
# 创建向量数据库,数据保存在本地
vector_store = Chroma(
collection_name=COLLECTION_NAME,
embedding_function=embeddings_model,
client_settings=Settings(allow_reset=True),
persist_directory=CHROMA_DB
)
# 将文档持久化存储
vector_store.add_documents(documents)第三步:构建 RAG 问答链
最后一步是初始化 LLM 并构建完整的 RAG 检索链:
from langchain_groq import ChatGroq
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 初始化 Groq LLM(确保已设置 GROQ_API_KEY 环境变量)
llm = ChatGroq(temperature=0.5, model_name='llama-3.1-8b-instant')
# 定义提示模板
prompt = ChatPromptTemplate.from_template(
"""
You are a helpful financial assistant. Answer the query below based on the provided context.
context: {context}
query: {input}
"""
)
# 创建文档链,将检索到的文档填充到提示中
document_chain = create_stuff_documents_chain(llm, prompt)
# 从向量数据库创建检索器
retriever = vector_store.as_retriever()
# 将检索器和文档链组合成 RAG 链
qa_chain = create_retrieval_chain(retriever, document_chain)实战查询案例
系统搭建完成后,我们来看几个实际查询效果。
案例 1:查询覆盖年份
query = 'Which years are covered?'
response = qa_chain.invoke({'input': query})
print(response['answer'])AI 回答: 数据覆盖的年份为 FY 2021、FY 2022、FY 2023 和 FY 2024。
案例 2:查询总营收
我们可以要求 LLM 以"百万"为单位汇报总营收,即使向量数据库中存储的是原始数值:
query = 'What are the total revenues in millions for 2024 and 2023?'
response = qa_chain.invoke({'input': query})
print(response['answer'])AI 回答: 2024 年总营收为 350,018 百万美元,2023 年总营收为 307,394 百万美元。该数据与 Alphabet 10-K 年报一致。
案例 3:查询每股基本收益(EPS)
query = 'What is the basic earnings per share for 2024?'
response = qa_chain.invoke({'input': query})
print(response['answer'])AI 回答: 2024 年每股基本收益为 8.13 美元。
案例 4:分析 EPS 趋势
RAG 系统不仅能检索数据,还能进行更深层次的分析:
query = 'Has the basic earnings per share over the period improved or deteriorated?'
response = qa_chain.invoke({'input': query})
print(response['answer'])AI 回答: EPS 各年数据为——FY 2021:5.69,FY 2022:4.59,FY 2023:5.84,FY 2024:8.13。整体来看,每股基本收益呈改善趋势,表明公司盈利能力在持续提升。
案例 5:分析营收成本变化
query = 'Is there a reduction to the cost of revenue over the years?'
response = qa_chain.invoke({'input': query})
print(response['answer'])AI 回答: 营收成本逐年递增(FY 2021:1,109 亿美元 → FY 2024:1,463 亿美元),年增幅分别为 13.7%、5.5% 和 9.7%,因此并未出现营收成本下降的趋势。
总结
本文通过一个完整的案例,展示了如何用 Python 搭建基于 RAG 的 AI 股票分析系统。整个技术栈的核心要点如下:
• EdgarTools 负责从 SEC 获取真实的财务数据,省去了手动下载和解析的麻烦 • LangChain 作为编排框架,将数据拆分、向量化、检索和生成串联起来 • ChromaDB 作为向量数据库,实现高效的语义检索 • Groq + LLaMA 3.1 作为推理引擎,不仅能回答事实性问题,还能进行趋势分析和数据换算
这套方案的扩展性也很强——文章中只演示了损益表的分析,但同样的方法可以轻松扩展到资产负债表、现金流量表等其他财务报表。如果你正在学习 Python 并对金融数据分析感兴趣,这是一个非常值得动手实践的项目。
参考文章
财经数据与量化投研知识社区
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架; 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程; 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考; 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能; 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础; 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐


