FinMarketPy / 数据源与凭证

数据从哪来、key 放哪、缓存要不要装

finmarketpy 自己不取数,行情全部通过 findatapy 拿。这一页解决三件事:其一,findatapy 到底能连哪些数据源(看包里的 vendor 模块清单,而不是看宣传语);第二,凭证有四条互不等价的配置路线,选错会在升级后被覆盖;第三,缓存与存储牵扯 Redis、ArcticDB、HDF5、S3、Parquet,缺 Redis 不会让功能坏掉,只让你每次都去外部取数——这条能省掉很多人一整天的排查。

免费示范路径:FRED / ALFRED凭证 4 条路线缓存:Redis(可选)A 股不在数据源范围
数据源fred / bbg / crypto / databento / web 等 vendor 模块
凭证常量文件 / keyring / datacred.py / 按次传参
缓存与存储Redis / ArcticDB / HDF5 / S3 / Parquet
数据源、凭证与缓存三条线示意(依据 findatapy 0.1.42 包内 datavendor*.py 模块清单与官方 README);示意非官方架构图,可用的数据源与授权以各数据提供方条款为准。
FinMarketPy · FinMarketPy · Vendors

findatapy 能连哪些数据源

下面这份清单不是宣传口径,而是 findatapy 0.1.42 发布包里真实存在的模块文件;README 同时给出这些源的使用示例。

