第 2 章 · 03 SEC 财报 XBRL 解析


文档摘要

第 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)拉出九年的季度财务数据,并构建可用的基本面因子。

第 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)拉出九年的季度财务数据,并构建可用的基本面因子。

内容来源:原项目 02_market_and_fundamental_data/04_sec_edgar/edgar_xbrl.ipynb,汉化并套用体系化模板。

⚠️ 风险提示:XBRL 数据下载量极大(原书警告下载超 40GB),务必按季度小批量拉取;基本面因子有「点在时间」坑——财报公告日 vs 报告期结束日,错用就是数据窥探。

学习目标

阅读完本节,你应当能够:

  1. 说清 SEC EDGARXBRL 的关系,以及为什么 XBRL 让财报可被程序解析。
  2. 列举 Financial Statement and Notes 数据集的八类文件(SUB/TAG/DIM/NUM/TXT/REN/PRE/CAL)。
  3. CIK + accession number 定位某家公司的某次申报。
  4. 用 XBRL 标签(如 EarningsPerShareDiluted)提取数值科目。
  5. 把提取的 EPS 与价格序列拼成 P/E 比率,并处理股票拆分。

一、SEC EDGAR 与 XBRL:从 PDF 到结构化

美国 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 的本质是给财报里每一个数字打上「这是什么」的标签(如 AssetsEarningsPerShareDiluted)。有了标签,机器就能像读 JSON 字段一样读财报,这是基本面量化的基础设施。

二、Financial Statement and Notes 数据集

原项目用的不是单独某家公司的申报,而是 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 标签间的算术关系(校验用)

三、定位某家公司:CIK 与 Accession Number

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 作为「信息可用日」,否则就是用未来财报做过去决策,典型的数据窥探。

四、提取数值:NUM 文件与 XBRL 标签

有了每次申报的 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(财务期)三重过滤,只留每次申报里最新、最相关的那条。

五、构建 P/E 序列:基本面 + 市场数据

把 EPS 与价格数据结合,就得到经典的 P/E(市盈率)。原 notebook 的关键步骤:

要点:

  1. 拆股调整:Apple 在 2014-06-04 按 7:1 拆股,2014 年前的 EPS 要除以 7 才能与之后的可比。
  2. 滚动 TTM:用最近四个季度的 EPS 之和,避免季节性。
  3. 时间对齐:价格用「公告日前最近交易日」, EPS 用 filed 日期。

类似地,可以提取 DividendsPerShare 等其他标签,计算股息率等价值因子。

六、文本信息:TXT 文件与脚注

TXT 文件含所有非数值的 XBRL 字段——主要是有用的脚注与说明。原 notebook 提示 AAPL 的 adsh 可能在 TXT 中查不到(取决于申报具体内容),但可以通过其他途径取财报附注。这部分是第 14~16 章 NLP 分析(情感、主题、词嵌入)的语料来源。

本节要点回顾

  1. XBRL 让财报可被程序解析:基于 XML,用 taxonomy 给每个数字打语义标签,2009 年起 SEC 强制使用。
  2. FSN 八文件:SUB(申报标识)、NUM(数值,主力)、TAG(标签定义)、TXT(文本脚注)等。
  3. CIK + adsh:用 CIK 在 SUB 定位公司,用 adsh 定位单次申报。
  4. point-in-time:回测必须用 filed(公告日)而非 period(报告期),否则数据窥探。
  5. 提取数值要三重过滤:tag + period + fp,只留最新最相关的一条。
  6. P/E 构建要点:拆股调整 + 滚动 TTM + 时间对齐。
  7. TXT 是 NLP 语料:为第 14~16 章的情感/主题分析提供原始文本。

下一节,我们看 数据存储基准——拿到这么多数据后,该用 CSV、HDF5 还是 Parquet 来存?原项目做了一组系统的读写性能对比。


发布者: 作者: 灏天文库 转发
评论区 (0)
U