Blankly / 可用性验证 + 回测可信度

Blankly 还能用吗:一个「装得上但导入就报错」的 Python 量化框架

Blankly 的卖点是「同一份策略代码,回测、模拟盘、实盘只换个入口」。这份卖点在 2021–2023 年成立;到了 2026 年,公开时间线显示它的最新发行版停在 2023-07-23、默认分支最后一次提交停在 2024-12-30。本站在本机 Python 3.11 上完整跑了一遍安装与离线回测,结论是:装得上,但装完 import blankly 会直接失败,必须再钉一个 numpy<2 才能用。下面每一条结论都能在页脚给出的仓库与 PyPI 链接里核对。

实测环境:Python 3.11.9 / Windows实测版本:PyPI 1.18.25b0采集日期:2026-09-21LGPL-3.0

项目来源

blankly-finance/blankly(GitHub 仓库首页截图)

blankly-finance/blankly 的 GitHub 仓库页面截图 打开仓库 ↗
仓库首页截图,2026-09-21 采集。图中可见当时页面上标注的 2.5k Star / 314 Fork / LGPL-3.0 许可 / Python 语言;README 徽标显示累计下载 439k。截图只证明仓库页面与采集时点的可见信息,不代表任何策略或收益结论。
项目速览

Blankly 是什么,以及它现在的确切状态

先用一张表把「它想做什么」和「它现在是什么样」分开写。左半是官方定位,右半是可以核对的公开事实。

官方定位

一个算法交易生态,目标是让人用几行代码就构建、回测并部署股票、加密货币、期货、外汇的策略。主打「同一份代码可以在回测、模拟盘、沙箱、实盘之间切换」。

技术形态

