FinanceDatabase / API 手册

FinanceDatabase API 手册:七个资产类的 select / search / show_options

FinanceDatabase 的 API 围绕三件事展开:无参数的 select() 拿某类证券全量、带条件的 select() 按维度筛选、search() 按名称反查。三者都返回 pandas DataFrame,理解这套 API 就能读懂绝大多数查询脚本。

无参数 select():展示证券带参数 select():筛选证券search():搜索
无参数 select()展示证券列表
select()按条件筛选
search()按名称搜索
FinanceDatabase API 体系示意(基于官方 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)。

FinanceDatabase · API Overview

API 手册 对照

FinanceDatabase 的 API 划分与各自职责,以及每一类方法在什么情况下会被用到。

系列职责典型函数返回什么适用场景注意点
select()展示某类证券的完整列表Equities().select() / ETFs().select() / Funds().select()该类证券的 DataFrame(代码与元数据)想知道「这一类证券到底有哪些」属于全量拉取,类别越大返回越大,不适合反复调用
select()按维度筛选出子集Equities().select(country=, sector=, industry=, market_cap=)符合条件的那部分证券已经明确要哪个国家、行业或市值区间参数取值要与库内口径一致,写错值可能得到空表
search()按名称模糊搜索Equities().search(name="Apple")匹配到的证券记录只记得名字、不记得证券代码模糊匹配可能一次命中多条,需要人工确认哪一个才是目标
show + 本地过滤全量取回后用 pandas 再筛Equities().select() 之后自行 df[...]按自定义条件筛出的结果筛选条件在 select() 里没有对应参数全量数据占内存,条件复杂时不如直接用 select()
search + database 限定在指定类别内搜索Equities().search(name=...)限定类别后的匹配结果同名产品跨类别(股票与 ETF 同名等)需要先缩小范围结果只在该类内;换类别要另调一次
组合调用先筛后搜、逐步收敛select() → search()多轮收敛后的候选清单研究初期需要反复缩小范围每一轮都是一次库内查询,上游不可达时表现与「查不到」相似,需要区分
说明:三类查询都返回 pandas DataFrame,可继续做过滤、排序、导出。列名以实际返回为准,官方 README 给出的是函数与用法,字段清单请以自己机器上跑出的结果和官方文档为准。
无参数 select()

无参数 select():一次性拿到某类证券全量

无参数的 select() 用于一次性获取某类证券的完整列表,是按类别建立清单的入口。

函数拿到什么典型用途注意点
Equities().select()股票清单与元数据建立股票池、做全市场范围的清单整理条目量居前,建议取一次后本地缓存,而不是每次分析都重拉
ETFs().select()ETF 清单资产配置前先整理可用的 ETF 代码本库定位是代码与元数据,ETF 的费率、持仓等需另找来源
Funds().select()基金清单基金代码整理与分类净值序列属于行情类数据,不在本库范围内
Indices().select()指数清单找指数代码,用于基准对照指数成分明细是否提供以官方 README 为准,使用前先确认
Currencies().select()货币 / 外汇清单币种代码整理汇率时间序列需要另接行情源
Cryptos().select()加密货币清单币种代码整理不同交易所的交易对命名口径不一,跨交易所对照时需二次核对
Moneymarkets().select()货币市场工具清单现金管理类工具的代码整理利率、收益率等数据不在本库范围内
  1. 先看形状与列名

    df = fd.Equities().select(); df.shape; df.columns —— 先确认拿到的是 DataFrame、以及有哪几列。预期:打印出 (行数, 列数) 与列名清单,列名以实际返回与官方 README 为准。

  2. 抽查几行内容

    df.head() —— 看名称、代码、国家、行业等字段的实际取值风格。预期:能看到若干行证券记录;若某列整列缺失,先回官方文档确认该字段来源,不要直接当成「库坏了」。

  3. 确认这里没有行情字段

    df.columns 里不应期待出现开高低收、成交量这类行情列 —— FinanceDatabase 提供证券代码与元数据,不提供行情价格。预期:需要价格时另配行情源,别在这一步卡住。

  4. 缓存到本地再慢慢筛

    df.to_csv("equities.csv") —— 先把清单落盘。预期:本地生成 csv,后续筛选不必反复访问上游,也避免上游波动影响分析节奏。

