资讯动态

FinanceDatabase实战:构建离线金融标的数据库,一键筛选全球股票代码

发布时间:2026/9/20 9:26:57 来源:尧图企业网站定制
找一份覆盖全的股票代码清单有多烦搞过选股工具或者量化投研的人都懂。手动去交易所官网抓字段对不齐、数据源不稳定还容易踩版权坑用免费行情接口一个个查又根本不知道世界上到底有哪些标的可以查。我后来试了 FinanceDatabase 这个开源库把全球主要市场的股票、ETF、基金、指数代码一次性拉到了本地整理成一个可以离线查询的金融标的数据库整个过程比想象中简单。这篇文章就把我搭建和使用的完整过程写出来包括安装、数据构建、筛选查询、联动行情以及那些踩过的坑。1. 为什么需要一份本地金融标的数据库核心需求拆解1.1 金融数据获取的三个真实痛点先说需求本身。不管是做投资组合监控、写量化回测还是给团队搭一个内部选股系统第一步永远不是算指标而是先拿到一份可靠、完整、带分类的证券代码清单。你以为这事很简单真做起来马上会遇到三个问题。第一覆盖面不够。市面上的免费行情接口比如 yfinance可以在你给出代码后返回行情但它本身并不告诉你“世界上有哪些股票”。如果你想做一个跨市场选股工具而不是只盯着一只苹果股票光靠手动输入代码是不现实的。第二筛选维度太弱。即使你从某个数据商拿到了代码表也往往只有代码和名称没有国家、行业、板块、是否活跃、是否在交易所挂牌这些字段。第三数据不落地。很多在线查询服务虽然方便但网络一旦波动或者你一天查几千次速度就会非常难看还要担心触发平台的风控规则。所以一个真正好用的基础工具应该满足三个条件覆盖全球主要市场、包含足够的描述性字段、能在本地离线使用。这就是我试用 FinanceDatabase 的出发点。1.2 FinanceDatabase 的定位与数据来源FinanceDatabase 是一个基于公开数据源构建的开源 Python 库核心思路是把散落在公开渠道的证券列表整合成结构化文件让你可以用类似 SQL 的筛选方式快速筛选出股票、ETF、基金、指数、货币、加密资产等数据。从数据资产的角度看它覆盖的标的总量相当可观股票加上各类 ETF、基金、指数、货币和加密资产整体记录规模在数十万级别。标题里说的“30 万只股票代码”主要也是指这种广义证券标的数量。对绝大多数个人研究和小型团队来说这个覆盖面已经够用了。底层数据主要源自 Yahoo Finance 的公开数据库并辅以其他公开可获取的信息源。库的作者每天会从数据源拉取快照整理之后打包进新版本。也就是说如果你很久不更新库拿到的数据会滞后但基础使用场景下不会有太大问题。数据最终以 pickle 二进制文件存储在本地放到 Python 的 site-packages 目录中。安装后第一次使用不需要单独下载库会在初始化时自动比对版本号如果发现本地数据版本较旧就会提示你更新。2. 安装与数据构建流程从零到可查询2.1 环境准备与安装环境要求很简单Python 3.8 以上然后直接 pip 安装就行。pip install financedatabase国内网络环境下如果 pip 超时可以换成清华镜像源实测速度会有质的提升pip install financedatabase -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后先验证一下是否成功import financedatabase as fd print(fd.__version__)另外这个库本身依赖 pandas安装时 pip 会自动帮你带上不需要额外处理。如果你的环境本来就有 pandas也要留意版本不要太老否则可能出现兼容性报错。2.2 首次构建本地数据库好安装完成之后你可能会以为直接调用一个函数就能拿到全部股票列表。其实不是。这个库的思路是先让你浏览可用的筛选维度再按维度查询数据。它内置的数据文件会在包安装时落盘不需要额外下载但如果在实际使用中检测到数据版本和数据源不一致它会要求你手动更新。首次使用建议直接跑一次更新把最新数据拉到本地import financedatabase as fd # 更新所有类型的数据 fd.update_database()这个过程会从公开数据源拉取产品记录耗时取决于你的网速。我首次更新大概花了几分钟更新完成之后数据就缓存在本地了。以后再查询只要不主动触发更新速度会非常快。如果你只想更新某一类比如只更新股票可以这样fd.update_database(databases_to_updateequities)这个参数设计在后续使用中很实用。比如你只想搭一个 ETF 研究库就不必让全量数据都占用本地空间只更新 etfs 那部分就行。2.3 数据库文件结构如果你好奇数据到底存到了哪里可以直接查看print(fd.databases)这里会返回一个字典列出 equities、etfs、funds、indices、currencies、cryptos 等类型的本地文件路径。文件格式为 pickle像 equities 的数据会分成多个文件比如按基础产品代码首字母拆分方便库在查询时快速定位。理解这个文件结构有个好处如果你有定时同步需求可以只备份这几个文件并不需要把整个 Python 环境打包。换一台机器时把这些 pickle 文件复制到相同路径或者在新机器上重新执行一次更新数据就能无缝迁移。提示pickle 文件是 Python 专有的序列化格式不要用文本编辑器直接打开否则看到的会是乱码。需要导入 pandas 后用pd.read_pickle()手动读取。3. 核心使用方式按交易所、行业、币种筛选实战操作3.1 数据获取的三种姿势FinanceDatabase 的设计非常像“证券数据库的查询入口”数据获取方式可以分为三个层级。第一个层级是直接拿全量数据。对所有股票执行一次不带任何参数的查询就能拿到一个包含所有证券信息的 DataFrame适合做整体盘点。equities_all fd.select_equities()这个操作返回的是一个 pandas DataFrame索引是股票代码列包含国家、板块、行业、市值规模、是否交易所上市、是否活跃等字段。第二个层级是按单一条件筛选。比如只拿美国的股票us_equities fd.select_equities(countryUnited States)第三个层级是组合条件筛选。多个条件可以叠加类似 SQL 里的 WHERE 子句。这种用法才是这个库真正的价值所在后面单独说。3.2 按交易所筛只拿心仪市场的代码先看国家维度。不同机构对“美国”的定义可能不同但在这个库里国家名称是规范过的直接看可选项就行。fd.show_options(equities, country)执行之后会列出这个库覆盖的所有国家名称。从我实际测试的情况看覆盖面以欧美市场为主美股、加拿大、欧洲主要交易所的数据质量较高新兴市场也有不少数据但部分小交易所的代码数量相对有限。如果你关心某一个国家直接用代码就能拿到一套规范的数据集。例如uk_equities fd.select_equities(countryUnited Kingdom)港股、A股这个库当然也覆盖了一部分但整体数据完整度不如美股和欧股。如果你主要研究 A 股我建议还是配合正规行情数据源使用FinanceDatabase 更适合做全球资产标的的广覆盖筛选。3.3 按行业筛选定制你的股票池选行业的场景很典型。比如你想搭一个美股半导体行业股票池用来做行业轮动分析以前可能要自己手动整理名单现在一行代码就好us_semiconductors fd.select_equities( countryUnited States, sectorTechnology, industrySemiconductors )这个查询返回的 DataFrame 会包含所有符合条件的美股半导体公司并且保留了每只股票的行业分类、是否上市交易等属性。更进一步你还可以叠加市值筛选逻辑。虽然库本身没有直接给实时市值但保留了市值分级字段。你可以先把候选池选出来再用 yfinance 拉实时市值把最终池子收敛到目标范围。这种“先用静态分类缩小范围再用动态行情做二次过滤”的思路比直接拉营全球行情再筛选要高效得多。3.4 按币种筛选跨境记账的刚需除了国家和行业币种筛选也是我实际用到最多的地方之一。做跨境资产研究时经常需要区分美元标价的资产和欧元标价的资产尤其是做汇率对冲策略的时候。eur_etfs fd.select_etfs(currencyEUR)这个功能对 ETF 研究特别友好。全球 ETF 数量很多不同市场报价币种各异通过币种筛选可以迅速把标的分组。比如你只看欧元区 ETF就能避开一大堆美元计价的同类产品。如果你需要看看这个库支持哪些币种同样可以这样查fd.show_options(etfs, currency)4. 拿到的代码怎么用联动行情接口与数据清洗落地到可投资池4.1 从代码列表到行情数据代码清单本身是没有价格信息的它是静态档案。真正的投资研究工作需要把这份静态档案和动态行情联动起来。最常用的搭配就是finance-databaseyfinance。比如你已经通过行业筛选得到了一个美股候选池import financedatabase as fd import yfinance as yf # 筛选美股科技行业 tech_stocks fd.select_equities( countryUnited States, sectorTechnology ) # 取出所有代码 symbols tech_stocks.index.tolist() # 批量拉取近一个月的日线数据 data yf.download(symbols[:50], period1mo, group_byticker)这里有一个非常关键的细节symbols默认顺序是索引顺序可能不是按市值排序。如果你直接用前 50 个下载行情很可能下载到的不是你想优先关注的大盘股。我实际操作时会先用市值区间的字段排序或者增加额外过滤再取头部代码。4.2 数据清洗与序列化交付从select_equities拿到的 DataFrame字段规范相对较好但依然有一些需要处理的地方。第一是缺失值。市值、行业这类字段在某些小众标的上会是 NaN如果后续要做分组统计建议先统一处理tech_stocks_clean tech_stocks.dropna(subset[industry])第二是代码的格式问题。不同交易所的代码命名方式不同有的带后缀有的不带。用 yfinance 下载时如果代码格式不匹配会导致部分数据拉取失败。建议下载之前先做一个格式归一化全部转成大写、去除空格。第三是输出格式。如果你需要把这份代码清单导入数据库或者交给其他系统使用可以直接转成 CSV或者写入 SQLite。tech_stocks_clean.to_csv(us_tech_stocks.csv)4.3 受限场景与下一步扩展任何工具都有边界FinanceDatabase 也一样。在实际使用中它的数据质量高度依赖公开数据源所以存在几个明显的受限场景。第一是实时性不够。代码清单和基本面分类的更新频率不高无法反映当天新上市的股票。第二是覆盖范围以欧美市场为主对低流动性市场覆盖有限。第三是“软删除”机制已退市的股票不会立刻从表中消失而是被标记为不活跃。如果你直接用全量数据会把已经停牌的标的误纳入投资池。针对这几个问题我实际使用时的应对方式是第一开启is_activeTrue过滤条件第二定期两周或一个月更新一次库本身第三真正做策略前用行情接口二次确认代码是否还有最新交易日数据。5. 常见问题与避坑指南实操经验5.1 常见问题速查表问题现象可能原因解决办法pip 安装超时网络连接不稳定换用清华镜像源查询结果为空筛选条件组合过于严格逐步去掉条件确认维度可选项拉到的代码里包含不活跃标的数据采用软删除机制增加is_activeTrue条件更新数据非常慢首次全量下载只更新需要的类型或等待完成后复用本地缓存yfinance 下载部分代码失败代码格式不符合行情接口要求全大写、去空格、去掉不支持的交易所后缀重新安装后数据恢复到旧版本pickle 文件丢失备份本地 databases 目录这个速查表看起来简单但每一条都是我实际踩过的。尤其是“软删除”这条我第一次用的时候没加过滤结果写出来的股票池里混进了好几只已经退市的股票查了好久才发现问题。5.2 独家避坑清单再分享几个文档里不会细写的坑。第一个是参数名不要拼错。is_exchange_traded和is_active是两个不同含义的参数前者表示是否在交易所公开交易后者表示是否仍然处于活跃状态。如果你把股票池设定为“只在交易所交易但不是活跃状态”拉回来的可能几乎都是停牌老股票看起来数据量不小实际可用价值很低。第二个是注意 cryptos 和 currencies 的特殊性。这两个数据集的结构跟 equities 不一样不能直接用相同的筛选参数。查询之前最好先show_options看看当前数据集支持哪些列。如果你盲目套用股票代码的查询逻辑很容易报 KeyError。第三个是关于数据版权的提醒。FinanceDatabase 使用的是公开数据源个人研究和内部使用基本没问题但如果你要做成商业产品对外分发建议认真核对数据源的授权条款。这个提醒不是多余很多人在搭完系统之后才意识到授权问题临时返工代价很高。第四个小技巧如果你有一些自定义的股票池需要管理完全可以把自己整理的数据和 FinanceDatabase 导出的数据合并用同一个 DataFrame 结构统一维护。这样既能享受开源库的覆盖面又能保留自己的核心清单。合并时注意去重以自定义数据为准。写在最后的几句体己话再多说一句自从把这个金融标的数据库落到本地以后我最大的感受就是找代码的时间成本从小时级降到了秒级。过去想研究某个行业光是找齐公司名单就要翻半天网页现在一行筛选语句直接出结果。如果你也有跨市场筛选标的、做策略回测或者写资产配置日报这类需求建议先把这份基础数据本地下好后面所有的数据工作都能站在一个更稳的底座上推进。工具能真正落地解决问题总是胜过反复手动折腾。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价