FinMarketPy / 项目研究站

finmarketpy:外汇、宏观与波动率研究的 Python 回测链路

finmarketpy 是 Cuemacro(Saeed Amen)维护的 Python 市场分析与策略回测库,前身是 PyThalesians。它把「取数 → 建信号 → 回测 → 绩效归因」串成一条对象化管线:BacktestRequest 描述这次回测的全部口径,Backtest / TradingModel 执行,TradeAnalysis 出统计。取数交给 findatapy,出图交给 chartpy;它真正区别于通用股票回测框架的地方,是 curve/ 里的外汇即期/远期/期权曲线与波动率曲面、以及 economics/ 里的事件研究与季节性。它不做实盘下单,也没有 A 股行情源。

许可:Apache-2.0Python:README 写 3.10 / pyproject 写 ≥3.9最新 PyPI:0.11.19(2025-03-10)GitHub master 已改为 src/ 布局

项目来源

cuemacro/finmarketpy · Apache-2.0 · 约 3.8k Star / 521 Fork / 22 Tags(2026-09-20 采集,数字会随社区活动变化)

cuemacro/finmarketpy GitHub 仓库页面截图:仓库名、About 简介、顶层目录结构与 Star/Fork 数 查看源码 ↗
GitHub 公开仓库页截图(2026-09-20 12:09 采集,1600×1100)。截图里可直接看到 “Move finmarketpy package into src/ layout” 的提交说明与 pyproject.tomluv.lockINSTALL.md.rhiza 等顶层文件——这正是本站要讲的「PyPI 发布版与仓库现状已经不一样」。
What it solves

能完成哪些研究任务

官方 README 把能力写成五条短语,但真正决定「要不要用它」的是这些任务在代码里长什么样。下表把任务、真实类和方法、以及官方资料里没有写清的注意点放在一起。

研究任务对应类 / 方法(源码实测)产出适用场景注意点
策略回测(模板化)TradingModel(高层模板)、Backtest(底层引擎)累计收益曲线、持仓、交易明细把一条信号规则跑成可比较的净值底层 Backtest.calculate_trading_PnL() 直接吃信号 DataFrame;高层模板负责参数装载
绩效统计与归因TradeAnalysisrun_strategy_returns_stats()run_excel_trade_report()run_day_of_month_analysis()收益统计表、Excel 报告、按日/按月的分解回测跑完后判断「好在哪、烂在哪」支持切换 engine="finmarketpy",Excel 输出默认写 model.xlsx
策略对比BacktestComparisonplot_pnl()plot_sharpe()两条策略的 PnL / Sharpe 对比图同一信号下比较不同成本或参数只在 chartpy 装好时才能出图
波动率目标与仓位控制BacktestRequestsignal_vol_* / portfolio_vol_* 参数组按目标波动率缩放的仓位序列让不同资产的回测风险可比官方示例用 5% 目标、最大杠杆 3、60 日估计窗、BM 月度再平衡
事件研究EventStudy / EventsFactoryget_economic_event_date_time()get_daily_moves_over_event()事件日前后窗口的走势统计非农、CPI、央行决议一类宏观事件事件日期表要自己维护;官方示例用 FRED/ALFRED 经济数据
季节性与日内规律Seasonality.time_of_day_seasonality(data_frame, years=False, seconds=False)按月份/星期/时段的收益分布判断某个品种是否有稳定的日历效应输入要求是规整的时间索引,缺失值要先处理
外汇曲线与波动率曲面FXSpotCurveFXForwardsCurveFXOptionsCurveFXVolSurface曲线插值、曲面拟合、按 delta/strike 取波动率外汇期权定价与曲面研究曲面拟合默认 CLARK5,定价可切 financepy 引擎;需额外装 FinancePy 才走 financepy 路径
技术指标信号TechIndicator.create_tech_ind() + TechParams信号 DataFrame不需要外部指标库就能起信号内置 9 种指标(SMA/EMA/ROC/SMA2/GMMA/RSI/BB/ATR/VWAP),与本机 stock-technical-mastery 技能覆盖范围不同
一句话定位:如果你的研究对象是外汇、宏观事件、波动率,它比通用股票回测框架更对口;如果你的研究对象是A 股选股或高频,官方的数据源与示例都不覆盖,需要另接数据与另写逻辑。
How it works

