FinMarketPy / 数据源与凭证
数据从哪来、key 放哪、缓存要不要装
finmarketpy 自己不取数,行情全部通过 findatapy 拿。这一页解决三件事:其一,findatapy 到底能连哪些数据源(看包里的 vendor 模块清单,而不是看宣传语);第二,凭证有四条互不等价的配置路线,选错会在升级后被覆盖;第三,缓存与存储牵扯 Redis、ArcticDB、HDF5、S3、Parquet,缺 Redis 不会让功能坏掉,只让你每次都去外部取数——这条能省掉很多人一整天的排查。
datavendor*.py 模块清单与官方 README);示意非官方架构图,可用的数据源与授权以各数据提供方条款为准。findatapy 能连哪些数据源
下面这份清单不是宣传口径,而是 findatapy 0.1.42 发布包里真实存在的模块文件;README 同时给出这些源的使用示例。
| vendor 模块 | 覆盖的数据 | 是否要凭证 / 授权 | 适用场景 | 注意点 |
|---|---|---|---|---|
datavendorfred | ALFRED/FRED 宏观与汇率序列(官方示例默认走这条) | 需要免费 FRED API key | 快速起步、宏观事件研究的数据准备 | 示例里的 G10 货币对就是用 FRED 序列(如 DEXUSEU) |
datavendorbbg | Bloomberg 行情与字段 | 需要 Bloomberg 订阅 + 终端/授权 | 机构级历史与实时数据 | Windows 终端才能用 Desktop API;Linux/macOS 需 Server API 授权 |
datavendorcrypto | 加密货币行情 | 取决于所用交易所接口 | 加密资产的取数与回测 | 交易所限流与条款由交易所决定 |
datavendordatabento | Databento 历史数据 | 需要 Databento 账号(依赖里是 extra) | 较高精度的历史数据需求 | 在依赖里标注为可选 extra,不是默认安装项 |
datavendorweb / datavendor | 通用网页/其它源(含 Yahoo、Quandl 一类的调用路径) | 部分免费、部分需 key(如 Quandl) | 免费起步、美股与宏观序列 | 网页类源会随对端改版而失效,属常见不稳定来源 |
ioengine | 本地与远端存储读写(HDF5 / S3 / Parquet 等) | S3 需凭据 | 把取到的行情落盘、复用 | 发布时间里有多次针对 Parquet/S3 的修复,说明这块迭代较频繁 |
ticker 配置(conf/*.csv) | ticker 别名、字段别名、分类定义 | 内置示例 | 统一管理你的标的命名 | 想保留自定义配置就要改 config_root_folder,否则升级会覆盖 |
凭证配置有哪四条路线(选错会被升级覆盖)
官方 README 列了四条,每条都有自己的取舍。这是「装完能 import 但一取数就报错」的最常见原因。
| 路线 | 做法 | 优点 | 缺点 | 建议 |
|---|---|---|---|---|
| ① 改常量文件 | 直接编辑 dataconstants.py(findatapy)、chartconstants.py(chartpy)、marketconstants.py(finmarketpy) | 最直接,改完就生效 | 升级包时会被覆盖 | 只在临时试验时用 |
| ② keyring 脚本 | 运行 set_api_keys.py,把 key 存进系统 keyring | key 不落在代码里,升级不受影响 | 依赖 keyring 后端;换机器要重配 | 个人本机长期使用推荐 |
③ datacred.py / marketcred.py | 在同目录新建 cred 文件,同名属性会覆盖常量类 | 官方明确说明「不会被升级覆盖」 | 要自己写一份;注意别提交到公开仓库 | 多机协作、需要版本化配置时推荐 |
| ④ 按次传参 | 调用时通过 MarketDataRequest 传入(例如 fred_api_key=…) | 最灵活,适合 notebook 与多账号切换 | 每个调用点都要传,容易漏 | 写示例代码、做演示时推荐 |
先确定你要用哪些源
只用 FRED 起步的话,只需要一把免费 FRED key——官方 README 给出申请入口(FRED 网站的 API key 页面)。先用最小组合跑通,再逐步加源。
按「不用改源码」的优先级选路线
优先 ②keyring 或 ③cred 文件,避免把 key 写进会被升级覆盖的常量文件。注意 finmarketpy 侧的覆盖机制是:
MarketConstants.__init__会尝试导入finmarketpy.util.marketcred并用同名属性覆盖,找不到就静默跳过。验证凭证真的生效
用一个最小请求验证(例如 FRED 取一段 EURUSD 日线)。预期:返回非空 DataFrame;返回空表通常意味着 key 没生效、或 ticker/vendor_ticker 写法不匹配。
确认缓存与数据库设置
finmarketpy 的
marketconstants.py里有数据库与写入引擎常量(默认db_server='127.0.0.1'、db_port='27017'、write_engine='arctic'、密码占位'TOFILL')。不用数据库也要知道它们的存在,否则会看到莫名其妙的连接尝试。
.gitignore。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,先确认你的取数结果对不对;只要数据回来了,这条报错可以先放着——它是缓存层在提示,不是数据层失败。中国大陆用户的四个现实问题
这一节只讲「官方能给你什么」与「官方没给你什么」,不给任何数据源采购建议。
| 现实问题 | 官方能提供 | 官方没有提供 | 你可以怎么做 |
|---|---|---|---|
| A 股行情 | 一个统一的 DataFrame 取数接口与回测引擎,任何来源的数据只要整理成表就能喂进去 | 没有 A 股 vendor 模块、没有 A 股示例 | 自接数据源,或在免部署路线里取数后导出 |
| 中文文档 | 英文 README、INSTALL.md 与代码内 docstring | 没有官方中文文档;PLANNED_FEATURES.md 里 Sphinx 文档仍在待办 | 以仓库代码与 docstring 为一手依据 |
| 网络可达性 | 多个免费源(FRED/ALFRED 等) | 没有内置代理或镜像配置说明 | 在环境层解决网络问题;失败时按错误类型定位是网络还是凭证 |
| 时区与交易日历 | findatapy 提供时区与日历工具(timezone.py、calendar.py) | 没有针对 A 股交易日历的现成配置 | 自建日历表;跨市场组合必须统一时区后再运算 |
| 数据合规 | Apache-2.0 只管代码 | 不管数据授权 | 使用与再分发数据前确认数据商条款 |
取数报错怎么查:从空表到字段错位
按「先看现象,再对原因,最后给核对方法」排列;每条都对应到 findatapy 里的具体环节。
| 现象 | 可能原因 | 核对方法 | 处置方向 |
|---|---|---|---|
| 返回空 DataFrame | 凭证未生效 / ticker 与 vendor_ticker 不匹配 / 区间内确实无数据 | 换一个已知可用的免费源与标准 ticker 做最小请求 | 先证明凭证可用,再排查 ticker 映射 |
| 只有部分 ticker 有数据 | 个别 vendor_ticker 写错,或该序列在区间内停更 | 逐列看非空行数 | 对齐官方示例里的 ticker 写法;缺失品种从标的集合里剔除 |
提示 Couldn't push MarketDataRequest | 未安装/未启动 Redis | 看数据是否仍能返回 | 数据正常就可忽略;要缓存再装 Redis |
| 日期不连续或有缺口 | 数据源本身按自然日补行,或节假日处理不一致 | 对索引做差分并与日历比对 | 用日历工具对齐;记录缺失处理方式 |
| 时间戳差一天 / 时区错位 | 不同源的时区口径不一致 | 打印索引的时区属性 | 统一时区后再做跨市场运算 |
| 字段名与预期不符 | fields 与 vendor_fields 的映射没对上 | 打印返回表的列名 | 按 findatapy 的字段别名表核对 |
| 本地缓存读出来的数据是旧的 | 缓存命中了上一次的请求 | 换一个明显不同的参数再请求一次 | 清缓存或改 cache_algo 的取值策略 |
| 升级后取数突然失败 | 对端接口或 findatapy 内部实现变化 | 看finmarketpy最近几次发布说明 | 回退到上一个可用版本,再跟进上游修复 |
数据源与凭证常见问题
模块清单与凭证路线以 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_gdp、macro_china_cpi、macro_china_pmi、macro_china_money_supply 这类接口——两条路线的对照见事件研究与季节性。
能拿实时行情吗?
这取决于数据源而不是 finmarketpy:库本身是「描述请求 → 取回历史/批量数据」的语义,实时能力要看你接入的源是否提供、以及你是否持有相应授权(比如 Bloomberg 就属于机构授权范畴)。本站不宣称它能做实时行情,请以官方文档与数据商条款为准。
自定义 ticker 会被升级覆盖吗?
会,所以官方给了配置项:findatapy README 明确说,如果想保留自己的 ticker 库,就把 config_root_folder 指到别处,否则每次升级 findatapy 你的自定义配置都会被覆盖。ticker 体系由几张 CSV 组成(分类与字段、字段别名、ticker 别名),官方已预置了一组外汇 ticker 作为示例。