FinMarketPy / 三库分工

三个库各管一段:取数归 findatapy、出图归 chartpy、回测归 finmarketpy

finmarketpy 的前身是 PyThalesians,作者把它拆成三个更小的专业库,好维护、也方便分别贡献。这个拆分决定了你后面所有问题的定位方向:取数报错要查 findatapy,出图报错要查 chartpy,只有回测口径与统计的问题才落在 finmarketpy。三库都是 Apache-2.0、同一作者维护,但版本节奏不同——findatapy 2026 年还在发版(0.1.42),chartpy 最新发布停在 2025-05(0.1.16)。

三库同许可:Apache-2.0findatapy 0.1.42(2026-03)chartpy 0.1.16(2025-05)finmarketpy 0.11.19(2025-03)
findatapy取数与缓存:MarketDataRequest → fetch_market
chartpy出图:Chart().plot(),可切 matplotlib / plotly / bokeh
finmarketpy分析与回测:BacktestEngine / TradeAnalysis / curve
三库职责分工示意(依据三个库各自的官方 README 与包结构);示意非官方架构图,具体模块与边界以仓库代码为准。
Responsibilities

三库职责对比一览

下表的关键模块与类名都来自各自发布包解包实读(findatapy 0.1.42、chartpy 0.1.16、finmarketpy 0.11.19)。

一句话定位关键模块(实测)典型调用体量参考注意点
finmarketpy市场分析与策略回测backtest/(backtestengine、backtestrequest、tradeanalysis、backtestcomparison)、curve/economics/network_analysis/util/Backtest().calculate_trading_PnL(br, asset_df, signal_df)3,809 Star / 521 Fork它自身不取数也不出图,缺依赖会直接报导入错
findatapy统一接口下载市场数据market/(market、marketdatagenerator、marketdatarequest、ioengine、fxclsvolume)、timeseries/(calculations、calendar、dataquality、filter、retstats、timezone)、util/(cachemanager、configmanager、dataconstants、set_api_keys、tickerfactory、swimpool)Market(market_data_generator=MarketDataGenerator()).fetch_market(md_request)2,126 Star / 221 Forkvendor 模块为 bbg / crypto / databento / fred / web 等,不含 A 股行情源
chartpy多引擎绘图与报告chart.pyengine.pychartconstants.pycanvas.pystyle.pydashboard/report/(含 drawdown、front matter 等组件)Chart().plot(df, style=Style(file_output='x.png'))565 Star / 98 Fork依赖里含 pdfkitreportlabvispydataframe-image;出 PDF 报告时对系统组件有额外要求
为什么拆成三个:官方 README 的理由是「拆成更专一的小库后更容易让社区分别贡献」。对使用者来说更实际的好处是——你可以只用 findatapy 取数、配自己的分析代码,或只用 chartpy 出图,不必被迫接受一整套框架。
Data flow

一次研究里三库是怎么接上的

下面每一步都标注了「这一步出错该查哪个库」,这是三库结构最实用的地方。

  1. 描述数据需求(findatapy)

    MarketDataRequest(start_date=…, finish_date=…, freq='daily', data_source='alfred', tickers=['EURUSD'], vendor_tickers=['DEXUSEU'], fields=['close'], fred_api_key=…)出错查这里:ticker 写法、vendor_fields 名称、API key、缓存与代理设置。

  2. 取回行情表(findatapy)

    Market(market_data_generator=MarketDataGenerator()).fetch_market(md_request) 返回按日期索引、按 ticker 分列的 DataFrame。出错查这里:数据为空、时区错位、缺失日期、汇率交叉盘是否被正确推算。

  3. 生成信号(finmarketpy 的 economics 层)

    TechIndicator().create_tech_ind(spot_df, 'SMA', tech_params)get_signal()。除了技术指标,这一层还放着 EventStudySeasonalityVolStats出错查这里:指标周期参数、NaN 处理、信号命名。

  4. 跑回测与统计(finmarketpy 的 backtest 层)

    Backtest().calculate_trading_PnL(br, asset_df, signal_df, contract_value_df=None)portfolio_cum() / pnl() / portfolio_signal()TradeAnalysis().run_strategy_returns_stats(...)出错查这里:交易成本、信号延迟、杠杆与名义本金、年化因子。

  5. 出图(chartpy)

    style = Style(); style.title = …; style.source = 'FRED'; style.scale_factor = -1; style.file_output = 'x.png'; Chart().plot(port, style=style)。换 chartconstants 里的默认引擎即可把同一张图渲成 matplotlib / plotly / bokeh。出错查这里:引擎配置、字体、输出路径、交互图嵌 JS 的模式。

