第 2 章 · 03 SEC 财报 XBRL 解析 本节摘要:本节从市场侧切到基本面侧,讲怎么从美国 SEC 的 EDGAR 系统拿到上市公司财报,并解析其中结构化的 XBRL 数据。SEC 自 2009 年起强制所有申报方使用 XBRL(可扩展商业报告语言)格式提交财报,使得原本只能读的 PDF 变成了程序可解析的结构化数据。本节讲三件事:EDGAR 的 Financial Statement and Notes 数据集怎么组织(SUB/TAG/NUM/TXT 等八类文件)、XBRL 的 taxonomy 标签如何定位会计科目、以及如何把提取出的每股收益与价格数据拼成市盈率(P/E)序列。读完本节,你能为某家公司(如 AAPL)拉出九年的季度财务数据,并构建可用的基本面因子。
本节摘要:本节从市场侧切到基本面侧,讲怎么从美国 SEC 的 EDGAR 系统拿到上市公司财报,并解析其中结构化的 XBRL 数据。SEC 自 2009 年起强制所有申报方使用 XBRL(可扩展商业报告语言)格式提交财报,使得原本只能读的 PDF 变成了程序可解析的结构化数据。本节讲三件事:EDGAR 的 Financial Statement and Notes 数据集怎么组织(SUB/TAG/NUM/TXT 等八类文件)、XBRL 的 taxonomy 标签如何定位会计科目、以及如何把提取出的每股收益与价格数据拼成市盈率(P/E)序列。读完本节,你能为某家公司(如 AAPL)拉出九年的季度财务数据,并构建可用的基本面因子。
内容来源:原项目
02_market_and_fundamental_data/04_sec_edgar/edgar_xbrl.ipynb,汉化并套用体系化模板。
⚠️ 风险提示:XBRL 数据下载量极大(原书警告下载超 40GB),务必按季度小批量拉取;基本面因子有「点在时间」坑——财报公告日 vs 报告期结束日,错用就是数据窥探。
阅读完本节,你应当能够:
EarningsPerShareDiluted)提取数值科目。美国 SEC 要求所有上市公司每季度提交 10-Q、每年提交 10-K 财报。自 1990 年代初起,这些申报通过 EDGAR(Electronic Data Gathering, Analysis, and Retrieval)系统公开。
2005 年起,SEC 引入 XBRL(eXtensible Business Reporting Language)应对会计丑闻后强化披露的需求;2009 年起强制所有申报方使用。XBRL 基于 XML,核心是分类标准(taxonomy)——它定义报告中各元素的语义,并映射到电子版中对应的标签。美国通用会计准则(GAAP)就是这样一个 taxonomy。
| 阶段 | 财报形态 | 程序可读性 |
|---|---|---|
| 1990s–2005 | PDF/HTML 文本 | 几乎不可读,需 OCR |
| 2005–2009 | 自愿 XBRL | 部分可读 |
| 2009– | 强制 XBRL | 结构化,可批量解析 |
💡 核心心法:XBRL 的本质是给财报里每一个数字打上「这是什么」的标签(如
Assets、EarningsPerShareDiluted)。有了标签,机器就能像读 JSON 字段一样读财报,这是基本面量化的基础设施。
原项目用的不是单独某家公司的申报,而是 SEC 发布的 Financial Statement and Notes (FSN) 数据集——它把所有申报里解析出的 XBRL 数据汇总成按季度发布的表格。每次下载量极大,原 notebook 警告「Downloads over 40GB of data!」。
FSN 每季度拆成八个文件,各自承担不同角色:
| 文件 | 名称 | 内容 |
|---|---|---|
SUB |
Submission | 每次申报的唯一标识(公司、表单类型、日期等) |
TAG |
Tag | 定义并解释每个 taxonomy 标签 |
DIM |
Dimension | 给数值和文本加维度细节 |
NUM |
Numeric | 每个数值数据点一行(本节主力) |
TXT |
Plain Text | 所有非数值的 XBRL 字段(脚注等) |
REN |
Rendering | SEC 网站渲染信息 |
PRE |
Presentation | 主表中的标签与数值呈现细节 |
CAL |
Calculation | 标签间的算术关系(校验用) |
SUB 文件包含每次申报的唯一标识:CIK(Central Index Key,公司唯一编号)与 adsh(Accession Number,申报编号)。原 notebook 演示拿 AAPL 的 2018Q1 10-Q:
# submission 中关于 AAPL 的关键列 # cik: 0000320193 (Apple) # adsh: 0000320193-18-... (该次申报编号) # form: 10-Q # period: 报告期 # filed: 公告日(重要!这是 point-in-time 的关键)
用 CIK 在 SUB 中过滤出某公司所有历史申报,能拿到 Apple 九年里的 26 份申报(15 份 10-Q + 4 份 10-K,原书取了部分样本)。
⚠️ 警告:period(报告期结束日)和 filed(公告日)是两个不同的日子,差距可达 1~2 个月。回测时必须用 filed 作为「信息可用日」,否则就是用未来财报做过去决策,典型的数据窥探。
有了每次申报的 adsh,就能去 NUM 文件取所有数值点。原书取 AAPL 全部 19 份申报的数值,得到超过 18,000 条记录——九年财报历史信息量惊人。
提取特定科目靠 XBRL 标签。例如要算市盈率,先取每股收益:
# 在 NUM 文件中按 tag 过滤 eps = aapl_numerics[aapl_numerics['tag'] == 'EarningsPerShareDiluted'] # 还要进一步过滤:只取计量周期为 1 季度的数据点 # 只保留每次申报里最新的数据点 # 对历史数据做拆股调整(Apple 2014-06-04 按 7:1 拆股)
💡 核心心法:同一个 tag 在 NUM 里可能有多个值(原始值、修订值、不同周期版本)。提取时要按
tag+period(计量周期)+fp(财务期)三重过滤,只留每次申报里最新、最相关的那条。
把 EPS 与价格数据结合,就得到经典的 P/E(市盈率)。原 notebook 的关键步骤:
要点:
类似地,可以提取 DividendsPerShare 等其他标签,计算股息率等价值因子。
TXT 文件含所有非数值的 XBRL 字段——主要是有用的脚注与说明。原 notebook 提示 AAPL 的 adsh 可能在 TXT 中查不到(取决于申报具体内容),但可以通过其他途径取财报附注。这部分是第 14~16 章 NLP 分析(情感、主题、词嵌入)的语料来源。
SUB(申报标识)、NUM(数值,主力)、TAG(标签定义)、TXT(文本脚注)等。filed(公告日)而非 period(报告期),否则数据窥探。tag + period + fp,只留最新最相关的一条。下一节,我们看 数据存储基准——拿到这么多数据后,该用 CSV、HDF5 还是 Parquet 来存?原项目做了一组系统的读写性能对比。