select()

select():按条件筛选证券

select() 用于按维度筛选,是 FinanceDatabase 在「建证券池」这件事上的核心用法。

参数含义示例适用场景注意点
country按国家 / 地区筛选country="United States"只研究某一市场的股票取值需与库内口径一致,中文或简写不一定被识别
sector按板块筛选sector="Technology"做板块内的横向对照板块划分口径由上游数据源决定,与本地习惯分类可能不同
industry按行业筛选industry="Software - Infrastructure"需要比 sector 更细的行业粒度行业名称较长且带连字符等符号,建议先从已有结果里复制取值
market_cap按市值规模筛选market_cap="Large Cap"按大盘 / 中盘 / 小盘分层研究市值字段可能滞后于实时市场,分层只能当粗略口径
多参数组合同时满足多个条件Equities().select(country="United States", sector="Technology")「某国科技股」这类复合筛选组合条件的连接语义以官方实现为准,拿不准就先单参数跑一遍再叠加
参数取值来源取值写法决定能不能筛到先 Equities().select() 看某列的既有取值不确定某个国家 / 板块该怎么拼写时用结果里的实际取值回填参数,比猜写法可靠
结果为空的排查空表不等于库坏了去掉参数逐步缩小定位筛完返回 Empty DataFrame 时先区分是「条件确实无匹配」还是「上游取数失败」,两者表现可能相似
边界:筛选出的结果是证券清单,不是行情或估值序列。按市值分层只能用于粗筛,具体数值请以行情源为准。
Task Routing

API 手册 怎么选:7 个真实任务的调用路径

官方 README 给的是函数清单,不给「我这件事该用哪一类方法」。下面按任务倒推调用路径。

我的目标用哪一类方法具体调用拿到什么适用场景什么时候不用它
先看看这一类都有什么select()fd.Equities().select()该类全量清单探索阶段,还不确定范围已经明确只要某国某行业时,全量拉取偏重
只要某国 + 某行业的股票select()fd.Equities().select(country="United States", sector="Technology")复合条件筛出的子集研究范围已经清楚条件在参数里表达不了时,改用 show + 本地过滤
只记得公司名,要代码search()fd.Equities().search(name="Apple")命中的记录(含代码)名称反查代码要做的是「按行业批量取数」而不是找某一家时
同名产品混杂要挑出股票search + 类别限定fd.Equities().search(name="Apple")限定类别后的结果跨类别同名排查不确定目标在哪一类时,先不加限定跑一次
筛选条件库里没有对应参数select() + pandas先全量取回,再自行 df[df["..."] == ...]自定义条件的子集一次性、探索性的特殊筛选会反复跑的分析,更适合先看有没有现成参数
按市场规模分层建池select()fd.Equities().select(market_cap="Large Cap")某一市值层级的清单做分层对照研究需要精确市值数字时,本库字段可能滞后,要另行取数
先筛大类再逐步收敛组合调用select() 收窄 → search() 定位多轮收敛后的候选清单研究初期反复缩小范围每轮都查上游,网络不稳时更容易失败,注意区分空结果与失败
取舍原则:能用 select() 表达的就不要先拉全量;能用一次 search() 定位的就不要遍历清单。库的定位是「代码与元数据」,调用越多、越靠近上游,越容易碰到数据源侧的不稳定。
Read the DataFrame

返回的 DataFrame 怎么读:自查清单与常见误用

API 手册 都返回 DataFrame,但「拿到了表」不等于「数据可用」。下面这几项建议每次上手新环境时过一遍。

