FinanceDatabase / Coverage

FinanceDatabase 证券类别:七类数据的规模、字段与缺失率实测

它收录七类证券的代码与元数据:股票、ETF、基金、指数、货币、加密货币、货币市场。真正需要先记住的一点是:这里给的是「清单」,不是行情——它提供证券列表,不提供行情价格。

七类证券代码 + 元数据不含行情价格
Equities股票
ETFsETF
Funds基金
Indices指数
Currencies货币
Cryptocurrencies加密货币
Moneymarkets货币市场
数据覆盖示意图:七类证券各自是一张清单,只有代码与元数据;行情要另外接(基于官方 README 整理)。

事实核验卡(核验日期 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)。

Coverage

七类数据对照:每类给你什么、什么时候别用

看到 select() 系列先别急着全用上——七类里只有前两类是多数人真的会用到的。下面把 FinanceDatabase 每一类清单的返回内容与典型用途摊开,并把「什么时候别用」一并写清。

类别查询函数返回什么典型用途注意点
股票Equities().select()名称、代码、国家、板块、行业、市值档、计价货币等元数据搭选股池的起点;按国家/行业先圈出范围同一家公司在多地上市会有多个代码,必须结合国家与交易所列分辨
ETFETFs().select()ETF 代码、名称与类别元数据找可交易的口径去跟踪某个指数或主题ETF 与它的持仓股票是两层,别把 ETF 代码当股票代码去用
基金Funds().select()共同基金代码与名称主动型产品清单与 ETF 不是一回事,费率与申赎机制不同,具体以基金方披露为准
指数Indices().select()指数代码与名称找基准代码、做对照指数本身不是可交易标的,要回测得换成对应的 ETF 或成分股
货币Currencies().select()货币与货币对代码识别计价货币、外汇题材货币对与单一货币不是同一个概念,换算方向容易搞反
加密货币Cryptos().select()加密资产代码与名称加密题材的清单各交易所报价符号写法可能不同;本库不含链上与交易所行情
货币市场Moneymarkets().select()货币市场工具现金管理类的标的一览属流动性工具,不能拿股票的筛选条件去筛
一句话选型:做股票研究只用得到 Equities;要指数基准就再加 Indices 与 ETFs;其余四类除非任务明确要求,否则先不要混进同一个清单里——混在一起会让下游统计口径失真。FinanceDatabase 不做跨类别的口径统一,混装之后需要你在下游自己补这层逻辑。
Fields

元数据字段:拿到表先看哪几列

字段是「清单属性」,不是行情快照。同名字段在不同类别下的含义与取值口径并不一致,下面把容易读错的地方标出来。

字段含义取值口径注意点
symbol证券代码上游写法,大小写与后缀不统一跨市场同名代码必须配合国家列使用,不能只拿代码去下游取数
name证券名称多为英文名中文名要自行映射;用名字匹配比用代码匹配更稳
country所属国家上游口径的英文国名筛选时传的取值必须与表里的写法完全一致,否则会静默返回空表
sector所属板块粗粒度分类与行业不是同一层,别拿板块当行业用
industry所属行业更细一级分类同一板块下行业数量差别很大,做统计前先看分布
market_cap市值档多为分档标识而非具体金额是分档且可能滞后,不能当实时市值参与计算
currency计价货币三位货币代码与交易所所在国不一定一致,跨市场合并前先看这一列
交易所相关列上市/报价场所上游代码同一代码跨所会出现多行,去重前先确认业务上要不要保留
其余字段随类别不同以实际返回为准写死列名的脚本容易在升级后失效,建议先打印列名再取值
实测建议:首次取数后先做三件事——打印列名(df.columns.tolist())、统计缺失率(df.isna().mean())、抽查一只已知标的。这三步能提前挡掉大部分「跑通了但结论错」的问题。FinanceDatabase 返回的字段属于「清单属性」,升级后列名或口径可能变化,先打印列名再取值是更省事的习惯。字段与取值最终以官方 README 与实际返回为准。
Naming

常被混淆的同名与同码:数据层面的八个坑

API 手册那一页讲的是「调用怎么选」;这一节讲「数据与代码本身怎么认」。这些问题不会报错,只会让你拿到错的那一行。表里的做法都可以用一次搜索或一次列比对确认。