一次回测在代码里是怎么走的

下面这条链路来自官方示例 finmarketpy_examples/backtest_example.py,每一步都能在源码里找到对应定义。

  1. 用 findatapy 描述并取数

    MarketDataRequest(start_date=…, finish_date=…, freq='daily', data_source='alfred', tickers=['EURUSD'], vendor_tickers=['DEXUSEU'], fields=['close'], fred_api_key=…),再交给 Market(market_data_generator=MarketDataGenerator()).fetch_market(md_request)。预期输出:一张以日期为索引、以 tickers 为列的行情表。

  2. 声明这次回测的口径

    br = BacktestRequest() 后逐项赋值:br.spot_tc_bp = 2.5(2.5bp 买卖价差)、br.ann_factor = 252br.signal_vol_adjust = Truebr.signal_vol_target = 0.05br.signal_vol_max_leverage = 3。这一组值决定了结果的量级,也是「可复现」要写清的东西。

  3. 用内置指标生成信号

    tech_params = TechParams(); tech_params.sma_period = 200,然后 tech_ind.create_tech_ind(spot_df, 'SMA', tech_params),再 signal_df = tech_ind.get_signal()。预期输出:与行情同索引的 -1/0/1 信号表。

  4. 跑回测

    Backtest().calculate_trading_PnL(br, asset_df, signal_df, contract_value_df=None, run_in_parallel=False),随后 backtest.portfolio_cum() 取组合累计曲线、backtest.portfolio_signal() 取持仓、backtest.pnl() 取逐资产 PnL。

  5. 出统计与图

    TradeAnalysis().run_strategy_returns_stats(trading_model) 出统计表;图表走 chartpy:style = Style(); style.title = …; style.source = 'FRED'; Chart().plot(port, style=style)。换 chartfactory_default_engine 就能把同一张图渲成 matplotlib / plotly / bokeh。

源码里的一个重要提醒:官方示例注释写着——用现货价算收益时,更推荐改用包含 carry 的外汇总收益指数,否则趋势类策略的收益会被低估或错估。这类口径差异官方 README 没有专门成段说明,本站把它放进回测体检清单
Task routes

按你的任务直接进入对应页面

六条最常被问到的路径,每条都给出「先回答什么」和「读完下一步做什么」。

1. 我要把它装起来

先弄清一件事:PyPI 上装到的 0.11.19 是扁平布局,而 GitHub master 已经改成 src/finmarketpy + pyproject.toml。两条线命令不同、目录不同,装之前先决定走哪条。

看安装与环境边界 →

2. 我搞不清三个库的分工

finmarketpy 只做分析与回测,数据必须经 findatapy、图必须经 chartpy。装错顺序、报错找错库,都源于这一点。

看三库分工 →

3. 我想跑通一次回测

官方最短路径是 FRED/ALFRED 取 G10 货币对日线 → SMA(200) 信号 → calculate_trading_PnL → 统计表。需要一把免费 FRED API key。

看回测全链路 →

4. 我要确认数据源与凭证

凭证有四条路线(改常量 / keyring / datacred.py / 按次传参),缓存与存储还牵扯 Redis、ArcticDB、HDF5、S3、Parquet。A 股要另接。

看数据源与凭证 →

5. 我关心回测结果可不可信

官方没有这类文档。本站从 BacktestRequest 参数、SMAshift(1) 实现与示例注释里抽出一份三层体检清单与可复现协议。

看回测可信度体检 →

6. 我卡在报错上

numpy 必须 <2、Windows 下回测默认只有 1 个线程、缺 Redis 会打印 Couldn't push MarketDataRequest 但不影响取数——按五段顺序定位最快。

看报错与版本边界 →

Scope

它不做什么:四条容易搞混的边界

选型决策里最有用的信息往往是「不覆盖什么」。以下四条都能在官方资料或源码里查到依据。