检查项怎么查正常表现异常表现怎么办
是不是 DataFrametype(df)pandas DataFrame返回 None 或列表先确认函数名与参数写法,以官方 README 为准
行列规模是否合理df.shape行数与该类证券量级相符0 行、或行数明显异常0 行先查参数取值与上游可达性,两种原因表现相似
列名是否符合预期df.columns出现名称、代码、国家、行业等元数据列缺少你依赖的那一列列清单以实际返回与官方文档为准,不要照抄别的教程字段名
关键列缺失情况df.isna().sum()个别字段有缺失整列缺失或大面积缺失按需过滤,并在结论里注明缺失范围
代码列是否可直接对接抽查 df.head() 里的代码字段能识别出交易所与代码代码带后缀 / 前后有空格对接行情源前先清洗,不同数据源对后缀要求不同
是否被当成行情表用看有没有开高低收、成交量列本库没有行情列把元数据字段当成价格用行情需另接数据源;市值等字段也可能滞后,不宜直接当估值依据
边界与披露:FinanceDatabase 与 EasyClaw 无已证实集成——项目 README 与官方文档未提及,本机技能目录中也没有对应技能。本页介绍的是 FinanceDatabase 自身的 API 用法,所有判断以官方 README / PyPI 为准。
Scenarios

这套 API 适合什么、不适合什么

把「适合」和「不适合」并排写清楚,比只列优点更省时间。

批量获取证券代码

一次性拿到某国、某行业或某类别的全部代码,作为后续分析的上游环节。相比手工维护代码清单,这条路更省事,也更容易复现。

构建研究用证券池

按国家、板块、行业、市值分层筛出候选集合,先固定范围再谈分析口径。分层建议只用于粗筛,别把市值分层当成精确的规模判断。

名称反查代码

只记得公司或产品名时,用 search() 把名字换成代码,再交给行情源。跨类别同名时记得叠加类别限定,避免拿错标的。

数据管道的上游环节

把本库输出当作管道输入:先出代码清单,再由行情 / 基本面库补数据。职责单一反而好排错,出问题时更容易定位到是哪一环。

跨类别清单整理

股票、ETF、基金、指数、货币、加密货币、货币市场七类可在同一套 API 下取数,适合做清单级的横向整理与对照。

不适合:要行情与估值序列

需要价格、净值、收益率、财务时序的场合不适合用它单独完成,必须另接数据源。把它当「代码与元数据层」使用,定位最不容易出错。

Same Name, Different Thing

七类证券里最容易混的同名概念

FinanceDatabase 把七类证券放在同一套 API 下,但不同类别里「看起来同名」的概念含义并不一样。跨类别取数时的多数错误,都发生在这一步。

容易混的一对混在哪里怎么区分对调用结果的影响注意点
ETF 与基金(Funds)两者都可能是「一篮子资产」的载体看它归属哪一类数据库,而不是看名字选错类别会整类漏掉目标产品同一产品在两类里的收录口径可能不同,以官方说明为准
指数(Indices)与指数型 ETF名字里常出现同一个指数名称指数是「标的」,ETF 是「可交易产品」想做交易却拿到指数代码,后续行情对不上指数成分与 ETF 持仓明细都不在本库范围内
货币(Currencies)与加密货币中英文里都带着一个「币」字看类别归属:外汇类还是加密类两类代码风格完全不同,混用会直接取数失败加密资产在不同交易所的交易对命名不统一,需二次核对
股票与其他类别的同名产品同一家公司名下可能同时有股票与 ETF用类别限定,或按类别分别取数search() 会跨类别命中,随手取到的那条不一定是你要的命中多条时务必人工确认,不要按顺序取排在前面的那一条
货币市场工具与货币都涉及「短端、现金类」的概念前者是工具清单,后者是币种清单想找币种代码却拿到工具清单利率、收益率等数据不在本库范围内
国家字段与交易所所在地看到海外上市就默认属于当地国家字段表达的是归属口径,不是挂牌地按国家筛会漏掉跨境上市的标的字段口径由上游数据源决定,可能滞后或与本地习惯不同
板块(sector)与行业(industry)两层分类看起来都能用来「分行业」sector 更粗、industry 更细,粒度不同用错层级,结果量级可能差出很多倍分类体系来自上游,与本地常用分类不完全一致
实用建议:跨类别取数前,先想清楚要的是「标的」还是「产品」、是「币种」还是「工具」,再用类别参数把范围钉死。拿不准时,先用 select() 看一眼该类里真实的命名风格,比凭直觉猜写法要快得多,也更容易复现。
Troubleshooting