常见误用实际口径怎么确认影响
把 ETF 代码当股票代码查同一标的可能同时出现在股票与 ETF 两张清单里在两个类别里各搜一次,比对名称下游取数取不到,或者取到了完全不同的标的
跨市场同名代码当成同一只代码在不同市场可能重复同时看国家与交易所列分析的是另一个市场的标的
把指数当可交易标的指数清单只有代码与名称用指数名称到 ETF 清单里反查回测数据为空,或误用成别的合约
加密货币符号直接套用各交易所报价符号与本库写法未必一致先用名称反查,再核对代码取行情失败或取到错误交易对
货币对与单一货币混用货币清单里两类条目并存看代码长度与名称写法汇率换算方向搞反,数值差一个量级
自己把代码小写化再匹配上游大小写与后缀写法不统一一律先用原样字符串精确匹配明明存在的标的匹配不到
基金与 ETF 当同一类两者分列在不同清单先明确业务上要哪一类选型错位,费率与申赎机制完全不同
一家公司只取一支证券同一公司可能有多个代码或多类证券用名称反查全部类别清单漏项,统计口径偏小
记不住的记这一条:凡是「代码」相关的问题,永远多带一列——国家或交易所。只拿一个代码字段往下走,是这类踩坑的共同起点。上面八条都可以用 FinanceDatabase 返回的原始列自查一遍,不需要额外工具。
Sources

数据从哪里来:五类上游与可达性

清单数据是「取来存下」的,不是实时流的。实测运行期的上游只有一个地址: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、字段口径说明需公网口径变更以仓库为准无网络时以已下载的文档与实测为准
企业内网镜像或本地代理包与部分清单的加速获取取决于所在网络策略镜像内容可能落后于上游要求与上游时刻一致时不用它
口径声明:上表上游清单为本次整理时的口径(采集日 2026-09-08,未能在当时实时复核),最终以官方仓库 README 为准。另需记住:无论上游是谁,本库都不提供行情价格——清单是清单,行情是行情。另外,FinanceDatabase 的清单是定期取回来的快照,不是流式数据,所以「有没有」和「新不新」是两个需要分开确认的问题。
Stale data

数据什么时候会不对:七种情况与判断方法

这部分在官方文档里基本不会写,但决定了你的结论能不能用。

情况表现怎么确认处理建议
上游不可达返回空表或直接超时先手动访问上游源页面,再重试一次换网络或稍后重试,不要当成「没有这只证券」
清单滞后已知的新标的查不到用一个你确定存在的标的做对照测试以官方更新节奏为准,必要时用别的源补
市值档滞后市值档与当下明显不符与行情源的市值对一次只把它当分档使用,不当实时数值参与计算
字段缺失某列出现空值统计各列缺失率空值不能当 0 参与统计,缺失率高的列直接弃用
代码变更或退市旧代码查不到用名称反查现有代码历史回测需要自行维护「当时代码」的映射,本库不含历史代码表
币种不一致不同标的的数值直接相加先看计价货币列统一到同一本位币后再合并
分类口径变化行业/板块归类与之前不同对比两次取数的结果差异记录取数日期,结论里注明口径与日期
判断原则:空结果有三种原因——上游坏了、你查的口径不对、标的真的不存在。三者的处理方式完全不同。先排除前两个,再下「不存在」的结论。这条原则适用于 FinanceDatabase 的七类清单:换成任何一类,判断顺序都一样。
Verify first

用之前先验证这六件事

官方资料给的是函数与用法,不会给你验收标准。下面六步可以直接复制执行,每步都写明预期看到什么。

  1. 确认你装到了哪个环境

    python -m pip -V —— 预期输出里会显示 pip 所属的解释器路径。路径必须指向你正在用的虚拟环境,否则后面所有 import 都白做。

  2. 取一次清单看行数

    python -c "import financedatabase as fd; print(fd.Equities().select().shape)" —— 预期输出形如 (行数, 列数)。行数为 0 说明上游或网络有问题,不是数据正常。

  3. 先打印列名再写取值

    print(fd.Equities().select().columns.tolist()) —— 预期输出是字段名列表。把它贴进脚本,不要凭记忆写列名。

  4. 抽查一只你知道的标的

    fd.Equities().search(name="Apple") —— 预期输出里应包含相关条目。若为空,先回头查匹配写法,而不是怀疑标的。

  5. 统计缺失率

    df.isna().mean() —— 预期输出是每列的空值比例。关键列比例高,说明这一列在你的流程里不能依赖。

  6. 落盘并记下取数日期

    df.to_csv("equities_snapshot.csv", index=False) —— 预期输出是本地文件。之后的结论都基于这份快照,日期是口径的一部分。