容易被误认为实际情况依据该去找什么
「一个库搞定取数+画图+回测」取数必须 findatapy、画图必须 chartpy,两者是独立包,可以单独升级、也会单独出问题README 安装段要求先装 chartpy 与 findatapy;pyproject 依赖里两者都是必装问题在取数就查 findatapy,在出图就查 chartpy
「可以做 A 股选股/回测」findatapy 的 vendor 模块为 bbg / crypto / databento / fred / web 等,没有 A 股行情源;示例资产是 G10 外汇与 FRED 宏观序列findatapy 0.1.42 包内 datavendor*.py 清单;示例 tickers 列表A 股研究可走免部署路线的 akshare-finance / tushare-finance 等技能
「能实盘下单」官方资料没有交易执行能力说明;PLANNED_FEATURES 里提到的 event-driven 回测器与盈透包装仍是「低优先级待办」PLANNED_FEATURES.md实盘执行请用专门的交易框架,finmarketpy只用于研究
「有实时行情」它的取数是历史/批量的市场数据请求语义;实时行情取决于 findatapy 侧数据源的授权与接口README 与 findatapy README 的数据源描述实时行情要确认数据商授权;免部署路线见对比页
Setup and route

两条准备路线:自建三库 vs 免部署入口

两条路线解决的不是同一层问题,前置条件差别也很大。

对比项自建 finmarketpy 三库免部署技能路线
准备成本装 Python、按顺序装 chartpy → findatapy → finmarketpy装 EasyClaw 客户端即可,无需自建 Python 环境
数据凭证需自备 FRED key(免费)等;Quandl/Eikon/Plotly 等按需技能各自的前置:akshare 免费、Tushare 需 Token、东财妙想需 API Key
拿到的东西可复现的回测对象与全部口径(成本、杠杆、再平衡、年化因子)一次性问答结果(行情表、指标、图),口径由技能决定
能做的深度curve/ 曲线与波动率曲面、EventStudy 事件窗口、Seasonality、参数敏感性、Excel 报告行情/财务查询、技术面、出图、单次回测指标
不覆盖A 股行情源、实盘下单、中文官方文档外汇期权与波动率曲面、事件研究框架、可写死的回测口径
适合谁要写论文/研报、要复现、要改代码的人先要数据与结论、暂不装环境的人
官方另一条省事的路径:README 提供了两个 Binder 链接(backtest_example.ipynbmarket_data_example.ipynb),可以在浏览器里直接跑官方 notebook,不用装环境——但要能连到 mybinder.org,且部分数据仍需要一个免费的 Quandl/FRED key。
FinMarketPy · 免部署演示

免部署路线实际跑出来是什么样

两张本机 EasyClaw 对话截图(复用集群内已核验截图,含义未变),左边翻页查看。它们只证明「这类任务可以一句话发起」,不是 finmarketpy 的运行结果。

这条路线不是 finmarketpy 的安装方式。它只解决「先拿到数据、先要一个结论」这一层:免部署、不必装 Python 环境;但它没有 finmarketpy 的 curve/ 曲线曲面、事件研究框架与 BacktestRequest 口径控制。两条路线的差异与选择清单见顶部导航的「对比」页。
Limitations

本站的证据边界与免责说明

下面这些不是免责套话,而是会影响你判断的具体限制。

项目本站的实际情况对你的影响
是否实机跑过没有。本站未在本机安装或运行 finmarketpy,全部命令、参数与行为均来自官方 README、INSTALL.md、pyproject.toml 与 0.11.19 源码实读命令请以官方文档与你自己的运行结果为准;本站不保证在你的环境可复现
版本口径PyPI 最新为 0.11.19(2025-03-10);GitHub master 最后一次提交为 2026-04-16,已改为 src/ 布局你从 pip 装到的结构与仓库里看到的结构可能不同
Star / Fork 数字3,809 / 521(2026-09-20 采集,GitHub 公开 API)数字会随社区活动变化,截图与数字都只代表采集时刻
与 EasyClaw 的关系无已证实集成。本机 .easyclaw/skills 下 29 个技能里没有 finmarketpy 相关技能对比页比较的是「两条独立路线」,不是「一个平台里的两个功能」
收益类信息本站不提供任何收益率、胜率、Sharpe 数字,也不评价第三方文章里的具体数字看到任何具体数字请按体检清单自行复现后再采信
搜索数据关键词接口在 intent_filter 阶段失败,SERP 与竞品位次缺失;仅测得 finmarketpy 一词的中文区月搜索量约 10本站页面优先级依据官方证据的重要性排序,而非搜索量
FAQ