API 调用常见报错与空结果排查

官方 README 通常只给成功路径。这一节汇总「直接报错」和「跑得通但结果不对」两类情况,便于刚上手时对照排查。

现象常见原因怎么确认处理建议注意点
ModuleNotFoundError: financedatabase没装,或装到了另一个解释器环境在报错的那个解释器里执行 import 试一次用当前解释器重新 pip install financedatabase多环境机器上这是最常见原因,先查解释器再怀疑包本身
导入成功,调用时报错依赖库(如 pandas)版本不匹配看报错信息里点出的依赖与版本号按官方 README 与 PyPI 的约束调整依赖版本不建议一次性升级全部依赖,容易引入新的冲突
返回空 DataFrame参数取值与库内口径不一致把参数逐个去掉,重跑一次对比行数用 select() 看实际取值,再回填到筛选参数空结果与上游取数失败表现相似,必须分开判断
调用很慢或超时上游数据源可达性差换个时段或网络再试一次把结果缓存在本地,减少重复拉取全量清单本库依赖公开上游源,不是本地静态数据包
某一整列都是空值该字段在上游缺失或口径变化用 df.isna().sum() 逐列看缺失量调整分析口径,或在结论里标注缺失范围字段清单会随上游变动,以官方文档与实测为准
拿到的代码无法对接行情源后缀与格式不符合行情源要求抽查 df.head() 里的代码字段写法对接前先做一次代码清洗与格式统一不同数据源要求的代码格式不同,不能一套写法到处用
用中文关键词搜不到库内命名以英文为主把同一个标的换成英文名再搜一次先用 select() 看命名风格,再用英文名搜索中文检索的支持程度以官方实现为准
  1. 先确认解释器与安装

    python -c "import financedatabase; print(financedatabase.__file__)" —— 打印实际加载的包路径。预期:路径与你执行 pip 安装的那个环境一致;不一致说明装到了别的解释器,后面的报错都能由此解释。

  2. 再用最小代价确认上游可达

    挑一个体量较小的类别跑一次 fd.Currencies().select() —— 用最小查询判断「是上游不通,还是我的参数不对」。预期:返回一个非空 DataFrame;若这里就为空,问题更可能出在网络或上游数据源。

  3. 最后逐个加回你的筛选条件

    把 select() 的参数一个个加回来,每加一个看一次 df.shape —— 定位是哪一个条件把结果筛空。预期:能收敛到具体参数上,而不是停留在「查询没结果」。

排查顺序建议:先确认「能不能跑通」(解释器与依赖),再确认「能不能取到数」(上游可达性),最后才怀疑参数写法。顺序反了会在错误的方向上反复试。本页涉及的调用细节与字段口径,均以官方 README / PyPI 为准。
Measured API

实测 API 表面:到底有哪些函数、各自返回什么?

下表每一行都在 2026-09-29 用 2.4.0 实跑过。这个版本里不存在 show_equities()、select_equities()、search_products() 这类函数——它们是网上不少文章里的写法,抄进脚本会直接 AttributeError。真实结构是:先实例化资产类,再调实例方法。

这样写实测返回说明
dir(fd) 里以 show 开头的只有 show_options顶层 show_options 是函数,用来列某类资产的取值,不返回证券清单
fd.Equities()Equities 对象构造即联网取数据;原始表在 .data,实测 (112718, 21)
equities.select()FinanceFrame,(102314, 21)无参 = 该类在市全量(默认排除 10,404 行退市)
equities.select(country="China")FinanceFrame,(6775, 21)13 个筛选参数可组合,取值必须先核对
equities.search(name="Alibaba")FinanceFrame,35 行按列匹配(这里是 name 列)
equities.search(index="TSLA")FinanceFrame,10 行按索引匹配,是包含关系不是精确相等
fd.show_options("equities")dict(17 个字段的取值)顶层函数;不传 selection 会直接抛错
equities.show_options(selection="sector")ndarray,11 项实例方法;只接受 9 种 selection 取值
equities.show_options()dict(9 个字段)不传参数时返回全部可筛字段的取值
frame.to_toolkit(...)Toolkit(实测 40.1 秒)只有 FinanceFrame 有这个方法,切片后会丢
七个资产类只有名字上的差别:Equities、ETFs、Funds、Indices、Currencies、Cryptos、Moneymarkets。注意后两个的真实类名是 Cryptos 和 Moneymarkets,不是文章里常见的 Cryptocurrencies 与 MoneyMarkets。
Real errors