定位口诀:「数据不对 → findatapy;图不对 → chartpy;数字口径不对 → finmarketpy」。三者版本可以独立升级,所以出问题时先确认是哪一个库的行为变了。
License & support

免费吗、能商用吗、谁能给你兜底

这是中文资料里最常含糊过去的一块。下面每一条都能在官方文件里核对。

问题官方事实来源你该注意什么
代码是否免费三个库都是 Apache-2.0各仓库 LICENCE 与 GitHub 许可证字段可自由使用、修改、分发,注意保留许可声明
数据是否免费取决于数据源。官方的免费示范路径是 FRED/ALFRED;Bloomberg、Eikon、Databento 等需要各自授权README 与 findatapy README 的数据源说明代码许可不覆盖数据授权——这是最容易忽略的一条
能不能商用Apache-2.0 允许商用代码;但数据商用要单独确认数据商条款,且作者提供的商业服务与代码许可无关LICENCE 与 README 商业服务段对外发布研究结果前,先确认数据商是否允许再分发
有没有商业支持有。README 写明作者提供 2 天 Python for finance 企业培训与商业技术支持,并接受 GitHub Sponsors 赞助README「Sponsorship, workshops and support」段企业落地时这是比社区 issue 更快的路径;联系方式在 README 内
社区支持强度finmarketpy 开放 issue 约 43 个,主要贡献者集中在作者本人(贡献数 699),第二贡献者 50GitHub 公开 API(2026-09-20)单点维护项目——issue 响应时间不保证,排障能力要自备
能不能自己插一脚PLANNED_FEATURES.md 明确列了想让人帮忙的方向:回测提速、季节性的完整分解、Sphinx 文档、更多示例、pytest 测试PLANNED_FEATURES.md想贡献的话这里有现成的入口,尤其是「用 Sphinx 出文档」这条
Boundaries

拆分带来哪些边界:四个限制

知道边界,才不会在错的地方花时间。

边界一:不装 findatapy 就没有数据

finmarketpy 的示例全部通过 findatapy 取数,你自己写一个 DataFrame 也能喂进去,但那样就绕开了官方的数据清洗、时区与缓存链路。如果你想要官方的日历与数据质量工具(calendar.pydataquality.py),就必须留在 findatapy 这条路线上。

边界二:不装 chartpy 就没有图

BacktestTradeAnalysisBacktestComparison 内部直接引用 chartpy 的 ChartConstantsStyle。所以「装完跑出数字但没有图」通常不是回测错了,而是 chartpy 的引擎或字体没配好。

边界三:A 股要自己接数据

findatapy 的 vendor 模块清单里没有 A 股行情源,官方示例资产是 G10 外汇与 FRED 宏观序列。要做 A 股:自己取数成 DataFrame 再喂给回测接口,或者在免部署路线里用技能取数。本站不会把它描述成 A 股平台。

边界四:研究层,不是执行层

PLANNED_FEATURES.md 里「加一个基础的事件驱动回测器、可能包一层盈透」仍标注为低优先级待办。也就是说,实盘执行不在当前能力范围内。回测与模拟研究才是它的主场。

Decision

按需求怎么选:只用一个库还是三个一起

三个库可以单独安装使用,不必打包接受。下表按任务给出最小方案。