vendor 模块覆盖的数据是否要凭证 / 授权适用场景注意点
datavendorfredALFRED/FRED 宏观与汇率序列(官方示例默认走这条)需要免费 FRED API key快速起步、宏观事件研究的数据准备示例里的 G10 货币对就是用 FRED 序列(如 DEXUSEU
datavendorbbgBloomberg 行情与字段需要 Bloomberg 订阅 + 终端/授权机构级历史与实时数据Windows 终端才能用 Desktop API;Linux/macOS 需 Server API 授权
datavendorcrypto加密货币行情取决于所用交易所接口加密资产的取数与回测交易所限流与条款由交易所决定
datavendordatabentoDatabento 历史数据需要 Databento 账号(依赖里是 extra)较高精度的历史数据需求在依赖里标注为可选 extra,不是默认安装项
datavendorweb / datavendor通用网页/其它源(含 Yahoo、Quandl 一类的调用路径)部分免费、部分需 key(如 Quandl)免费起步、美股与宏观序列网页类源会随对端改版而失效,属常见不稳定来源
ioengine本地与远端存储读写(HDF5 / S3 / Parquet 等)S3 需凭据把取到的行情落盘、复用发布时间里有多次针对 Parquet/S3 的修复,说明这块迭代较频繁
ticker 配置(conf/*.csvticker 别名、字段别名、分类定义内置示例统一管理你的标的命名想保留自定义配置就要改 config_root_folder,否则升级会覆盖
A 股不在这个清单里。上面没有任何中国大陆 A 股行情源。做 A 股研究时,findatapy 可以把 A 股数据当作「你自己准备的表」来用(只要能构造成 DataFrame),但它不提供原生 A 股取数链路。本站不会把它描述成 A 股量化平台——免部署路线里的 akshare-finance / tushare-finance 等技能更对口。
Credentials

凭证配置有哪四条路线(选错会被升级覆盖)

官方 README 列了四条,每条都有自己的取舍。这是「装完能 import 但一取数就报错」的最常见原因。

路线做法优点缺点建议
① 改常量文件直接编辑 dataconstants.py(findatapy)、chartconstants.py(chartpy)、marketconstants.py(finmarketpy)最直接,改完就生效升级包时会被覆盖只在临时试验时用
② keyring 脚本运行 set_api_keys.py,把 key 存进系统 keyringkey 不落在代码里,升级不受影响依赖 keyring 后端;换机器要重配个人本机长期使用推荐
datacred.py / marketcred.py在同目录新建 cred 文件,同名属性会覆盖常量类官方明确说明「不会被升级覆盖」要自己写一份;注意别提交到公开仓库多机协作、需要版本化配置时推荐
④ 按次传参调用时通过 MarketDataRequest 传入(例如 fred_api_key=…最灵活,适合 notebook 与多账号切换每个调用点都要传,容易漏写示例代码、做演示时推荐
  1. 先确定你要用哪些源

    只用 FRED 起步的话,只需要一把免费 FRED key——官方 README 给出申请入口(FRED 网站的 API key 页面)。先用最小组合跑通,再逐步加源。

  2. 按「不用改源码」的优先级选路线

    优先 ②keyring 或 ③cred 文件,避免把 key 写进会被升级覆盖的常量文件。注意 finmarketpy 侧的覆盖机制是:MarketConstants.__init__ 会尝试导入 finmarketpy.util.marketcred 并用同名属性覆盖,找不到就静默跳过。

  3. 验证凭证真的生效

    用一个最小请求验证(例如 FRED 取一段 EURUSD 日线)。预期:返回非空 DataFrame;返回空表通常意味着 key 没生效、或 ticker/vendor_ticker 写法不匹配。

  4. 确认缓存与数据库设置

    finmarketpy 的 marketconstants.py 里有数据库与写入引擎常量(默认 db_server='127.0.0.1'db_port='27017'write_engine='arctic'、密码占位 'TOFILL')。不用数据库也要知道它们的存在,否则会看到莫名其妙的连接尝试。

安全边界:任何 key、token、数据库密码都不要写进会被分享的截图、notebook 输出或公开仓库。cred 文件应当加入 .gitignore
Cache

Redis 报错为什么可以先不理:缓存与存储的边界

这是最能省时间的一节。缺缓存组件的表现和解法官方写得很清楚,但很容易被误判成「装坏了」。

组件作用缺失时的表现要不要装注意点
Redis把重复的行情请求结果缓存在内存里,避免反复访问外部数据源打印 Couldn't push MarketDataRequest功能不受影响,只是每次都去外部取数开发阶段可不装;反复调试同一段数据时值得装官方说明 Redis 的正式支持在 Linux;Windows 有旧版可用但功能较少;重启后缓存会丢(内存缓存)
MongoDB / arctic本地保存 DataFrame 形式的行情(含压缩)需要落盘存储时才报错要长期积累数据时才装对应常量 db_server / db_port / write_engine
ArcticDB较新的存储后端(findatapy 发布时间线里明确加了支持)未安装则相关示例不可用可选与老 arctic 是两套东西,别混
HDF5 文件把 econ 事件数据等落成单个文件事件研究相关的本地文件读取会失败用到事件研究时建议装finmarketpy 常量里有 hdf5_file_econ_file 占位值 "x",用前要改
S3 / Parquet远端与列式存储相关示例不可用可选发布时间线显示这块还在频繁修(如改用 pyarrow 替代 s3fs),升级时留意
一句话结论:看到 Couldn't push MarketDataRequest,先确认你的取数结果对不对;只要数据回来了,这条报错可以先放着——它是缓存层在提示,不是数据层失败。
Local market

中国大陆用户的四个现实问题

这一节只讲「官方能给你什么」与「官方没给你什么」,不给任何数据源采购建议。

现实问题官方能提供官方没有提供你可以怎么做
A 股行情一个统一的 DataFrame 取数接口与回测引擎,任何来源的数据只要整理成表就能喂进去没有 A 股 vendor 模块、没有 A 股示例自接数据源,或在免部署路线里取数后导出
中文文档英文 README、INSTALL.md 与代码内 docstring没有官方中文文档;PLANNED_FEATURES.md 里 Sphinx 文档仍在待办以仓库代码与 docstring 为一手依据
网络可达性多个免费源(FRED/ALFRED 等)没有内置代理或镜像配置说明在环境层解决网络问题;失败时按错误类型定位是网络还是凭证
时区与交易日历findatapy 提供时区与日历工具(timezone.pycalendar.py没有针对 A 股交易日历的现成配置自建日历表;跨市场组合必须统一时区后再运算
数据合规Apache-2.0 只管代码不管数据授权使用与再分发数据前确认数据商条款
Troubleshooting

取数报错怎么查:从空表到字段错位

按「先看现象,再对原因,最后给核对方法」排列;每条都对应到 findatapy 里的具体环节。

现象可能原因核对方法处置方向
返回空 DataFrame凭证未生效 / ticker 与 vendor_ticker 不匹配 / 区间内确实无数据换一个已知可用的免费源与标准 ticker 做最小请求先证明凭证可用,再排查 ticker 映射
只有部分 ticker 有数据个别 vendor_ticker 写错,或该序列在区间内停更逐列看非空行数对齐官方示例里的 ticker 写法;缺失品种从标的集合里剔除
提示 Couldn't push MarketDataRequest未安装/未启动 Redis看数据是否仍能返回数据正常就可忽略;要缓存再装 Redis
日期不连续或有缺口数据源本身按自然日补行,或节假日处理不一致对索引做差分并与日历比对用日历工具对齐;记录缺失处理方式
时间戳差一天 / 时区错位不同源的时区口径不一致打印索引的时区属性统一时区后再做跨市场运算
字段名与预期不符fieldsvendor_fields 的映射没对上打印返回表的列名按 findatapy 的字段别名表核对
本地缓存读出来的数据是旧的缓存命中了上一次的请求换一个明显不同的参数再请求一次清缓存或改 cache_algo 的取值策略
升级后取数突然失败对端接口或 findatapy 内部实现变化看finmarketpy最近几次发布说明回退到上一个可用版本,再跟进上游修复
FAQ

数据源与凭证常见问题

模块清单与凭证路线以 findatapy 0.1.42 发布包与官方 README 为准;本站未实机验证取数。

起步最少需要什么凭证?

一把免费的 FRED API key。官方最小示例 backtest_example.py 用的就是 data_source='alfred' 加 FRED key,够你走完「取数 → 信号 → 回测 → 出图」全流程。其它源(Bloomberg、Eikon、Databento、Quandl 等)都用到了再配。凭证怎么写进环境见本节第二节的四条路线。

key 应该写在哪里才不会被升级覆盖?

官方明确推荐两种「不被覆盖」的写法:一是用 set_api_keys.py 存进系统 keyring,二是新建 datacred.py(findatapy)或 marketcred.py(finmarketpy)做同名属性覆盖。直接改 dataconstants.py 这类常量文件能生效,但每次升级包都会丢。以官方 README 与代码实现为准。

一定要装 Redis 和 MongoDB 吗?

不用。Redis 只做内存缓存,缺了会打印一条 Couldn't push MarketDataRequest 但仍能正常取数;MongoDB/arctic/ArcticDB 只在你要把行情长期落盘时才需要。建议做法:先不装,跑通最小示例;等你发现同一段数据被反复下载时,再加 Redis。

可以用它拿中国宏观经济数据吗?

findatapy 的免费源里包含 FRED/ALFRED 这类宏观序列库,但具体覆盖哪些中国指标要以 FRED 的序列目录为准,本站不做断言。如果你要的是中国官方口径的 GDP/CPI/PMI/M2 一类数据,免部署路线里的 akshare-finance 技能明确列出了 macro_china_gdpmacro_china_cpimacro_china_pmimacro_china_money_supply 这类接口——两条路线的对照见事件研究与季节性

能拿实时行情吗?

这取决于数据源而不是 finmarketpy:库本身是「描述请求 → 取回历史/批量数据」的语义,实时能力要看你接入的源是否提供、以及你是否持有相应授权(比如 Bloomberg 就属于机构授权范畴)。本站不宣称它能做实时行情,请以官方文档与数据商条款为准。

自定义 ticker 会被升级覆盖吗?

会,所以官方给了配置项:findatapy README 明确说,如果想保留自己的 ticker 库,就把 config_root_folder 指到别处,否则每次升级 findatapy 你的自定义配置都会被覆盖。ticker 体系由几张 CSV 组成(分类与字段、字段别名、ticker 别名),官方已预置了一组外汇 ticker 作为示例。

下一步看什么:它真正特别的那一块

finmarketpy 区别于通用回测框架的地方,是 curve/ 里的外汇即期/远期/期权曲线与波动率曲面。下一页专门讲这块的能力与参数口径。