Blankly / 可用性验证 + 回测可信度
Blankly 还能用吗:一个「装得上但导入就报错」的 Python 量化框架
Blankly 的卖点是「同一份策略代码,回测、模拟盘、实盘只换个入口」。这份卖点在 2021–2023 年成立;到了 2026 年,公开时间线显示它的最新发行版停在 2023-07-23、默认分支最后一次提交停在 2024-12-30。本站在本机 Python 3.11 上完整跑了一遍安装与离线回测,结论是:装得上,但装完 import blankly 会直接失败,必须再钉一个 numpy<2 才能用。下面每一条结论都能在页脚给出的仓库与 PyPI 链接里核对。
项目来源
blankly-finance/blankly(GitHub 仓库首页截图)
打开仓库 ↗
Blankly 是什么,以及它现在的确切状态
先用一张表把「它想做什么」和「它现在是什么样」分开写。左半是官方定位,右半是可以核对的公开事实。
官方定位
一个算法交易生态,目标是让人用几行代码就构建、回测并部署股票、加密货币、期货、外汇的策略。主打「同一份代码可以在回测、模拟盘、沙箱、实盘之间切换」。
技术形态
纯 Python 包,PyPI 包名 blankly,主语言 Python,许可 LGPL-3.0。依赖里包含交易所 SDK(python-binance、alpaca-trade-api)、指标 C 扩展(newnewtulipy)与绘图库 bokeh。
时效状态
最新发行版 1.18.25b0 上传于 2023-07-23;默认分支最后一次 push 为 2024-12-30。全部历史版本都是 alpha/beta 命名,没有出现过稳定版。
使用量级
第三方下载统计显示近 30 天约 1.1 万次下载。也就是说「停更」不等于「没人在用」,但也不代表它能顺利跑起来——这正是本站要验证的部分。
| 要判断的事 | 官方说法 | 2026-09-21 可核对的事实 | 对使用者的实际影响 |
|---|---|---|---|
| 还能装吗 | README:pip install blankly | 能装,解析到 numpy 2.4.6 | 安装步骤本身走通,但见下一行 |
| 装了能导入吗 | README 未提及依赖上限 | 不能:ValueError: numpy.dtype size changed | 不做处理的话,整个包无法 import |
| 支持哪些 Python | README:3.7 / 3.8 / 3.9 / 3.10 | PyPI classifiers 同样只列到 3.10 | 3.11 需钉 numpy<2;3.12+ 依赖无轮子 |
| 还支持哪些交易所 | README 表格列 14 行 | CLI 实际只可选 6 个交易所 + Keyless | 两个口径不同,不能照 README 建策略 |
| 能部署到官方平台吗 | README:「本地开发后用平台部署」 | login/deploy 子命令在源码中已被整段注释 | 官方托管部署当前不经 CLI 提供 |
| 回测结果能直接信吗 | 工程文档强调模拟精度 | 默认无基准、无滑点模型、Keyless 零手续费 | 结论需要自己补对照与成本假设 |
| 适合拿来做什么 | 跨市场统一接口 | 离线事件驱动回测 + 已有指标/绩效函数可直接用 | 当「回测与策略实验框架」仍可用 |
按任务看:它能直接跑什么,跑不了什么
功能清单意义不大,实际问题永远是「我这个任务能不能落地」。下表把任务拆开,逐条说明在实测中它处在什么状态。
| 你想做的事 | Blankly 的对应能力 | 实测/源码状态 | 你还需要自己补什么 |
|---|---|---|---|
| 用历史数据跑策略回测 | Strategy.backtest() / Model.backtest() | 可用(离线数据实测通过) | 显式传 start_date/end_date,见首个回测页 |
| 不接交易所先试策略 | KeylessExchange + 自备价格文件 | 可用(需 settings.json) | CSV 必须含六列,见Keyless 页 |
| 算风险与绩效指标 | blankly.metrics 的 11 个函数 | 可用 | 框架不提供交易次数与胜率,要自己算 |
| 用内置技术指标 | blankly.indicators 的 28 个函数 | 可用 | 无官方中文说明,见指标清单页 |
| 接加密货币实盘 | Binance / Kucoin / Okx 等接口 | 代码存在,未做联网授权验证 | 密钥、权限、最小下单量都需自测 |
| 接美股实盘 / 模拟盘 | Alpaca / PaperTrade | 代码存在,依赖已弃用的 alpaca-trade-api | 需确认账号与接口版本仍兼容 |
| 接 A 股 | 无对应交易所实现 | 仓库内无 A 股/港股交易所类 | 需另配数据源,见交易所可用性矩阵 |
| 跑期货带杠杆/保证金 | BinanceFutures / FuturesStrategy | 官方文档自述「仍在 beta」;资金费率下载开发中 | 资金成本需自行处理 |
| 部署到官方云平台 | README 描述的 blankly platform | CLI 的 login/deploy 已注释 | 见CLI 与部署页 |
三条时间线放在一起,怎么判断该不该投入?
「项目是否还活跃」不需要靠感觉。仓库的提交时间、包管理器的发行时间、以及下载量三件事放在同一张表里,结论就没有争议空间。
| 观测项 | 数值 / 时间 | 怎么看这一项 | 注意点 |
|---|---|---|---|
| 仓库创建 | 2021-03-09 | 项目有超过 5 年历史,不是试验品 | 不代表代码随时代更新 |
| 默认分支最后提交 | 2024-12-30 | 距采集日约 9 个月无新提交 | 只能说明该分支最后 push 时间 |
| PyPI 最新发行 | 1.18.25b0 / 2023-07-23 | 距今超过 3 年没有新版本发布 | 这是比提交时间更硬的信号,因为用户装的正是它 |
| 发行版本命名 | 全部为 a0 / b0 | 从未发布过稳定版 | README 也没有承诺稳定版时间 |
| Star / Fork | 2.5k / 314 | 在量化框架里属于中等热度 | Star 是历史累积,不代表当前活跃 |
| 近 30 天下载量 | 约 1.1 万次 | 还有人在装 | 下载量包含 CI 与镜像,不等于活跃用户 |
| open issues | 39 | 开放问题不算失控 | 停更项目里 issue 通常不会被处理,需自行评估 |
| 依赖链健康度 | alpaca-trade-api 已被官方弃用;newnewtulipy 最新轮子停在 2022-11 | 依赖比主体更早进入停更 | 这是当前安装失败的直接来源 |
它是怎么把「一份代码跑四种环境」做到的
理解这一层之后,你会发现「回测和实盘只差一行」这句话在代码里究竟是什么样——以及它为什么不是字面意义上的一行。
| 机制 | 具体实现 | 它想解决什么 | 你需要留意的边界 |
|---|---|---|---|
| 统一交易所接口 | 每个交易所有一个 *_interface.py,向上暴露同一组方法(market_order、history、account 等) | 换交易所不改策略主体 | 各接口覆盖度不同,方法存在≠行为一致 |
| 回测即「模拟交易所」 | 回测由 paper trade 控制器驱动,把历史价格当作行情逐笔推给策略 | 回测路径与实盘路径共用同一套接口 | 模拟器自身的行为差异会直接进入结论 |
| 事件驱动 | 策略通过 add_price_event / add_event 注册回调,由引擎按时间推进触发 | 比向量化回测更接近真实成交时序 | 更慢;且时序取决于数据分辨率 |
| 状态容器 | StrategyState / Model 提供 variables、interface、base_asset | 策略不必自己管理上下文 | 状态里的东西在实盘与回测下的生命周期要自己确认 |
| 离线数据注入 | KeylessExchange(price_reader=...) | 不连交易所也能跑完整回测 | 数据格式与分辨率由读取器规则决定 |
| 环境判定开关 | 顶层 blankly.is_deployed 布尔值,官方模板写成 if blankly.is_deployed: strategy.start() else: strategy.backtest(...) | 让同一文件在本地与托管环境走不同分支 | 所以「只改一行」实际是 if/else 分支,且 is_deployed 只在存在 blankly_external 时为真 |
一次回测在最小区间里经历的四步
准备价格序列
从交易所接口取,或用一个本地文件喂进去。取数会落盘到 ./price_caches(默认开启持续缓存)。
构造策略对象并注册事件
strategy.add_price_event(fn, symbol=..., resolution='1d', init=init);init 里通常抓一段历史做指标预热。
引擎按时间推进并调用回调
每次价格推进触发一次回调,回调内用 state.interface.market_order() 下单,订单先过交易所 order filter 再成交。
回测结束返回结果对象
返回 BacktestResult,其 .metrics 给出 12 个绩效字段;它不是 dict,直接 print 只会看到对象地址。
三条路线该选哪一条?按你手上的条件
本站不假定你必须用 Blankly。下面三条路线对应的前置条件完全不同,先确认条件再选路线比先选工具更省时间。
路线 A:官方 pip 路线
适合已熟悉 Python 环境、需要跨交易所统一接口、并且接受自行维护依赖的人。前置条件是先用 Python 3.10 或 3.11 建独立虚拟环境,并在安装后钉住 numpy<2。这条路线拿到的是完整框架能力,包括实盘接口代码。
路线 B:只做离线回测
适合暂时不碰实盘、只想验证策略逻辑的人。用 KeylessExchange 加一个六列 CSV 就能跑完整回测链路,不需要任何 API 密钥,也不会有网络依赖。代价是必须显式传回测起止时间,且默认零手续费。
路线 C:先用技能盘做任务
如果你的真实目标是「拿到某只标的的区间指标」「把一条曲线画出来」「按条件筛一批股票」,而不一定要写一个可长期维护的策略工程,那么用 EasyClaw 的本机技能回答这类问题会更快——详见对比页的任务对照表。
| 你的情况 | 建议路线 | 理由 | 第一件该做的事 |
|---|---|---|---|
| 要写可长期维护的策略代码 | 路线 A | 只有完整框架能承接工程化需求 | 建虚拟环境 → 装 → 钉 numpy |
| 只想验证一个策略想法 | 路线 B | 离线回测零密钥,迭代最快 | 准备六列 CSV → 写 price_event |
| 要接加密货币实盘 | 路线 A | 交易所接口在框架内 | 先做 paper trading 再谈实盘 |
| 要查 A 股行情/财务/筛选 | 路线 C | Blankly 无 A 股交易所实现 | 看对比页的 A 股任务对照 |
| 要产出可交付的图表 | 路线 B 或 C | 框架内 Bokeh 出图;技能侧直接出图 | 确定图表口径与数据源 |
| 要跑多标的横截面筛选 | 路线 A(Screener)或 C | Blankly 有 Screener 基类,但 CLI 模板有限 | 先读三套框架页 |
| 不想装 Python 环境 | 路线 C | 技能路线不需要本地 Python 项目 | 看对比页的前置条件列 |
如果走路线 C:本机技能实际是什么交互形态
下面两张是本机 EasyClaw 的实际对话截图(单只股票、限定条件,非全市场海选)。请特别注意:这些结果的数据源与本项目 Blankly 无关,Blankly 与 EasyClaw 也无已证实集成——它们只用来展示「用自然语言完成取数与回测」这一类任务在技能路线下的操作形态。
谁适合花时间在 Blankly 上,谁不适合
没有一个框架适合所有人。下面这份判断清单是为了让你在读完安装页之前就能决定要不要继续。
适合:已有 Python 工程习惯的人
你能自己建虚拟环境、看得懂 pip 依赖解析结果、遇到 ABI 报错会去查轮子标签。这类人处理完安装问题后,能从框架里拿到真实价值:统一的交易所抽象、内置指标与绩效函数、事件驱动的回测循环。
适合:需要「回测—模拟盘—实盘」同一套代码的人
如果你的痛点是把策略从研究搬到执行时每次都要重写一遍,那 Blankly 的设计目标正好对准这件事。注意实盘路径仍需自行逐项验证,见实盘前检查页。
不适合:需要稳定长期维护依赖的团队
主包发行停在 2023-07,关键依赖 newnewtulipy 的轮子停在 2022-11,另一个依赖已被上游弃用。如果你们有合规或安全审计要求,这条依赖链需要单独评估。
不适合:目标市场是 A 股
仓库内没有 A 股或港股的交易所实现。你需要的 T+1、涨跌停、最小交易单位、交易日历这些规则,框架里没有对应支持,全部要自己在数据层和撮合层补。
不适合:想要开箱即用的可视化报告
回测结果里的图表依赖 bokeh 与 GUI_output 开关;绩效字段只有 12 个,且不含交易次数与胜率,要得到完整报告需要自己扩展。
不适合:只想问一个问题就走的人
如果你的需求是「查一下这只票的近 60 日年化波动率」,装一个停更框架的成本远高于直接用现成技能回答。这类任务可以直接走对比页里的技能路线。
本站的结论边界:哪些是实测,哪些只是引用
一份研究笔记的可信度取决于它把「我知道的」和「我引用的」分得多清楚。下面这张表逐类说明本站每类信息的证据等级。
| 信息类别 | 本站的处理方式 | 证据等级 | 读者应如何采信 |
|---|---|---|---|
| 安装与导入行为 | 在本机 Python 3.11.9 虚拟环境中完整执行并保留原始日志 | 实测 | 可直接复用报错原文;版本不同时结果可能变化 |
| 离线回测能否跑通 | 用自造的合成价格序列执行,记录成功与失败的调用方式 | 实测 | 只证明「调用方式成立与否」,不构成任何策略结论 |
| 回测返回的绩效字段 | 打印真实 BacktestResult.metrics 的字段名与显示名 | 实测 | 字段清单可直接引用;数值来自合成数据,无参考意义 |
| 指标与绩效函数数量 | 对已安装版本执行反射列出全部函数名 | 实测 | 数量与命名以该版本为准 |
| 回测引擎设计细节 | 引用仓库内工程文档 BACKTESTING_ENGINEERING.md | 官方文档 | 属官方自述,不是本站独立复现的结论 |
| 「一年回测 3 秒」等性能说法 | 标明来自官方文档,未复现 | 官方自述 | 不要当成本站测得的数据 |
| 交易所当前是否可用 | 只报告接口地址可达性探测与源码事实 | 探测 | 服务状态会变,以交易所公告为准 |
| EasyClaw 技能能力 | 引用本机技能目录中各技能自述文档 | 目录可见 | 「技能存在」不等于「已安装/已授权/已验证」 |
| Blankly 与 EasyClaw 的关系 | 全站明示:无已证实集成 | 未验证 | 不要把本站的路线对比读成集成声明 |
关于 Blankly 的高频问题
以下回答均基于 2026-09-21 的实测与公开接口;涉及代码行为的部分以官方仓库实现为准。
Blankly 现在还能装吗?装完能直接用吗?
能装。在本机 Python 3.11.9 上执行 pip install blankly 返回成功,并解析到 numpy 2.4.6 等依赖。但紧接着 import blankly 会失败,报 ValueError: numpy.dtype size changed, may indicate binary incompatibility,blankly --help 也同样报错退出。原因是包声明的 numpy>=1.21.4 没有上限,而提供指标 C 扩展的 newnewtulipy 是 2022 年编译的、与 numpy 2.x 的 ABI 不兼容。处置方式是先钉 numpy<2 再安装,本机实测可恢复正常导入。具体步骤与报错原文见安装页。
它是不是已经停止维护了?
本站不做这个判断,只给可核对的时间线:PyPI 最新发行 1.18.25b0 上传于 2023-07-23,默认分支最后一次提交是 2024-12-30,且历史版本全部是 alpha/beta 命名。你可以据此自行判断。需要提醒的是「停更」和「不能用」是两件事——它的离线回测链路在本机实测中仍然跑得通。
支持 A 股吗?
不支持。仓库的交易所实现里有 alpaca、binance、coinbase、ftx、kucoin、oanda、okx 等,但没有 A 股或港股的交易所类。如果你的目标是 A 股,需要自己去接数据源,并自行实现 T+1、涨跌停、最小交易单位与交易日历这类规则——这些不是配置项,而是框架里缺失的能力。
README 说「回测到实盘只改一行」,是真的吗?
官方模板里的写法是 if blankly.is_deployed: strategy.start() else: strategy.backtest(...)。也就是说策略回调函数确实可以复用,但「切换」是由环境判定分支完成的,而且 is_deployed 只在存在 blankly_external 模块时为真。更实际的问题是:即使代码复用,费率档位、最小下单量、拒单、断线、时区、持仓同步这些差异仍然必须逐项重验,清单见实盘前检查页。
回测结果里的数字能直接拿来下结论吗?
需要先补三件事。第一,backtest.json 的默认值里 benchmark_symbol 是 null,也就是默认没有基准对照;第二,官方工程文档明确写了当前没有滑点模型、假设无限挂单流动性;第三,KeylessExchange 的构造函数默认 maker_fee=0、taker_fee=0,用离线数据自测时手续费是零。这三点都会系统性抬高表面收益。详见回测引擎审计页。
和 Backtrader、Backtesting.py 这类框架比怎么选?
选型取决于你要的是「统一的多交易所实盘接口」还是「成熟的单机回测与研究生态」。本站不建议只看功能清单做决定,更有效的做法是拿你自己的一条真实策略分别在候选框架里跑一遍,比较三件事:装起来花了多久、数据怎么接、结果里有多少字段需要你自己算。本站只对 Blankly 做了实测,不对其他框架下结论。
本站的结论会不会过期?
会。所有涉及时间与版本的内容都标注了 2026-09-21 这个采集日期。如果你在很久之后读到这里,请先回到 GitHub 仓库看最新提交时间与 PyPI 看最新发行版本,再判断哪些结论仍然成立。本站不提供自动更新。