关于 finmarketpy 的高频问题

答案以官方 README、INSTALL.md 与 0.11.19 源码为依据;本站未实机验证,命令请以官方为准。

finmarketpy 免费吗?可以商用吗?

代码本身是 Apache-2.0(仓库 LICENCE 与 GitHub 许可证字段一致),可自由使用与修改。要注意两件不是「代码许可」的事:一是数据要另外买——Bloomberg、Eikon、Databento 这类数据源需要各自的授权,免费档(FRED/ALFRED 等)也有各自条款;二是作者另提供商业培训与技术支持(README 写明 2 天 Python for finance 企业培训与商业技术支持,联系方式在 README 内),并接受 GitHub Sponsors 赞助。以官方文档与数据提供方条款为准。

它和 findatapy、chartpy 是什么关系?我该装几个?

三个是互相独立的包,由同一作者维护:finmarketpy 负责分析与回测,取数靠 findatapy,出图靠 chartpy。官方 README 明确要求先装 chartpy 与 findatapy,再装 finmarketpy;pyproject 里两者都是必装依赖,所以正常安装会一起装进来。想知道「报错该去哪个库查」,看三库分工

pip 装到的版本和 GitHub 上看到的不一样,正常吗?

正常,而且这是本站最想提醒的一点。PyPI 最新发布是 0.11.19(2025-03-10),解包后是扁平结构(finmarketpy/… + setup.py);GitHub master 在 2026-04-16 已完成 src/finmarketpy 迁移,并引入 pyproject.toml(hatchling)、uv.lockMakefile 等。README 自己也说“better to get the newest version from repo, as opposed to releases”。以官方仓库现状与你实际安装结果为准,细节见安装与环境边界

能不能用它做 A 股?

可以把它当作回测与统计的计算层,但数据层不覆盖 A 股:findatapy 的 vendor 模块清单里没有 A 股行情源,官方示例资产是 G10 外汇与 FRED 宏观序列。要做 A 股,你需要自己接数据(或用技能路线的 akshare-finance / tushare-finance 取数),再喂给它的回测接口。本站不会把 finmarketpy 描述成 A 股量化平台——以官方文档为准。

它强在哪,和 backtrader / vectorbt 有什么区别?

差别主要在研究场景:finmarketpy 自带外汇即期/远期/期权曲线与波动率曲面(curve/)、宏观事件研究(EventStudy)与季节性(Seasonality),并提供了波动率目标与远期 roll 成本这类外汇口径的参数;通用框架通常不带这些。反过来,通用框架在事件驱动执行、超大规模参数扫描、A 股生态上更成熟。选型对照表在顶部导航的「对比」页。

跑起来要花多少钱、要几个 key?

最短路径只需要一把免费的 FRED API key(官方示例的data_source='alfred'就用它),Quandl/Eikon/Plotly/Bloomberg 等只有你用到才需要。没有 key 时最容易卡在取数环节,凭证的四条配置路线见数据源与凭证

有没有中文文档?

官方没有中文文档,也没有官方 ReadTheDocs 站点——PLANNED_FEATURES.md 里「用 Sphinx 生成 HTML API 文档」还列在待办中。中文资料目前主要是社区文章。本站是独立的研究笔记,不是官方文档的翻译,遇到冲突以官方仓库为准。

不想装这一整套环境怎么办?

两条替代:一是用 README 提供的 Binder 链接在浏览器里直接跑官方 notebook;二是走免部署的 免部署技能路线(本机已核验 akshare-finance、quant-analyst、chart-image、tushare-finance 等技能)。后者不是 finmarketpy 的安装方式,也不提供 curve/ 曲线曲面与事件研究框架,两者没有已证实集成。入口在顶部导航的「对比」页。

下一步:先把「装哪一条线」定下来

PyPI 版本与仓库现状已经分叉,装之前花两分钟看清版本漂移与 Python 版本的三处口径,可以省掉后面大部分环境排错。