报错原文与静默失败:实测的七种情况

这一节按「你敲了什么 → 屏幕上出现什么」原样记录。其中两种不抛异常——这正是最危险的地方。

你敲的实测结果类型怎么办
select(country="中国")ValueError: The country '中国' is not available in the database. Please check the available countries using the 'show_options' method.报错取值必须用英文写法,先用 show_options(selection="country") 查
select(country="Beijing")同上格式,提示 'Beijing' 不可用报错国家粒度是国/地区,城市不是合法取值
select(sector="Technology")ValueError: The sector 'Technology' is not available...报错官方板块名是 Information Technology,少一个词就不匹配
select(market_cap="Large")ValueError: The market cap 'Large' is not available...报错六档档位是 Nano/Small/Micro/Mid/Large/Mega + Cap
show_options(selection="state")ValueError: The selection variable provided is not valid, choose from currency, sector, industry_group, industry, exchange, mic, market, country, market_cap报错该方法 docstring 里提到 state,实际不支持;country 大小写不敏感可直接用
search(symbol="TSLA")返回全部 112,718 行,终端只打印一句 symbol is not a valid column.静默失败symbol 是索引不是列,要写 index=
合法条件但交集为空返回 0 行,不报错、不警告静默失败条件逐个加回,每加一个打一次 df.shape
一条自检规则(本站实测总结):任何一次查询后先看行数。若结果行数等于该类全量,说明有过滤条件被静默忽略;若等于 0,先把条件减到只剩一个再试。两种情况的根因都不是「库坏了」。
FAQ

API 手册 常见问题

show 和 select 有什么区别?

全量取数某类证券的完整列表;select 按 country / sector / industry / market_cap 等条件筛出子集。判断方法很简单:需要「全量清单」用 show,需要「子集」用 select。函数名与参数细节以官方 README 为准。

返回的数据是什么格式?

pandas DataFrame,列包含证券名称、代码、国家、行业、市值、货币等元数据。具体列名随上游数据源变动,建议以自己机器上返回的结果和官方文档为准,不要照搬第三方教程的字段清单。

能跨类别搜索吗?

可以。search() 默认跨类别搜索,也可以用 database 参数限定在某一类内搜索。类别名的写法以官方文档为准;返回多条时请人工确认目标,模糊匹配不代表只有一条命中。

select 传多个参数是「同时满足」还是「满足其一」?

多参数属于叠加的筛选条件,连接语义以官方实现为准。稳妥做法是先单参数跑一遍看结果量级,再逐个叠加参数,这样出现空表时更容易定位是哪个条件把结果筛没了。

查询返回空表怎么办?

先区分两种原因:一是参数取值与库内口径不一致(例如国家、板块的写法不同),二是上游数据源不可达或响应失败。推荐顺序是先去掉参数重跑,再回查取值写法,最后才怀疑网络与上游状态。两种原因的表现可能相似,不要直接判定为「库有问题」。

这些数据能当行情或估值依据用吗?

不能。FinanceDatabase 提供的是证券代码与元数据,不提供行情价格;部分字段(如市值)也可能滞后于实时市场。做行情、净值、收益率分析需要另接数据源,本页内容仅供项目研究与安装判断,不构成投资建议。

下一步

理清API 手册 的分工后,看首次运行示例把 Equities().select() 跑通,或直接进入筛选与搜索实战。