检查项通过表现不通过时先查什么什么时候可以跳过
解释器环境pip 路径与当前虚拟环境一致是否装了多个 Python、是否忘了激活环境用容器或固定镜像时可略
清单行数行数明显大于 0 且稳定网络、代理、上游状态只读本地快照时可略
列名一致性列名与脚本中写死的一致是否刚升级过版本脚本用动态列名取值时可略
已知标的抽检能查到且信息合理匹配写法、大小写、名称口径—(这一步不建议跳过)
缺失率关键列缺失率低是否上游字段本身就不全只做代码清单时为可选
快照留档本地文件存在且含日期写入路径与权限一次性探索可不留档
为什么值得做:这六步加起来不到两分钟,但能挡掉「空表被当成结论」「列名失效导致取错数据」这两类常见的返工。走完这六步,你手上的 FinanceDatabase 数据才算有了可比较的基线。
After the code

拿到代码之后怎么接行情:六条路径对照

清单只解决「有哪些标的」。真正取到行情,还要再选一条路径。下表按前置条件排序,先看你能不能接受环境成本。

路径能拿到什么拿不到什么前置条件适用场景
FinanceToolkit(同作者工具)基本面数据与部分市场行情覆盖范围以外的标的仍需另接需安装与配置,覆盖范围以官方文档为准以基本面分析为主的流程
yfinance 等公开接口常见市场的日线级行情部分市场与部分标的覆盖不到;接口可能变动需公网,通常无需密钥快速验证想法、做原型
akshare 等国内公开接口A 股等国内数据字段口径与上游一致性问题需自行核对需公网国内标的为主的研究
券商或交易所官方接口授权范围内的行情与交易能力授权范围之外一律拿不到需开户与授权,门槛与合规要求高实盘或准实盘场景
自建或采购数据仓库稳定、可复现、可回溯的历史数据成本高,建设周期长需采购与运维团队级、长期研究
本机已核验的金融数据技能路线对话式直接发起取数与研究,省去环境搭建能力边界随所用技能而定,不保证与本库字段一一对应需先安装客户端先验证思路、不想搭环境
边界:FinanceDatabase 与 EasyClaw 无已证实集成——官方仓库与文档未提及本项目,本机技能目录中也没有对应的专属集成技能。上表并列的是几条独立路线,用于比较前置条件,不代表它们可以互相替代。这条边界不影响 FinanceDatabase 自身的用法,但会影响你对「一句话直接出结果」的预期:清单与行情是两件事,谁来取、取到哪一步,取决于你选了哪条路。
Pitfalls

数据注意事项:七条落地检查

这一节是把前面几条容易忽略的点收成一份可勾选的清单。

注意点说明处理什么时候可以不管
不提供行情只有代码与元数据另配行情源(见上一节对照)任务只到「列出标的一」为止
字段滞后市值档等可能过时重要决策前复核,或降级为分档使用不参与数值计算时不影响
上游不可用联网失败返回空表先排除网络与上游,再判断数据用本地快照时可略
代码重名跨市场同名代码结合国家列区分只做单一市场时风险低
类别混装七类对象性质不同同一分析里只放同类标的仅做清单汇总时无妨
币种未统一跨币种直接合并先统一本位币只做数量统计时不涉及
口径无记录取数日期与分类口径没留快照落盘并在结论里注明日期—(建议始终保留)
收尾口径:本页所有结论都指向同一件事——清单类数据的价值在于「范围准、口径清」,而不在于实时。先把七类清单的范围用对,把国家、交易所、计价货币这几列留住,再按上一节给出的路径去接行情,流程就不会拧;反过来把清单当行情用,或者把不同类别的标的混进同一张表,后面每一步都要返工。判断自己有没有踩坑,有一个很简单的标准:如果一份清单里出现了你解释不了的空值、对不上的代码,或者忽高忽低的统计口径,问题通常不在数据本身,而在取数时少留了一列或没记下日期。对国内使用者还有一层现实差异:清单本身容易拿到,但后续行情与基本面的可达性取决于所选路径,建议先小范围试查一批标的,确认整条链路都能跑通,再扩大规模。具体字段、函数与更新节奏以官方仓库说明为准。
Recipes

四个可直接复制的取数配方

