Blankly / CLI 与部署状态

CLI 只剩两个命令:init 与 key,deploy 已被注释

README 的叙述是「本地开发,然后部署到 Blankly 平台」。但在当前发行版上执行 blankly --help,你会看到只有 initkey 两个子命令;源码里 loginlogoutdeploy 三者的子命令注册与实现函数被整段注释掉,连登录用的授权地址常量也是注释状态。这一页把实测输出与源码事实摆在一起,让你对「现在能用 CLI 做什么」有准确预期。

实测:blankly --help依据:new_cli.py 源码实测版本:1.18.25b0不推测官方计划
init(可用)生成项目文件与示例脚本
key(可用)add / list / remove 三个子动作
login / deploy(已注释)源码中整段注释,help 里不出现
starter 模板(已禁用)调用后直接打印 disabled
CLI 命令面示意(依据 2026-09-21 实测 --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.
因此「部署到官方平台」这条路径在当前版本上不可用。注意这只说明 CLI 不提供该入口,并不说明平台本身是否存在或是否提供其它入口——本站没有登录过该平台,不做任何推断。
init 详解

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 选项。预期:选择结果决定后面模板里被替换的标的与计价币种。

  • 选择模型类型与模板

    类型只有 strategyscreener;模板各有「空壳」与「RSI 示例」两个。预期:选空壳得到一个可运行的骨架,选示例得到一份能跑通 RSI 双阈值逻辑的策略。

  • 可选:录入密钥

    如果前面选了具体交易所,会询问是否现在录入密钥。keys.json 无论如何都会生成,只是内容里是占位符。预期:跳过也可以,之后用 blankly key add 补。

  • 生成文件并打印完成提示

    完成后会提示「运行 python bot.py 即可跑一次回测」。预期:当前目录出现六个文件。

  • 模板来源

    模板文件在包里哪个位置?占位符怎么替换

    生成的 bot.py 不是凭空写的,它来自包内固定路径下的模板文件,并做了一次字符串替换。知道这件事之后,你就能直接读模板源码,而不用反复运行 init 去猜。

    模板文件它是什么包含哪些占位符怎么用
    none.pystrategy 类型的空骨架交易所名、类名、标的名、计价资产等占位符从零开始写策略时选它
    rsi_bot.pystrategy 类型的 RSI 示例同上想要一个能立刻跑通的参考实现时选它
    none_screener.pyscreener 类型的空骨架同上做横截面筛选时的起点
    rsi_screener.pyscreener 类型的 RSI 筛选示例同上想理解 Screener 用法时读它
    keyless.pyKeyless 模式的完整示例不含交易所占位符(离线场景不涉交易所)只想做离线回测时直接读这个文件
    占位符被替换成什么影响注意点
    交易所展示名所选交易所的显示名称注释与提示文本不影响运行逻辑
    交易所类名可直接构造的 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 不支持的新交易所不受影响(本来也不支持)手写密钥文件条目,并自行复用接口类需要自己理解该接口的认证字段要求
    FAQ

    关于 CLI 与部署的高频问题

    回答基于当前发行版的实测输出与源码;本页不推测官方后续计划。

    为什么 CLI 只有两个命令?

    可核对的源码事实是:登录、登出、部署三个子命令的注册代码,以及它们对应的实现函数,连同授权地址常量,都处于注释状态。本站只能陈述这一状态,不推测这是临时还是长期安排。实际影响是你不能用 CLI 上传托管部署,但不影响本地回测与实盘脚本运行。

    blankly init some-model 为什么直接退出?

    因为该分支的实现里直接打印了「Starter models are currently disabled.」然后返回。也就是说通过模板名拉取官方起始项目的功能当前不可用。替代做法是直接运行不带参数的 init,在交互里选择「RSI 示例」模板——两者得到的策略结构是同一套模板体系。

    生成的六个文件里哪个最容易被忽略?

    requirements.txt。它生成时的内容只有「blankly」一行,既不锁版本也不限制 numpy 上限,而这两件事恰好是当前环境下能否导入成功的决定因素。建议把它改成 blanklynumpy<2,并在每次成功运行后 pip freeze 固化一份完整清单。

    没有官方托管平台,策略怎么长期运行?

    框架不限制运行方式,你可以在自己的机器或服务器上把脚本当作常驻进程运行。但要自行解决四件事:进程守护与自动重启、日志留存、崩溃后的持仓状态恢复,以及人工紧急停止开关。这四件事正好对应实盘前检查页运维部分的条目。

    blankly.json 里的那些平台相关字段是什么?

    模板里包含入口脚本名、模型类型、Python 版本等字段,同时在初始化结束时会把模型 ID、项目 ID 与一组 API 凭证字段删除。这从侧面说明当前 CLI 生成的本地项目与平台侧是解耦的——你得到一个纯本地的项目目录。

    模板里的演示数据下载失败了怎么办?

    Keyless 模板会通过一个外部链接下载演示行情文件,该链接在 2026-09-21 的探测中返回 HTTP 402(需要付费/配额受限),因此首次运行可能失败。替代做法是自己准备一份符合要求的六列 CSV,格式要求与常见错误见 Keyless 与数据读取器页。

    下一步:确认交易所与实盘前要重验什么

    CLI 的边界清楚了之后,最后两件事是确认你的交易所接口当前状态,以及把回测搬到实盘前要逐项验证的清单。