freqtrade list-freqaimodels 命令详解:FreqAI 模型清单、参数说明与源码级查找机制
在 Freqtrade 的 FreqAI 机器学习体系中,模型(Model)是策略的核心组件,但 FreqAI 模型不像策略那样在文档中被频繁展示。freqtrade list-freqaimodels 正是用来盘点当前环境中所有可用 FreqAI 模型的命令行工具:它会扫描内置模型目录、用户模型目录以及 --freqaimodel-path 指定的附加路径,按名称输出每个模型的类名、来源文件与加载状态。读完本文,你将掌握该命令的完整参数用法、两种输出模式的区别、模型搜索路径的优先级机制,以及它与 --freqaimodel 配置项和 REST API /freqaimodels 端点之间的调用关系。
命令概述与完整帮助输出
list-freqaimodels 是 Freqtrade CLI 的内置子命令之一,在 命令注册代码 中注册,帮助文本为 "Print available freqAI models."。它的命令行选项来自参数组 ARGS_LIST_FREQAIMODELS(即 freqaimodel_path 与 print_one_column 两项,定义于 arguments.py),再加上所有 list-* 命令共用的 Common arguments 父解析器。
官方文档 docs/commands/list-freqaimodels.md 由构建脚本 build_helpers/create_command_partials.py 自动从 argparse 解析器抓取生成(该脚本要求 Python 3.13+ 运行以保证输出格式一致),其完整内容如下:
usage: freqtrade list-freqaimodels [-h] [-v] [--no-color] [--logfile FILE]
[-V] [-c PATH] [-d PATH] [--userdir PATH]
[--freqaimodel-path PATH] [-1]
options:
-h, --help show this help message and exit
--freqaimodel-path PATH
Specify additional lookup path for freqaimodels.
-1, --one-column Print output in one column.
Common arguments:
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
--no-color Disable colorization of hyperopt results. May be
useful if you are redirecting output to a file.
--logfile, --log-file FILE
Log to the file specified. Special values are:
'syslog', 'journald'. See the documentation for more
details.
-V, --version show program's version number and exit
-c, --config PATH Specify configuration file (default:
`userdir/config.json` or `config.json` whichever
exists). Multiple --config options may be used. Can be
set to `-` to read config from stdin.
-d, --datadir, --data-dir PATH
Path to the base directory of the exchange with
historical backtesting data. To see futures data, use
trading-mode additionally.
--userdir, --user-data-dir PATH
Path to userdata directory.
命令专属选项
| 选项 | 源码定义位置 | 作用说明 |
|---|---|---|
--freqaimodel-path PATH |
cli_options.py | 指定一个附加的 FreqAI 模型查找路径。从源码结构看,该值会进入 config["freqaimodel_path"],并在解析器构建搜索路径时被插入到搜索列表的最前面,因此其优先级高于内置模型目录与 user_data/freqaimodels |
-1, --one-column |
arguments.py | 单列输出模式:每行仅打印一个模型类名,便于脚本/管道处理(如配合 grep、xargs) |
公共选项(Common arguments)
以下选项继承自所有子命令共用的父解析器,在 arguments.py 中统一定义:
| 选项 | 说明 |
|---|---|
-h, --help |
显示帮助信息并退出 |
-v, --verbose |
详细日志模式,-vv 更多,-vvv 输出全部消息 |
--no-color |
禁用输出着色,适合将输出重定向到文件 |
--logfile, --log-file FILE |
日志写入指定文件;特殊值 syslog、journald 可写到系统日志 |
-V, --version |
显示程序版本号并退出 |
-c, --config PATH |
指定配置文件;默认为 userdir/config.json 或 config.json(取存在者),可多次使用以叠加配置,设为 - 时从 stdin 读取 |
-d, --datadir, --data-dir PATH |
历史回测数据根目录(配合 trading-mode 可查看合约数据)。注意该命令本身并不读取历史数据,此项仅为公共参数统一注入 |
--userdir, --user-data-dir PATH |
指定 userdata 目录,直接决定模型搜索路径中的用户模型目录位置 |
命令入口实现:从 CLI 参数到模型清单
list-freqaimodels 的执行入口是 start_list_freqAI_models,其执行链路非常清晰:
- 调用
setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)完成配置加载与校验。这里使用RunMode.UTIL_NO_EXCHANGE,说明该命令不需要连接交易所、可以完全离线运行,适合在纯开发环境中盘点模型; - 调用
FreqaiModelResolver.search_all_objects(config, not args["print_one_column"])扫描所有搜索路径。第二个参数enum_failed的取值与输出模式绑定:表格模式下为True(导入失败的模块会被标记出来),单列模式下为False(导入失败的模块直接跳过); - 按模型名
sorted(..., key=lambda x: x["name"])字母序排序; - 根据
print_one_column决定输出方式:单列模式逐行print类名;表格模式交给共用的_print_objs_tabular函数渲染 Rich 表格。
单元测试 test_start_list_freqAI_models 验证了两种模式的行为:-1 模式下输出仅包含 LightGBMClassifier、LightGBMRegressor、XGBoostRegressor 等类名而不含 <builtin>/... 位置信息;默认表格模式则同时输出名称与位置列。
模型从哪里被找到:FreqaiModelResolver 的搜索路径机制
这是理解 list-freqaimodels 输出的关键。FreqaiModelResolver 继承自通用的 IResolver,通过四个类属性声明自己的解析规则:
| 属性 | 值 | 含义 |
|---|---|---|
object_type |
IFreqaiModel |
只识别 IFreqaiModel 接口的子类 |
object_type_str |
"FreqaiModel" |
报错信息中使用的对象类型名 |
user_subdir |
USERPATH_FREQAIMODELS |
用户模型目录名,即 user_data/freqaimodels(常量定义见 constants.py) |
initial_search_path |
freqtrade/freqai/prediction_models |
内置模型目录,对应仓库中的 freqtrade/freqai/prediction_models |
extra_path |
"freqaimodel_path" |
从 config["freqaimodel_path"](即 --freqaimodel-path)读取的附加路径 |
结合 IResolver.build_search_paths 的插入逻辑(extra_path 与用户目录均以 insert(0, ...) 插到列表头部),最终搜索顺序为:
--freqaimodel-path/freqaimodel_path(若设置)——最高优先级;user_data/freqaimodels/——用户自定义模型目录;freqtrade/freqai/prediction_models/——内置模型目录,输出中位置列带<builtin>/前缀(由 _build_rel_location 生成)。
内置模型目录当前包含 LightGBM 系列(LightGBMClassifier、LightGBMClassifierMultiTarget、LightGBMRegressor、LightGBMRegressorMultiTarget)、XGBoost 系列(XGBoostClassifier、XGBoostRFClassifier、XGBoostRFRegressor、XGBoostRegressor、XGBoostRegressorMultiTarget)、PyTorch 系列(PyTorchMLPClassifier、PyTorchMLPRegressor、PyTorchTransformerRegressor)、sklearn 分类器(SKLearnRandomForestClassifier)以及强化学习模型(ReinforcementLearner、ReinforcementLearner_multiproc)。注意这些模型依赖 requirements-freqai.txt / requirements-freqai-rl.txt 中的第三方库,若依赖未安装,对应模块在表格模式中会呈现为加载失败状态。
模型识别规则由 _get_valid_object 决定:只有在目标 .py 文件内部定义(obj.__module__ == module_name)且不是 IFreqaiModel 本身的类才算有效模型;导入时捕获 ModuleNotFoundError、ImportError 等异常并记录 warning。两个对实际使用有影响的行为:
- 表格模式(
enum_failed=True)下,导入失败的文件仍会列出,状态列显示LOAD FAILED(红色加粗);类名重复时显示DUPLICATE NAME(黄色),加载成功且唯一时显示OK(绿色)。这些状态逻辑在共用的 _print_objs_tabular 中实现,因此表头与list-strategies相同(Strategy name / Location / Status); - 单列模式(
enum_failed=False)下,导入失败的模块被直接跳过,输出中不会出现。
从源码结构看,search_all_objects 的 recursive 参数对 FreqAI 模型固定为 False(该命令没有类似 list-strategies 的 --recursive-strategy-search 选项),即模型文件必须位于上述三个目录的顶层,子目录中的模型文件不会被枚举。
与 FreqAI 主流程的关系
list-freqaimodels 是"只读盘点"命令,而真正加载模型供 FreqAI 策略使用走的是 FreqaiModelResolver.load_freqaimodel。两者共用同一套搜索路径,但加载逻辑有两点差异值得注意:
- 加载时读取的是
config["freqaimodel"](即 FreqAI 策略配置中的freqaimodel字段),未设置时抛出OperationalException提示使用--freqaimodel; - 存在一个禁止名单
disallowed_models = ["BaseRegressionModel"]:基类不允许被直接指定为运行模型,必须选择其具体子类或自行继承。
除了 CLI,Webserver 的 REST API 也复用同一个解析器:api_webserver.py 中的 GET /freqaimodels 端点同样调用 FreqaiModelResolver.search_all_objects,但固定 enum_failed=False 且只返回排序后的模型名列表({"freqaimodels": [...]})。因此 FreqUI 或 API 客户端中看到的模型清单与 freqtrade list-freqaimodels -1 的结果来源完全一致。
实战使用示例与常见问题
基本用法——列出所有模型(表格输出,含位置与状态):
freqtrade list-freqaimodels
脚本化用法——单列输出,配合 grep 检查某个模型是否可用:
freqtrade list-freqaimodels -1 | grep PyTorchTransformerRegressor
扫描私有模型仓库——将团队共享的模型目录加入查找路径:
freqtrade list-freqaimodels --freqaimodel-path /path/to/shared/models
由于 extra_path 被插入搜索路径最前,该目录中的同名模型会在搜索中先于 user_data/freqaimodels 与内置目录命中。同样的值也可以写入配置文件的 freqaimodel_path 字段(解析器通过 config.get(cls.extra_path) 读取),效果等价。
常见问题排查:
- 模型文件存在但列表中没有:确认文件位于
user_data/freqaimodels/、--freqaimodel-path指定目录或内置目录的顶层(不支持递归子目录),且文件中定义的是IFreqaiModel的子类并在文件内直接定义(不是从别处导入后再暴露); - 表格中出现 LOAD FAILED:通常是第三方依赖缺失(如未安装 FreqAI 的 requirements),可结合
-vv查看详细 warning,日志中会输出 "Could not import <文件> due to '<原因>'"; - 切换 userdata 目录:用
--userdir指向不同的 userdata 根目录,模型搜索的用户目录部分会随之变化; - 与
list-strategies的区别:两者共享表格渲染与解析框架,但 FreqAI 模型命令没有--recursive-strategy-search选项,且只识别IFreqaiModel子类而非策略类。
小结
list-freqaimodels 是 FreqAI 工作流中低门槛的"模型库存查询"入口:它不需要交易所连接,默认扫描内置 freqtrade/freqai/prediction_models、用户 user_data/freqaimodels 与 --freqaimodel-path 三类路径,并以带状态的 Rich 表格或纯类名两种形式输出。理解它背后的 IResolver 搜索路径优先级与 FreqaiModelResolver 的加载规则,能让你在自定义 FreqAI 模型、排查模型未加载问题以及对接 REST API /freqaimodels 端点时都有据可依。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00