FinMarketPy / 三库分工
三个库各管一段:取数归 findatapy、出图归 chartpy、回测归 finmarketpy
finmarketpy 的前身是 PyThalesians,作者把它拆成三个更小的专业库,好维护、也方便分别贡献。这个拆分决定了你后面所有问题的定位方向:取数报错要查 findatapy,出图报错要查 chartpy,只有回测口径与统计的问题才落在 finmarketpy。三库都是 Apache-2.0、同一作者维护,但版本节奏不同——findatapy 2026 年还在发版(0.1.42),chartpy 最新发布停在 2025-05(0.1.16)。
三库职责对比一览
下表的关键模块与类名都来自各自发布包解包实读(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 Fork | vendor 模块为 bbg / crypto / databento / fred / web 等,不含 A 股行情源 |
| chartpy | 多引擎绘图与报告 | chart.py、engine.py、chartconstants.py、canvas.py、style.py、dashboard/、report/(含 drawdown、front matter 等组件) | Chart().plot(df, style=Style(file_output='x.png')) | 565 Star / 98 Fork | 依赖里含 pdfkit、reportlab、vispy、dataframe-image;出 PDF 报告时对系统组件有额外要求 |
一次研究里三库是怎么接上的
下面每一步都标注了「这一步出错该查哪个库」,这是三库结构最实用的地方。
描述数据需求(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、缓存与代理设置。取回行情表(findatapy)
Market(market_data_generator=MarketDataGenerator()).fetch_market(md_request)返回按日期索引、按 ticker 分列的 DataFrame。出错查这里:数据为空、时区错位、缺失日期、汇率交叉盘是否被正确推算。生成信号(finmarketpy 的 economics 层)
TechIndicator().create_tech_ind(spot_df, 'SMA', tech_params)后get_signal()。除了技术指标,这一层还放着EventStudy、Seasonality、VolStats。出错查这里:指标周期参数、NaN 处理、信号命名。跑回测与统计(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(...)。出错查这里:交易成本、信号延迟、杠杆与名义本金、年化因子。出图(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 的模式。
免费吗、能商用吗、谁能给你兜底
这是中文资料里最常含糊过去的一块。下面每一条都能在官方文件里核对。
| 问题 | 官方事实 | 来源 | 你该注意什么 |
|---|---|---|---|
| 代码是否免费 | 三个库都是 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),第二贡献者 50 | GitHub 公开 API(2026-09-20) | 单点维护项目——issue 响应时间不保证,排障能力要自备 |
| 能不能自己插一脚 | PLANNED_FEATURES.md 明确列了想让人帮忙的方向:回测提速、季节性的完整分解、Sphinx 文档、更多示例、pytest 测试 | PLANNED_FEATURES.md | 想贡献的话这里有现成的入口,尤其是「用 Sphinx 出文档」这条 |
拆分带来哪些边界:四个限制
知道边界,才不会在错的地方花时间。
边界一:不装 findatapy 就没有数据
finmarketpy 的示例全部通过 findatapy 取数,你自己写一个 DataFrame 也能喂进去,但那样就绕开了官方的数据清洗、时区与缓存链路。如果你想要官方的日历与数据质量工具(calendar.py、dataquality.py),就必须留在 findatapy 这条路线上。
边界二:不装 chartpy 就没有图
Backtest、TradeAnalysis、BacktestComparison 内部直接引用 chartpy 的 ChartConstants 与 Style。所以「装完跑出数字但没有图」通常不是回测错了,而是 chartpy 的引擎或字体没配好。
边界三:A 股要自己接数据
findatapy 的 vendor 模块清单里没有 A 股行情源,官方示例资产是 G10 外汇与 FRED 宏观序列。要做 A 股:自己取数成 DataFrame 再喂给回测接口,或者在免部署路线里用技能取数。本站不会把它描述成 A 股平台。
边界四:研究层,不是执行层
PLANNED_FEATURES.md 里「加一个基础的事件驱动回测器、可能包一层盈透」仍标注为低优先级待办。也就是说,实盘执行不在当前能力范围内。回测与模拟研究才是它的主场。
按需求怎么选:只用一个库还是三个一起
三个库可以单独安装使用,不必打包接受。下表按任务给出最小方案。
| 你的任务 | 最小方案 | 理由 | 注意事项 |
|---|---|---|---|
| 只要统一接口取数 | 只装 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 |
关于三库分工的常见问题
库的定位与模块以各自官方 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 里的原话意思。