FinanceDatabase / Coverage
FinanceDatabase 证券类别:七类数据的规模、字段与缺失率实测
它收录七类证券的代码与元数据:股票、ETF、基金、指数、货币、加密货币、货币市场。真正需要先记住的一点是:这里给的是「清单」,不是行情——它提供证券列表,不提供行情价格。
事实核验卡(核验日期 2026-09-29)
- FinanceDatabase 版本
- 2.4.0(PyPI 与 GitHub Release,2026-06-02 发布)
- Python 版本
- 3.11.9(本站实测);包要求 ≥3.10, <3.16
- 数据库快照
- GitHub main 分支 compression/*.bz2(main 最后提交 2026-09-27)
- 核验日期
- 2026-09-29
- Equities 行数
- 112,718 行 × 21 列
- ETF 行数
- 36,481 行 × 9 列
- 数据来源
- raw.githubusercontent.com/JerBouma/FinanceDatabase/main/compression/
- 最后验证时间
- 2026-09-29(本机 venv 实跑,输出已归档)
以上数字来自本站 2026-09-29 在 Windows + Python 3.11.9 + financedatabase 2.4.0 下的真实运行输出,不是从文章里转抄的;数据文件由上游持续更新,行数会变,以官方 PyPI 与 GitHub Release 为准。采集时 GitHub star 约 9,374(2026-09-29)。
七类数据对照:每类给你什么、什么时候别用
看到 select() 系列先别急着全用上——七类里只有前两类是多数人真的会用到的。下面把 FinanceDatabase 每一类清单的返回内容与典型用途摊开,并把「什么时候别用」一并写清。
| 类别 | 查询函数 | 返回什么 | 典型用途 | 注意点 |
|---|---|---|---|---|
| 股票 | Equities().select() | 名称、代码、国家、板块、行业、市值档、计价货币等元数据 | 搭选股池的起点;按国家/行业先圈出范围 | 同一家公司在多地上市会有多个代码,必须结合国家与交易所列分辨 |
| ETF | ETFs().select() | ETF 代码、名称与类别元数据 | 找可交易的口径去跟踪某个指数或主题 | ETF 与它的持仓股票是两层,别把 ETF 代码当股票代码去用 |
| 基金 | Funds().select() | 共同基金代码与名称 | 主动型产品清单 | 与 ETF 不是一回事,费率与申赎机制不同,具体以基金方披露为准 |
| 指数 | Indices().select() | 指数代码与名称 | 找基准代码、做对照 | 指数本身不是可交易标的,要回测得换成对应的 ETF 或成分股 |
| 货币 | Currencies().select() | 货币与货币对代码 | 识别计价货币、外汇题材 | 货币对与单一货币不是同一个概念,换算方向容易搞反 |
| 加密货币 | Cryptos().select() | 加密资产代码与名称 | 加密题材的清单 | 各交易所报价符号写法可能不同;本库不含链上与交易所行情 |
| 货币市场 | Moneymarkets().select() | 货币市场工具 | 现金管理类的标的一览 | 属流动性工具,不能拿股票的筛选条件去筛 |
Equities;要指数基准就再加 Indices 与 ETFs;其余四类除非任务明确要求,否则先不要混进同一个清单里——混在一起会让下游统计口径失真。FinanceDatabase 不做跨类别的口径统一,混装之后需要你在下游自己补这层逻辑。元数据字段:拿到表先看哪几列
字段是「清单属性」,不是行情快照。同名字段在不同类别下的含义与取值口径并不一致,下面把容易读错的地方标出来。
| 字段 | 含义 | 取值口径 | 注意点 |
|---|---|---|---|
symbol | 证券代码 | 上游写法,大小写与后缀不统一 | 跨市场同名代码必须配合国家列使用,不能只拿代码去下游取数 |
name | 证券名称 | 多为英文名 | 中文名要自行映射;用名字匹配比用代码匹配更稳 |
country | 所属国家 | 上游口径的英文国名 | 筛选时传的取值必须与表里的写法完全一致,否则会静默返回空表 |
sector | 所属板块 | 粗粒度分类 | 与行业不是同一层,别拿板块当行业用 |
industry | 所属行业 | 更细一级分类 | 同一板块下行业数量差别很大,做统计前先看分布 |
market_cap | 市值档 | 多为分档标识而非具体金额 | 是分档且可能滞后,不能当实时市值参与计算 |
currency | 计价货币 | 三位货币代码 | 与交易所所在国不一定一致,跨市场合并前先看这一列 |
| 交易所相关列 | 上市/报价场所 | 上游代码 | 同一代码跨所会出现多行,去重前先确认业务上要不要保留 |
| 其余字段 | 随类别不同 | 以实际返回为准 | 写死列名的脚本容易在升级后失效,建议先打印列名再取值 |
df.columns.tolist())、统计缺失率(df.isna().mean())、抽查一只已知标的。这三步能提前挡掉大部分「跑通了但结论错」的问题。FinanceDatabase 返回的字段属于「清单属性」,升级后列名或口径可能变化,先打印列名再取值是更省事的习惯。字段与取值最终以官方 README 与实际返回为准。常被混淆的同名与同码:数据层面的八个坑
API 手册那一页讲的是「调用怎么选」;这一节讲「数据与代码本身怎么认」。这些问题不会报错,只会让你拿到错的那一行。表里的做法都可以用一次搜索或一次列比对确认。
| 常见误用 | 实际口径 | 怎么确认 | 影响 |
|---|---|---|---|
| 把 ETF 代码当股票代码查 | 同一标的可能同时出现在股票与 ETF 两张清单里 | 在两个类别里各搜一次,比对名称 | 下游取数取不到,或者取到了完全不同的标的 |
| 跨市场同名代码当成同一只 | 代码在不同市场可能重复 | 同时看国家与交易所列 | 分析的是另一个市场的标的 |
| 把指数当可交易标的 | 指数清单只有代码与名称 | 用指数名称到 ETF 清单里反查 | 回测数据为空,或误用成别的合约 |
| 加密货币符号直接套用 | 各交易所报价符号与本库写法未必一致 | 先用名称反查,再核对代码 | 取行情失败或取到错误交易对 |
| 货币对与单一货币混用 | 货币清单里两类条目并存 | 看代码长度与名称写法 | 汇率换算方向搞反,数值差一个量级 |
| 自己把代码小写化再匹配 | 上游大小写与后缀写法不统一 | 一律先用原样字符串精确匹配 | 明明存在的标的匹配不到 |
| 基金与 ETF 当同一类 | 两者分列在不同清单 | 先明确业务上要哪一类 | 选型错位,费率与申赎机制完全不同 |
| 一家公司只取一支证券 | 同一公司可能有多个代码或多类证券 | 用名称反查全部类别 | 清单漏项,统计口径偏小 |
数据从哪里来:五类上游与可达性
清单数据是「取来存下」的,不是实时流的。实测运行期的上游只有一个地址:raw.githubusercontent.com/JerBouma/FinanceDatabase/main/compression/;本库本身不提供行情与基本面,这两类数据要交给下游工具。
| 上游来源 | 主要贡献 | 可达性 | 注意点 | 什么时候不用它 |
|---|---|---|---|---|
| GitHub 仓库(实测运行期上游) | 本库的 .bz2 数据文件与分类表都从这里下载 | 需公网;实测首次取 equities.bz2 用时 13.8 秒 | 防火墙或代理会直接让加载失败(抛 ValueError) | 把数据文件缓存到本地后再离线使用 |
| 社区贡献的 CSV | 清单条目的增删改(官方仓库以 CSV 维护) | 随仓库更新 | 条目质量不一致,实测存在国家字段明显异常的记录 | 对单条记录的准确性要求高时,另行核对 |
| FinanceToolkit(下游) | 行情与基本面数据,由 to_toolkit() 衔接 | 免 key 走 Yahoo;填 FMP key 可用更多年数据 | 与清单数据是两个上游,任一侧故障都会断链路 | 只想拿到标的清单时不要接它 |
| PyPI | 包本体与依赖安装 | 需公网;国内可换镜像 | 包本体只有 34 KB,数据不随包分发 | 企业内网需自建源或预下载 wheel |
| GitHub 仓库与文档 | 源码、README、字段口径说明 | 需公网 | 口径变更以仓库为准 | 无网络时以已下载的文档与实测为准 |
| 企业内网镜像或本地代理 | 包与部分清单的加速获取 | 取决于所在网络策略 | 镜像内容可能落后于上游 | 要求与上游时刻一致时不用它 |
数据什么时候会不对:七种情况与判断方法
这部分在官方文档里基本不会写,但决定了你的结论能不能用。
| 情况 | 表现 | 怎么确认 | 处理建议 |
|---|---|---|---|
| 上游不可达 | 返回空表或直接超时 | 先手动访问上游源页面,再重试一次 | 换网络或稍后重试,不要当成「没有这只证券」 |
| 清单滞后 | 已知的新标的查不到 | 用一个你确定存在的标的做对照测试 | 以官方更新节奏为准,必要时用别的源补 |
| 市值档滞后 | 市值档与当下明显不符 | 与行情源的市值对一次 | 只把它当分档使用,不当实时数值参与计算 |
| 字段缺失 | 某列出现空值 | 统计各列缺失率 | 空值不能当 0 参与统计,缺失率高的列直接弃用 |
| 代码变更或退市 | 旧代码查不到 | 用名称反查现有代码 | 历史回测需要自行维护「当时代码」的映射,本库不含历史代码表 |
| 币种不一致 | 不同标的的数值直接相加 | 先看计价货币列 | 统一到同一本位币后再合并 |
| 分类口径变化 | 行业/板块归类与之前不同 | 对比两次取数的结果差异 | 记录取数日期,结论里注明口径与日期 |
用之前先验证这六件事
官方资料给的是函数与用法,不会给你验收标准。下面六步可以直接复制执行,每步都写明预期看到什么。
确认你装到了哪个环境
python -m pip -V—— 预期输出里会显示 pip 所属的解释器路径。路径必须指向你正在用的虚拟环境,否则后面所有 import 都白做。取一次清单看行数
python -c "import financedatabase as fd; print(fd.Equities().select().shape)"—— 预期输出形如 (行数, 列数)。行数为 0 说明上游或网络有问题,不是数据正常。先打印列名再写取值
print(fd.Equities().select().columns.tolist())—— 预期输出是字段名列表。把它贴进脚本,不要凭记忆写列名。抽查一只你知道的标的
fd.Equities().search(name="Apple")—— 预期输出里应包含相关条目。若为空,先回头查匹配写法,而不是怀疑标的。统计缺失率
df.isna().mean()—— 预期输出是每列的空值比例。关键列比例高,说明这一列在你的流程里不能依赖。落盘并记下取数日期
df.to_csv("equities_snapshot.csv", index=False)—— 预期输出是本地文件。之后的结论都基于这份快照,日期是口径的一部分。
| 检查项 | 通过表现 | 不通过时先查什么 | 什么时候可以跳过 |
|---|---|---|---|
| 解释器环境 | pip 路径与当前虚拟环境一致 | 是否装了多个 Python、是否忘了激活环境 | 用容器或固定镜像时可略 |
| 清单行数 | 行数明显大于 0 且稳定 | 网络、代理、上游状态 | 只读本地快照时可略 |
| 列名一致性 | 列名与脚本中写死的一致 | 是否刚升级过版本 | 脚本用动态列名取值时可略 |
| 已知标的抽检 | 能查到且信息合理 | 匹配写法、大小写、名称口径 | —(这一步不建议跳过) |
| 缺失率 | 关键列缺失率低 | 是否上游字段本身就不全 | 只做代码清单时为可选 |
| 快照留档 | 本地文件存在且含日期 | 写入路径与权限 | 一次性探索可不留档 |
拿到代码之后怎么接行情:六条路径对照
清单只解决「有哪些标的」。真正取到行情,还要再选一条路径。下表按前置条件排序,先看你能不能接受环境成本。
| 路径 | 能拿到什么 | 拿不到什么 | 前置条件 | 适用场景 |
|---|---|---|---|---|
| FinanceToolkit(同作者工具) | 基本面数据与部分市场行情 | 覆盖范围以外的标的仍需另接 | 需安装与配置,覆盖范围以官方文档为准 | 以基本面分析为主的流程 |
| yfinance 等公开接口 | 常见市场的日线级行情 | 部分市场与部分标的覆盖不到;接口可能变动 | 需公网,通常无需密钥 | 快速验证想法、做原型 |
| akshare 等国内公开接口 | A 股等国内数据 | 字段口径与上游一致性问题需自行核对 | 需公网 | 国内标的为主的研究 |
| 券商或交易所官方接口 | 授权范围内的行情与交易能力 | 授权范围之外一律拿不到 | 需开户与授权,门槛与合规要求高 | 实盘或准实盘场景 |
| 自建或采购数据仓库 | 稳定、可复现、可回溯的历史数据 | 成本高,建设周期长 | 需采购与运维 | 团队级、长期研究 |
| 本机已核验的金融数据技能路线 | 对话式直接发起取数与研究,省去环境搭建 | 能力边界随所用技能而定,不保证与本库字段一一对应 | 需先安装客户端 | 先验证思路、不想搭环境 |
数据注意事项:七条落地检查
这一节是把前面几条容易忽略的点收成一份可勾选的清单。
| 注意点 | 说明 | 处理 | 什么时候可以不管 |
|---|---|---|---|
| 不提供行情 | 只有代码与元数据 | 另配行情源(见上一节对照) | 任务只到「列出标的一」为止 |
| 字段滞后 | 市值档等可能过时 | 重要决策前复核,或降级为分档使用 | 不参与数值计算时不影响 |
| 上游不可用 | 联网失败返回空表 | 先排除网络与上游,再判断数据 | 用本地快照时可略 |
| 代码重名 | 跨市场同名代码 | 结合国家列区分 | 只做单一市场时风险低 |
| 类别混装 | 七类对象性质不同 | 同一分析里只放同类标的 | 仅做清单汇总时无妨 |
| 币种未统一 | 跨币种直接合并 | 先统一本位币 | 只做数量统计时不涉及 |
| 口径无记录 | 取数日期与分类口径没留 | 快照落盘并在结论里注明日期 | —(建议始终保留) |
四个可直接复制的取数配方
前面几节讲的是判断标准,这一节给能直接粘贴运行的片段。四个配方都只用到 FinanceDatabase 自己的函数,不需要额外依赖,跑之前先确认环境已经通过自检。
配方一:按国家加行业圈出一个股票池
先按国家缩小范围,再按行业收窄,最后只保留真正要用的列。
pool = fd.Equities().select(country="United States") tech = pool[pool["sector"] == "Technology"] print(tech[["symbol", "name", "country"]].head())
预期输出:一张只含代码、名称、国家的表。若为空表,先回头确认筛选取值写法,再确认上游是否可达——不要先怀疑标的。
配方二:给一个主题找对应的 ETF
ETF 与股票是两张清单,主题类标的通常先在 ETF 里找更直接。
etfs = fd.ETFs().select() print(etfs[etfs["name"].str.contains("Energy", case=False, na=False)].head())预期输出:名称中含关键词的 ETF 条目。匹配不到时先放宽关键词,仍为空再查上游。
配方三:给指数找可交易的替代口径
指数本身不可交易,用名称到清单里反查是可交易化的常规做法。
idx = fd.Equities().search(name="S&P") print(idx)
预期输出:跨类别的匹配结果。先确认你要的是指数本身还是可交易合约,再决定下一步去哪一类清单里取数。
配方四:把清单落盘,固定这一次的口径
落盘的意义不是省一次请求,而是让结论可追溯。
df = fd.Equities().select() df.to_csv("equities_snapshot.csv", index=False)预期输出:本地 CSV 文件。换机器或换版本之后,同一份快照仍是可复现的输入——这也是把口径写清的代价最小的一种方式。
| 配方 | 用到的函数 | 返回什么 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 圈股票池 | Equities().select() | 符合条件的股票清单 | 按国家或行业起步的常规研究 | 条件取值必须与表内写法一致,否则静默返回空表 |
| 找主题 ETF | ETFs().select() | ETF 代码与名称 | 需要可交易口径去跟踪主题 | 名称匹配用模糊查询更稳,严格匹配漏项多 |
| 指数反查 | Equities().search(name=) | 跨类别的匹配结果 | 给基准找可交易替代 | 结果可能同时含多类标的,要自己按类别过滤 |
| 清单落盘 | 任意类的 Equities().select() | 本地文件 | 需要可复现的研究或归档 | 文件里要带日期,否则口径无法追溯 |
| 全类别盘点 | 七个 select() 系列 | 七张清单 | 先摸清覆盖范围再决定用哪类 | 不要七类混在同一张表里做统计 |
| 按名称反查 | Equities().search(name=...) | 指定类别下的匹配条目 | 只记得名字、不记得代码时 | 名称写法随上游变化,结果要人工确认 |
七类清单各自先看哪一列
同样一张清单,判断它能不能用的首列并不相同。下面这七条是「打开就先看这里」的经验口径,写在这里是因为官方文档只讲字段含义,不讲先看哪个。
| 类别 | 先看哪一列 | 为什么先看它 | 容易忽略的点 |
|---|---|---|---|
| 股票 | 国家或交易所列 | 它决定了同名代码到底指哪一只 | 只存了代码字段就往下走,是最常见的隐患 |
| ETF | 名称列 | ETF 的代码规则不如名称直观 | 把 ETF 当成股票清单的一部分混用 |
| 基金 | 类别列 | 先确认它与你理解的「基金」是同一类 | 与 ETF 混为一谈,导致费率判断出错 |
| 指数 | 名称列 | 指数常被当成可交易标的,名称最能说明性质 | 直接拿去回测,结果取不到数据 |
| 货币 | 代码长度 | 用来区分单一货币与货币对 | 换算方向搞反,数值差一个量级 |
| 加密货币 | 名称列 | 符号写法在各处不统一,名称更稳定 | 直接拿符号去交易所取价 |
| 货币市场 | 工具类型 | 它是流动性工具,筛选逻辑与股票不同 | 套用股票的筛选条件 |
21 个字段的缺失率实测:哪些列可以直接用?
筛选结果看着整齐,但很多列本身就大量为空。下表是 2026-09-29 对 Equities 全部 112,718 行逐列统计的实测结果——缺失率超过 30% 的列,不适合当作筛选条件。
| 字段 | 缺失率(实测) | 含义 | 能不能当筛选条件 |
|---|---|---|---|
cusip | 75.79% | CUSIP 北美证券识别码 | 不建议 |
isin | 73.00% | ISIN 国际证券识别码 | 不建议 |
state | 71.64% | 州/省(以美股为主) | 不建议 |
figi | 48.05% | FIGI 标识符 | 不建议 |
zipcode | 43.27% | 邮编 | 不建议 |
website | 40.95% | 官网地址 | 不建议 |
industry | 35.54% | 行业细分(GICS 行业级) | 不建议 |
market_cap | 32.26% | 市值档位标签 | 不建议 |
summary | 10.87% | 公司/产品简介 | 可以用,注意空值 |
industry_group | 8.44% | 行业组(GICS 二级) | 可以用,注意空值 |
sector | 8.19% | 板块(GICS 一级) | 可以用,注意空值 |
country | 5.86% | 所属国家/地区 | 可以用,注意空值 |
name | 0.99% | 证券名称 | 可以放心用 |
mic | 0.74% | ISO 10383 MIC 代码 | 可以放心用 |
exchange | 0.43% | 交易所代码 | 可以放心用 |
isin 缺失 73.00%、cusip 缺失 75.79%,两者都是「有则很好、没有则是空」的稀疏列;用它们做跨市场去重时,空值不会被匹配上,会静默漏掉大部分标的。字段完整性建议在拿到表之后先跑一次 df.isna().mean(),把残缺程度摸清楚再定筛选口径。market_cap 是六档标签,不是市值数字
这一列全是文字档位,没有可比较的数值。实测分布如下(Equities 112,718 行,含退市)。想按市值排序或算分位数,必须另接行情/市值数据源。
| 档位标签 | 实测行数 | 占比 | 使用时注意 |
|---|---|---|---|
Nano Cap | 22,793 | 20.22% | 数值最小的一档,行数却最多 |
Small Cap | 16,175 | 14.35% | 与 Micro Cap 的边界由上游定义,不要自己重划 |
Micro Cap | 15,652 | 13.89% | 同上,标签口径以官方数据为准 |
Mid Cap | 10,840 | 9.62% | 常用分档之一 |
Large Cap | 10,254 | 9.10% | 常用分档之一 |
Mega Cap | 641 | 0.57% | 全库只有 641 行,样本量很小 |
Nano Cap(22,793 行),最少的是 Mega Cap(641 行)。如果拿「市值越大越靠前」的直觉去读这张表,会完全读错——它反映的是全球上市标的的分布,而不是你研究池的分布。另有 36,363 行(32.26%)该列为空。七类的可选值有多少:show_options 实测结果
写筛选条件之前,先用 show_options() 看该字段有哪些合法取值,比猜参数快得多。下面是 2026-09-29 逐类实测的取值数量。
| 资产类 | 实测可选值数量 | 用法 |
|---|---|---|
equities | country 117 / sector 11 / industry 80 / exchange 84 / mic 71 / market_cap 6 / currency 37 | 按国家/行业建池时先用它确认取值写法 |
etfs | family 313 / category 44 / category_group 19 / exchange 51 / mic 48 / currency 24 | ETF 的 family / category 分层 |
funds | family 1,540 / category 74 / category_group 21 / exchange 33 / mic 30 / currency 25 | 基金 family 达 1,540 个,建议先看再用 |
indices | category 42 / category_group 18 / exchange 63 / mic 50 / currency 45 | 指数按 category 分组 |
currencies | base_currency 164 / quote_currency 175 / exchange 1 | 货币对的两个方向都有取值 |
cryptos | cryptocurrency 351 / currency 12 / exchange 1 | 351 种加密货币 |
moneymarkets | family 129 / currency 2 / exchange 2 | 货币市场工具按 family 划分 |
fd.show_options("equities") 返回各类别的取值字典;类的实例方法 fd.Equities().show_options(selection="sector") 返回单个字段的合法值。实测 selection 只接受 currency、sector、industry_group、industry、exchange、mic、market、country、market_cap 九种;类方法的 docstring 里提到 state,但传入会直接抛 ValueError——文档与实现不一致,以实测为准。数据常见问题
FinanceDatabase 提供行情价格吗?
不提供。它只提供证券代码与元数据(名称、国家、板块、行业、市值档、计价货币等),行情需要另外接数据源。以官方 README 为准。
数据是实时的吗?
不是。清单与元数据依赖上游源的更新节奏,市值这类字段还可能滞后。它不能替代实时行情接口。以官方仓库说明为准。
能直接接 A 股数据吗?
本库的覆盖以上游公开源为准,A 股相关标的与字段口径建议先自行抽样核对;国内标的为主时,常见做法是用国内公开接口另行取数。以官方 README 为准。
指数数据能直接回测吗?
不能直接用。指数清单只有代码与名称,回测需要换成对应的 ETF 或成分股行情。以官方 README 为准。
为什么我筛选返回的是空表?
多数情况是筛选条件的取值与表里的写法不一致(国家、行业、板块名的大小写与口径),也可能是上游暂时不可达。建议先用已知标的做一次对照搜索,再判断是条件问题还是数据问题。以实际返回为准。
能不能把它当主要的证券主数据源?
不建议。它适合做「选股池起点」,但字段可能滞后、类别口径不一,正式流程里通常还要配合官方或商业主数据做校验。核验不到的具体口径以官方 README 为准。