纯 Python 包,PyPI 包名 blankly,主语言 Python,许可 LGPL-3.0。依赖里包含交易所 SDK(python-binancealpaca-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
支持哪些 PythonREADME:3.7 / 3.8 / 3.9 / 3.10PyPI classifiers 同样只列到 3.103.11 需钉 numpy<2;3.12+ 依赖无轮子
还支持哪些交易所README 表格列 14 行CLI 实际只可选 6 个交易所 + Keyless两个口径不同,不能照 README 建策略
能部署到官方平台吗README:「本地开发后用平台部署」login/deploy 子命令在源码中已被整段注释官方托管部署当前不经 CLI 提供
回测结果能直接信吗工程文档强调模拟精度默认无基准、无滑点模型、Keyless 零手续费结论需要自己补对照与成本假设
适合拿来做什么跨市场统一接口离线事件驱动回测 + 已有指标/绩效函数可直接用当「回测与策略实验框架」仍可用
一个必须写清楚的边界:本站没有、也不可能替官方下结论。上面「2026-09-21 可核对的事实」都来自当天的实测日志与公开接口;「还能不能长期维护」这个问题只能由仓库的后续提交回答。
① 安装与依赖边界装得上,但装完必须钉 numpy<2 才能 import
② 第一个离线回测Keyless 数据必须显式传起止时间
③ 回测引擎边界无滑点模型、默认无基准、离线零手续费
④ 实盘前检查费率、权限、拒单、时区都要重验
本站内容结构示意(依据 2026-09-21 实测证据整理,非官方架构图)。四个节点分别对应安装页、首个回测页、回测引擎审计页与实盘前检查页。
能力边界

按任务看:它能直接跑什么,跑不了什么

功能清单意义不大,实际问题永远是「我这个任务能不能落地」。下表把任务拆开,逐条说明在实测中它处在什么状态。

你想做的事Blankly 的对应能力实测/源码状态你还需要自己补什么
用历史数据跑策略回测Strategy.backtest() / Model.backtest()可用(离线数据实测通过)显式传 start_date/end_date,见首个回测页
不接交易所先试策略KeylessExchange + 自备价格文件可用(需 settings.jsonCSV 必须含六列,见Keyless 页
算风险与绩效指标blankly.metrics 的 11 个函数可用框架不提供交易次数与胜率,要自己算
用内置技术指标blankly.indicators 的 28 个函数可用无官方中文说明,见指标清单页
接加密货币实盘Binance / Kucoin / Okx 等接口代码存在,未做联网授权验证密钥、权限、最小下单量都需自测
接美股实盘 / 模拟盘Alpaca / PaperTrade代码存在,依赖已弃用的 alpaca-trade-api需确认账号与接口版本仍兼容
接 A 股对应交易所实现仓库内无 A 股/港股交易所类需另配数据源,见交易所可用性矩阵
跑期货带杠杆/保证金BinanceFutures / FuturesStrategy官方文档自述「仍在 beta」;资金费率下载开发中资金成本需自行处理
部署到官方云平台README 描述的 blankly platformCLI 的 login/deploy 已注释CLI 与部署页
最关键的一格是「接 A 股」。中文圈里很多 Blankly 相关内容默认面向美股和加密货币;如果目标市场是 A 股,Blankly 本身不提供交易所实现,你需要外部数据源 + 自己模拟 T+1、涨跌停与最小交易单位——这部分不是配置问题,是缺能力。
可用性结论

三条时间线放在一起,怎么判断该不该投入?

「项目是否还活跃」不需要靠感觉。仓库的提交时间、包管理器的发行时间、以及下载量三件事放在同一张表里,结论就没有争议空间。

观测项数值 / 时间怎么看这一项注意点
仓库创建2021-03-09项目有超过 5 年历史,不是试验品不代表代码随时代更新
默认分支最后提交2024-12-30距采集日约 9 个月无新提交只能说明该分支最后 push 时间
PyPI 最新发行1.18.25b0 / 2023-07-23距今超过 3 年没有新版本发布这是比提交时间更硬的信号,因为用户装的正是它
发行版本命名全部为 a0 / b0从未发布过稳定版README 也没有承诺稳定版时间
Star / Fork2.5k / 314在量化框架里属于中等热度Star 是历史累积,不代表当前活跃
近 30 天下载量约 1.1 万次还有人在装下载量包含 CI 与镜像,不等于活跃用户
open issues39开放问题不算失控停更项目里 issue 通常不会被处理,需自行评估
依赖链健康度alpaca-trade-api 已被官方弃用;newnewtulipy 最新轮子停在 2022-11依赖比主体更早进入停更这是当前安装失败的直接来源
本站的判断口径(可被反驳):如果一个项目的「最新发行版时间」已经超过 3 年,那么它对于「新项目选型」的优先级就应该降低;但对于「已有策略想在框架内做实验」,只要安装问题有确定解法,它仍然可用。这两件事不矛盾——区别在于你是否愿意承担依赖链的维护成本。
工作机制

它是怎么把「一份代码跑四种环境」做到的

理解这一层之后,你会发现「回测和实盘只差一行」这句话在代码里究竟是什么样——以及它为什么不是字面意义上的一行。

机制具体实现它想解决什么你需要留意的边界
统一交易所接口每个交易所有一个 *_interface.py,向上暴露同一组方法(market_orderhistoryaccount 等)换交易所不改策略主体各接口覆盖度不同,方法存在≠行为一致
回测即「模拟交易所」回测由 paper trade 控制器驱动,把历史价格当作行情逐笔推给策略回测路径与实盘路径共用同一套接口模拟器自身的行为差异会直接进入结论
事件驱动策略通过 add_price_event / add_event 注册回调,由引擎按时间推进触发比向量化回测更接近真实成交时序更慢;且时序取决于数据分辨率
状态容器StrategyState / Model 提供 variablesinterfacebase_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 股行情/财务/筛选路线 CBlankly 无 A 股交易所实现看对比页的 A 股任务对照
    要产出可交付的图表路线 B 或 C框架内 Bokeh 出图;技能侧直接出图确定图表口径与数据源
    要跑多标的横截面筛选路线 A(Screener)或 CBlankly 有 Screener 基类,但 CLI 模板有限先读三套框架页
    不想装 Python 环境路线 C技能路线不需要本地 Python 项目看对比页的前置条件列
    技能路线演示

    如果走路线 C:本机技能实际是什么交互形态

    下面两张是本机 EasyClaw 的实际对话截图(单只股票、限定条件,非全市场海选)。请特别注意:这些结果的数据源与本项目 Blankly 无关,Blankly 与 EasyClaw 也无已证实集成——它们只用来展示「用自然语言完成取数与回测」这一类任务在技能路线下的操作形态。

    第二张图为什么值得看:它给出的不是「漂亮收益」,而是**负收益加两条约束提醒**(A 股按 100 股一手、10 万元资金不足以买入一手;7 笔交易含 1 笔未平仓)。这正好对应本站的立场:回测结果的价值在于把口径与约束讲清楚,而不在于收益率好不好看。Blankly 的汇总字段里没有交易次数与胜率,这些约束也不会自动告诉你——工具不同,但「先问口径」这件事在哪条路线上都成立。
    为什么把这条路线放在首页:本站的目标是把「适合的用户」引导到 EasyClaw,而不是把所有人引导过去。判断依据就是上面的 route-choice 表——如果你的任务正好落在技能路线覆盖的范围内,那么切换路线比修复一条停更依赖链更划算。
    适合谁

    谁适合花时间在 Blankly 上,谁不适合

    没有一个框架适合所有人。下面这份判断清单是为了让你在读完安装页之前就能决定要不要继续。

    适合:已有 Python 工程习惯的人

    你能自己建虚拟环境、看得懂 pip 依赖解析结果、遇到 ABI 报错会去查轮子标签。这类人处理完安装问题后,能从框架里拿到真实价值:统一的交易所抽象、内置指标与绩效函数、事件驱动的回测循环。

    适合:需要「回测—模拟盘—实盘」同一套代码的人

    如果你的痛点是把策略从研究搬到执行时每次都要重写一遍,那 Blankly 的设计目标正好对准这件事。注意实盘路径仍需自行逐项验证,见实盘前检查页。

    不适合:需要稳定长期维护依赖的团队

    主包发行停在 2023-07,关键依赖 newnewtulipy 的轮子停在 2022-11,另一个依赖已被上游弃用。如果你们有合规或安全审计要求,这条依赖链需要单独评估。

    不适合:目标市场是 A 股

    仓库内没有 A 股或港股的交易所实现。你需要的 T+1、涨跌停、最小交易单位、交易日历这些规则,框架里没有对应支持,全部要自己在数据层和撮合层补。

    不适合:想要开箱即用的可视化报告

    回测结果里的图表依赖 bokehGUI_output 开关;绩效字段只有 12 个,且不含交易次数与胜率,要得到完整报告需要自己扩展。

    不适合:只想问一个问题就走的人

    如果你的需求是「查一下这只票的近 60 日年化波动率」,装一个停更框架的成本远高于直接用现成技能回答。这类任务可以直接走对比页里的技能路线。

    边界与披露

    本站的结论边界:哪些是实测,哪些只是引用

    一份研究笔记的可信度取决于它把「我知道的」和「我引用的」分得多清楚。下面这张表逐类说明本站每类信息的证据等级。

    信息类别本站的处理方式证据等级读者应如何采信
    安装与导入行为在本机 Python 3.11.9 虚拟环境中完整执行并保留原始日志实测可直接复用报错原文;版本不同时结果可能变化
    离线回测能否跑通用自造的合成价格序列执行,记录成功与失败的调用方式实测只证明「调用方式成立与否」,不构成任何策略结论
    回测返回的绩效字段打印真实 BacktestResult.metrics 的字段名与显示名实测字段清单可直接引用;数值来自合成数据,无参考意义
    指标与绩效函数数量对已安装版本执行反射列出全部函数名实测数量与命名以该版本为准
    回测引擎设计细节引用仓库内工程文档 BACKTESTING_ENGINEERING.md官方文档属官方自述,不是本站独立复现的结论
    「一年回测 3 秒」等性能说法标明来自官方文档,未复现官方自述不要当成本站测得的数据
    交易所当前是否可用只报告接口地址可达性探测与源码事实探测服务状态会变,以交易所公告为准
    EasyClaw 技能能力引用本机技能目录中各技能自述文档目录可见「技能存在」不等于「已安装/已授权/已验证」
    Blankly 与 EasyClaw 的关系全站明示:无已证实集成未验证不要把本站的路线对比读成集成声明
    投资风险披露:本站是开源项目的中文研究笔记,所有回测相关内容都在自造的合成价格数据上完成,用于验证代码是否可运行,不包含任何标的的收益率结论,也不构成投资建议。真实交易存在本金损失风险,任何策略上线前都应自行做样本外与成本压力测试。
    FAQ

    关于 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 incompatibilityblankly --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_symbolnull,也就是默认没有基准对照;第二,官方工程文档明确写了当前没有滑点模型、假设无限挂单流动性;第三,KeylessExchange 的构造函数默认 maker_fee=0taker_fee=0,用离线数据自测时手续费是零。这三点都会系统性抬高表面收益。详见回测引擎审计页。

    和 Backtrader、Backtesting.py 这类框架比怎么选?

    选型取决于你要的是「统一的多交易所实盘接口」还是「成熟的单机回测与研究生态」。本站不建议只看功能清单做决定,更有效的做法是拿你自己的一条真实策略分别在候选框架里跑一遍,比较三件事:装起来花了多久、数据怎么接、结果里有多少字段需要你自己算。本站只对 Blankly 做了实测,不对其他框架下结论。

    本站的结论会不会过期?

    会。所有涉及时间与版本的内容都标注了 2026-09-21 这个采集日期。如果你在很久之后读到这里,请先回到 GitHub 仓库看最新提交时间与 PyPI 看最新发行版本,再判断哪些结论仍然成立。本站不提供自动更新。

    下一步:为什么先解决「装得上」这件事?

    如果你的判断是要继续用 Blankly,那么第一步不是写策略,而是把依赖钉到能 import 的状态。安装页给出完整报错原文、依赖解析结果与实测可用的处置顺序。