前面几节讲的是判断标准,这一节给能直接粘贴运行的片段。四个配方都只用到 FinanceDatabase 自己的函数,不需要额外依赖,跑之前先确认环境已经通过自检。

  1. 配方一:按国家加行业圈出一个股票池

    先按国家缩小范围,再按行业收窄,最后只保留真正要用的列。

    pool = fd.Equities().select(country="United States")
    tech = pool[pool["sector"] == "Technology"]
    print(tech[["symbol", "name", "country"]].head())

    预期输出:一张只含代码、名称、国家的表。若为空表,先回头确认筛选取值写法,再确认上游是否可达——不要先怀疑标的。

  2. 配方二:给一个主题找对应的 ETF

    ETF 与股票是两张清单,主题类标的通常先在 ETF 里找更直接。

    etfs = fd.ETFs().select()
    print(etfs[etfs["name"].str.contains("Energy", case=False, na=False)].head())

    预期输出:名称中含关键词的 ETF 条目。匹配不到时先放宽关键词,仍为空再查上游。

  3. 配方三:给指数找可交易的替代口径

    指数本身不可交易,用名称到清单里反查是可交易化的常规做法。

    idx = fd.Equities().search(name="S&P")
    print(idx)

    预期输出:跨类别的匹配结果。先确认你要的是指数本身还是可交易合约,再决定下一步去哪一类清单里取数。

  4. 配方四:把清单落盘,固定这一次的口径

    落盘的意义不是省一次请求,而是让结论可追溯。

    df = fd.Equities().select()
    df.to_csv("equities_snapshot.csv", index=False)

    预期输出:本地 CSV 文件。换机器或换版本之后,同一份快照仍是可复现的输入——这也是把口径写清的代价最小的一种方式。

配方用到的函数返回什么适用场景注意点
圈股票池Equities().select()符合条件的股票清单按国家或行业起步的常规研究条件取值必须与表内写法一致,否则静默返回空表
找主题 ETFETFs().select()ETF 代码与名称需要可交易口径去跟踪主题名称匹配用模糊查询更稳,严格匹配漏项多
指数反查Equities().search(name=)跨类别的匹配结果给基准找可交易替代结果可能同时含多类标的,要自己按类别过滤
清单落盘任意类的 Equities().select()本地文件需要可复现的研究或归档文件里要带日期,否则口径无法追溯
全类别盘点七个 select() 系列七张清单先摸清覆盖范围再决定用哪类不要七类混在同一张表里做统计
按名称反查Equities().search(name=...)指定类别下的匹配条目只记得名字、不记得代码时名称写法随上游变化,结果要人工确认
配方不是模板:上面四段只解决「取到清单」。取到之后要不要接行情、接哪一条,仍取决于你的任务——那部分的对照见上一节。函数与参数的准确写法以官方 README 为准,取值口径以实际返回为准。
Quality

七类清单各自先看哪一列

同样一张清单,判断它能不能用的首列并不相同。下面这七条是「打开就先看这里」的经验口径,写在这里是因为官方文档只讲字段含义,不讲先看哪个。

类别先看哪一列为什么先看它容易忽略的点
股票国家或交易所列它决定了同名代码到底指哪一只只存了代码字段就往下走,是最常见的隐患
ETF名称列ETF 的代码规则不如名称直观把 ETF 当成股票清单的一部分混用
基金类别列先确认它与你理解的「基金」是同一类与 ETF 混为一谈,导致费率判断出错
指数名称列指数常被当成可交易标的,名称最能说明性质直接拿去回测,结果取不到数据
货币代码长度用来区分单一货币与货币对换算方向搞反,数值差一个量级
加密货币名称列符号写法在各处不统一,名称更稳定直接拿符号去交易所取价
货币市场工具类型它是流动性工具,筛选逻辑与股票不同套用股票的筛选条件
一个通用判断:如果一张 FinanceDatabase 清单让你拿不定主意,就多留一列不删——尤其是国家、交易所、计价货币这三列。它们的体积很小,但能把后面一整类错误挡在门外。字段与取值以实际返回为准。
Field audit

21 个字段的缺失率实测:哪些列可以直接用?

筛选结果看着整齐,但很多列本身就大量为空。下表是 2026-09-29 对 Equities 全部 112,718 行逐列统计的实测结果——缺失率超过 30% 的列,不适合当作筛选条件。