你的任务最小方案理由注意事项
只要统一接口取数只装 findatapy它是一个完全独立的包,README 明确说可以配你自己的分析库使用需要自己处理凭证与 ticker 库(tickerfactory + CSV 配置)
只要把数据画成图只装 chartpy支持在 matplotlib / plotly / bokeh 之间切换,另有 dashboard 与 report 组件PDF 报告链路依赖 pdfkit/reportlab,环境要求更高
要做外汇/宏观研究并回测三个都装只有 finmarketpy 自带 curve/ 与 economics/,而它依赖另外两个这就是官方 README 的默认路径
要做 A 股选股/技术面不必用这套数据层不覆盖 A 股,官方示例也不涉及免部署路线里的 akshare-finance / tushare-finance 等技能更对口
要做加密货币行情只装 findatapy 也够用包内有独立的 datavendorcrypto.py,示例里也有 crypto 相关脚本交易所接口与限流条款由交易所决定
要做期权定价/波动率曲面三个都装 + 可选 FinancePy曲面与定价器在 finmarketpy 的 curve/,可切 financepy 引擎FinancePy 要按指定版本 --no-deps 单独装,否则版本冲突
只想看 API 长什么样都不装官方提供两个 Binder notebook 可直接在线跑需要能连到 mybinder.org,部分数据仍需 key
FAQ

关于三库分工的常见问题

库的定位与模块以各自官方 README 与发布包为准;本站未实机运行验证。

pythalesians 是什么?和 finmarketpy 什么关系?

PyThalesians 是作者更早写的开源金融库,后来被合并进 finmarketpy,作者得以只维护一套代码。LICENCE 文件里还留着 “Merging finmarketpy with pythalesians” 的提交记录(10 年前)。今天你不需要单独装 pythalesians,遇到旧文章里出现这个包名,按 finmarketpy 理解即可,具体以官方仓库为准。

三个库可以分别用不同版本吗?

可以,它们是独立包、独立发版:findatapy 最新 0.1.42(2026-03-20)、chartpy 最新 0.1.16(2025-05-16)、finmarketpy 最新 0.11.19(2025-03-10)。但要注意 pyproject 里 chartpy 与 findatapy 没有写版本上限,所以自动解析可能装到「比 finmarketpy 发布时更新」的组合。出现异常时,用官方 README 给的 pip install -U --no-deps finmarketpy findatapy chartpy 同步升级三者、不动其它依赖,是最省事的排查动作。

chartpy 出图支持哪些引擎?要怎么切?

官方描述是 matplotlib、plotly、bokeh 等(包内还带 vispy 相关代码)。切换方式是改 chartconstants.py 里的默认引擎,或在调用时显式指定;具体参数名以包内 chartconstants.py 与你安装的版本为准——本站未实机验证参数细节,不在此处断言。

为什么我的图出来是空白 / 报字体错误?

先怀疑字体与引擎:官方 INSTALL.md 说明 chartpy 的 matplotlib 默认字体是 Open Sans,需要自行安装,并且安装后要删除 matplotlib 的字体缓存文件(如 fontList.py3k.cache),否则新字体不会被识别。其次检查输出路径是否为相对路径、工作目录是否可写。仍失败时按报错页的「输出段」排查。

findatapy 的 ticker 库是写死的吗?

不是。它通过 CSV 配置管理 ticker 别名(时间序列分类、字段别名、ticker 别名三张表),并且 README 明确告诉你:想保留自己的自定义 ticker 库,就把 config_root_folder 指到别处,否则每次升级 findatapy 都会被覆盖。这是它比较实用的一个设计,官方给了配置路径。以包内 conf/ 与 README 为准。

三个库都免费,那官方靠什么维持?

README 写得很直白:靠赞助与商业服务——GitHub Sponsors,以及 2 天企业内训和商业技术支持。作者同时说明这些收入会用于持续维护开源库。这不是本站的评价,是 README 里的原话意思。

分工清楚之后看什么:回测链路怎么跑通

回测链路只有四步,但每一步都有容易写错的口径:成本、信号延迟、杠杆与年化因子。先跑通,再逐项核对。