Blankly / CLI 与部署状态
CLI 只剩两个命令:init 与 key,deploy 已被注释
README 的叙述是「本地开发,然后部署到 Blankly 平台」。但在当前发行版上执行 blankly --help,你会看到只有 init 和 key 两个子命令;源码里 login、logout、deploy 三者的子命令注册与实现函数被整段注释掉,连登录用的授权地址常量也是注释状态。这一页把实测输出与源码事实摆在一起,让你对「现在能用 CLI 做什么」有准确预期。
--help 输出与 blankly/deployment/new_cli.py 源码)。本页只陈述实测与源码事实,不推测官方后续计划。blankly --help 实测输出是什么?只有两个子命令
下面这段是实际执行 python -m blankly --help 得到的结果,未做删改。把它与 README 的叙述对照,差异就一目了然。
usage: blankly [-h] {init,key} ...
Blankly CLI & deployment tool
positional arguments:
{init,key}
init Initialize a new model in the current directory
key Manage model Exchange API keys
options:
-h, --help show this help message and exit
| 子命令 | 实测状态 | 它能做什么 | 注意点 |
|---|---|---|---|
init | 可用 | 在当前目录生成项目文件与示例脚本 | 目录非空时会先问是否继续;会覆盖同名文件前逐个询问 |
key | 可用 | 管理模型使用的交易所 API 密钥 | 下含 add / list / remove 三个动作 |
login | 源码中已注释 | — | 对应的授权地址常量同样处于注释状态 |
logout | 源码中已注释 | — | — |
deploy | 源码中已注释 | — | 其实现函数与所需的模型校验逻辑一起被注释 |
init <模板名> | 已禁用 | — | 执行后会直接打印 Starter models are currently disabled. |
blankly init 会生成哪六个文件?README 漏掉的是哪一个
blankly init 是这个 CLI 里最值得用的一条命令。它的交互流程与产出文件都是确定的,下表来自源码里的文件生成列表。
| 生成的文件 | 作用 | 你需要改什么 | README 是否提到 |
|---|---|---|---|
bot.py | 策略入口脚本,由模板生成 | 填入你的策略逻辑 | 是 |
backtest.json | 回测配置:价格字段、缓存路径、重采样频率、基准、无风险利率等 | 至少补 benchmark_symbol 与费率相关假设 | 是 |
keys.json | 交易所密钥文件,按交易所与组合名分组 | 填入真实密钥(并注意不要提交到版本库) | 是 |
settings.json | 全局与分交易所设置;缺失时构造交易所会直接报错 | 按需调整各交易所的计价币种与开关 | 是 |
blankly.json | 部署相关元信息:入口脚本名、模型类型、Python 版本等 | 一般无需改动 | 是 |
requirements.txt | 内容为 blankly 一行 | 建议改成锁定版本与 numpy 上限 | 否(README 只列了 5 个文件) |
init 的交互流程(源码顺序)
检查目录是否为空
如果当前目录已有可见文件,会先询问是否继续。预期:看到一次确认提示。注意它会遍历目录做检查,在文件很多的大目录里运行并不合适。
选择交易所
选项来自 CLI 的交易所清单,共 6 个交易所加一个 Keyless 选项。预期:选择结果决定后面模板里被替换的标的与计价币种。
选择模型类型与模板
类型只有 strategy 与 screener;模板各有「空壳」与「RSI 示例」两个。预期:选空壳得到一个可运行的骨架,选示例得到一份能跑通 RSI 双阈值逻辑的策略。
可选:录入密钥
如果前面选了具体交易所,会询问是否现在录入密钥。keys.json 无论如何都会生成,只是内容里是占位符。预期:跳过也可以,之后用 blankly key add 补。
生成文件并打印完成提示
完成后会提示「运行 python bot.py 即可跑一次回测」。预期:当前目录出现六个文件。
模板文件在包里哪个位置?占位符怎么替换
生成的 bot.py 不是凭空写的,它来自包内固定路径下的模板文件,并做了一次字符串替换。知道这件事之后,你就能直接读模板源码,而不用反复运行 init 去猜。
| 模板文件 | 它是什么 | 包含哪些占位符 | 怎么用 |
|---|---|---|---|
none.py | strategy 类型的空骨架 | 交易所名、类名、标的名、计价资产等占位符 | 从零开始写策略时选它 |
rsi_bot.py | strategy 类型的 RSI 示例 | 同上 | 想要一个能立刻跑通的参考实现时选它 |
none_screener.py | screener 类型的空骨架 | 同上 | 做横截面筛选时的起点 |
rsi_screener.py | screener 类型的 RSI 筛选示例 | 同上 | 想理解 Screener 用法时读它 |
keyless.py | Keyless 模式的完整示例 | 不含交易所占位符(离线场景不涉交易所) | 只想做离线回测时直接读这个文件 |
| 占位符 | 被替换成什么 | 影响 | 注意点 |
|---|---|---|---|
| 交易所展示名 | 所选交易所的显示名称 | 注释与提示文本 | 不影响运行逻辑 |
| 交易所类名 | 可直接构造的 Python 类,如 blankly.Alpaca | 决定连接哪个交易所 | 选 Keyless 时走另一条模板分支 |
| 标的列表 | 该交易所的默认标的列表 | 决定策略默认关注哪些标的 | 默认标的与该交易所品类相关(如美股、加密) |
| 单一标的 | 标的列表的第一项 | 模板里的默认交易标的 | 务必确认它符合你的交易场所与计价币种 |
| 计价资产 | 该交易所的计价币种 | 决定初始资金字典的键 | 键写错不会报错,但会让初始权益不对 |
keyless.py 是最短的完整示例,且不涉及密钥。如果你只想理解回测链路,读它比跑一遍 init 更快——不过要注意它内部用 requests 下载演示数据的那段,其链接目前返回 402,需要你自己准备价格文件。blankly key 有哪三个动作?密钥安全要注意什么
这是 CLI 里第二个可用的子命令。它的作用范围只限于模型目录下的密钥文件,理解这一点能避免误操作。
| 动作 | 做什么 | 操作对象 | 注意点 |
|---|---|---|---|
blankly key add | 交互式录入某交易所的密钥 | 模型目录下的密钥文件 | 会询问是否为测试网/沙箱密钥,这个标记会影响连接地址 |
blankly key list | 列出已录入的密钥 | 同上 | 输出会过滤掉仍是占位符的条目 |
blankly key remove | 删除指定密钥 | 同上 | 需要先有已录入的条目才会给出可选项 |
| 密钥文件的组织方式 | 按交易所 → 组合名 → 字段三层结构 | 同一交易所可以有多套密钥 | 「组合名」是框架引入的概念,用于区分多套凭证 |
| 沙箱标记 | 每个条目带一个布尔标记 | 影响连通性检查与下单地址 | 正式上线前务必确认该标记与你的意图一致 |
keys.json 会以明文形式存放在项目目录中。请务必确认它没有被提交进版本库(检查 .gitignore),并使用权限最小化的密钥——先只读连通性、再单独开放下单。密钥泄露的处理成本远高于多做一次权限收窄。CLI 现状对四类使用者分别意味着什么
命令面缩小并不代表框架不可用,但确实会改变你的工作流。下面按使用者类型说明替代方案。
| 你的目标 | CLI 现状下的影响 | 可用的替代做法 | 还剩什么没解决 |
|---|---|---|---|
| 只想跑通一个离线回测 | 几乎无影响 | init 生成配置文件,然后自己写策略脚本 | 要自己注意回测起止时间与默认费率 |
| 想用官方示例快速起步 | init <模板名> 已禁用 | 运行 init 时选择 RSI 模板,效果等价 | — |
| 想部署到官方托管平台 | CLI 无入口 | 自行在本地或自有服务器上运行脚本 | 需要自己解决进程守护、日志、重启与状态恢复 |
| 想管理多个交易所的密钥 | 不受影响 | blankly key add/list/remove | 密钥是明文存放,需自己控制访问权限 |
| 想接入 CLI 不支持的新交易所 | 不受影响(本来也不支持) | 手写密钥文件条目,并自行复用接口类 | 需要自己理解该接口的认证字段要求 |
关于 CLI 与部署的高频问题
回答基于当前发行版的实测输出与源码;本页不推测官方后续计划。
为什么 CLI 只有两个命令?
可核对的源码事实是:登录、登出、部署三个子命令的注册代码,以及它们对应的实现函数,连同授权地址常量,都处于注释状态。本站只能陈述这一状态,不推测这是临时还是长期安排。实际影响是你不能用 CLI 上传托管部署,但不影响本地回测与实盘脚本运行。
blankly init some-model 为什么直接退出?
因为该分支的实现里直接打印了「Starter models are currently disabled.」然后返回。也就是说通过模板名拉取官方起始项目的功能当前不可用。替代做法是直接运行不带参数的 init,在交互里选择「RSI 示例」模板——两者得到的策略结构是同一套模板体系。
生成的六个文件里哪个最容易被忽略?
requirements.txt。它生成时的内容只有「blankly」一行,既不锁版本也不限制 numpy 上限,而这两件事恰好是当前环境下能否导入成功的决定因素。建议把它改成 blankly 加 numpy<2,并在每次成功运行后 pip freeze 固化一份完整清单。
没有官方托管平台,策略怎么长期运行?
框架不限制运行方式,你可以在自己的机器或服务器上把脚本当作常驻进程运行。但要自行解决四件事:进程守护与自动重启、日志留存、崩溃后的持仓状态恢复,以及人工紧急停止开关。这四件事正好对应实盘前检查页运维部分的条目。
blankly.json 里的那些平台相关字段是什么?
模板里包含入口脚本名、模型类型、Python 版本等字段,同时在初始化结束时会把模型 ID、项目 ID 与一组 API 凭证字段删除。这从侧面说明当前 CLI 生成的本地项目与平台侧是解耦的——你得到一个纯本地的项目目录。
模板里的演示数据下载失败了怎么办?
Keyless 模板会通过一个外部链接下载演示行情文件,该链接在 2026-09-21 的探测中返回 HTTP 402(需要付费/配额受限),因此首次运行可能失败。替代做法是自己准备一份符合要求的六列 CSV,格式要求与常见错误见 Keyless 与数据读取器页。