字段缺失率(实测)含义能不能当筛选条件
cusip75.79%CUSIP 北美证券识别码不建议
isin73.00%ISIN 国际证券识别码不建议
state71.64%州/省(以美股为主)不建议
figi48.05%FIGI 标识符不建议
zipcode43.27%邮编不建议
website40.95%官网地址不建议
industry35.54%行业细分(GICS 行业级)不建议
market_cap32.26%市值档位标签不建议
summary10.87%公司/产品简介可以用,注意空值
industry_group8.44%行业组(GICS 二级)可以用,注意空值
sector8.19%板块(GICS 一级)可以用,注意空值
country5.86%所属国家/地区可以用,注意空值
name0.99%证券名称可以放心用
mic0.74%ISO 10383 MIC 代码可以放心用
exchange0.43%交易所代码可以放心用
实测提醒:isin 缺失 73.00%、cusip 缺失 75.79%,两者都是「有则很好、没有则是空」的稀疏列;用它们做跨市场去重时,空值不会被匹配上,会静默漏掉大部分标的。字段完整性建议在拿到表之后先跑一次 df.isna().mean(),把残缺程度摸清楚再定筛选口径。
Label, not number

market_cap 是六档标签,不是市值数字

这一列全是文字档位,没有可比较的数值。实测分布如下(Equities 112,718 行,含退市)。想按市值排序或算分位数,必须另接行情/市值数据源。

档位标签实测行数占比使用时注意
Nano Cap22,79320.22%数值最小的一档,行数却最多
Small Cap16,17514.35%与 Micro Cap 的边界由上游定义,不要自己重划
Micro Cap15,65213.89%同上,标签口径以官方数据为准
Mid Cap10,8409.62%常用分档之一
Large Cap10,2549.10%常用分档之一
Mega Cap6410.57%全库只有 641 行,样本量很小
反直觉的一点:行数最多的是 Nano Cap(22,793 行),最少的是 Mega Cap(641 行)。如果拿「市值越大越靠前」的直觉去读这张表,会完全读错——它反映的是全球上市标的的分布,而不是你研究池的分布。另有 36,363 行(32.26%)该列为空。
Category size

七类的可选值有多少:show_options 实测结果

写筛选条件之前,先用 show_options() 看该字段有哪些合法取值,比猜参数快得多。下面是 2026-09-29 逐类实测的取值数量。

资产类实测可选值数量用法
equitiescountry 117 / sector 11 / industry 80 / exchange 84 / mic 71 / market_cap 6 / currency 37按国家/行业建池时先用它确认取值写法
etfsfamily 313 / category 44 / category_group 19 / exchange 51 / mic 48 / currency 24ETF 的 family / category 分层
fundsfamily 1,540 / category 74 / category_group 21 / exchange 33 / mic 30 / currency 25基金 family 达 1,540 个,建议先看再用
indicescategory 42 / category_group 18 / exchange 63 / mic 50 / currency 45指数按 category 分组
currenciesbase_currency 164 / quote_currency 175 / exchange 1货币对的两个方向都有取值
cryptoscryptocurrency 351 / currency 12 / exchange 1351 种加密货币
moneymarketsfamily 129 / currency 2 / exchange 2货币市场工具按 family 划分
注意两套 show_options 不是一回事:顶层函数 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——文档与实现不一致,以实测为准。
FAQ

数据常见问题

FinanceDatabase 提供行情价格吗?

不提供。它只提供证券代码与元数据(名称、国家、板块、行业、市值档、计价货币等),行情需要另外接数据源。以官方 README 为准。

数据是实时的吗?

不是。清单与元数据依赖上游源的更新节奏,市值这类字段还可能滞后。它不能替代实时行情接口。以官方仓库说明为准。

能直接接 A 股数据吗?

本库的覆盖以上游公开源为准,A 股相关标的与字段口径建议先自行抽样核对;国内标的为主时,常见做法是用国内公开接口另行取数。以官方 README 为准。

指数数据能直接回测吗?

不能直接用。指数清单只有代码与名称,回测需要换成对应的 ETF 或成分股行情。以官方 README 为准。

为什么我筛选返回的是空表?

多数情况是筛选条件的取值与表里的写法不一致(国家、行业、板块名的大小写与口径),也可能是上游暂时不可达。建议先用已知标的做一次对照搜索,再判断是条件问题还是数据问题。以实际返回为准。

能不能把它当主要的证券主数据源?

不建议。它适合做「选股池起点」,但字段可能滞后、类别口径不一,正式流程里通常还要配合官方或商业主数据做校验。核验不到的具体口径以官方 README 为准。

下一步

确认数据覆盖与边界之后,用一次自检把数据真正跑通;也可以先看筛选实战,把清单用起来。