页面输入参数 · 14 / 29
输入参数
输入参数让您可以将策略代码中的值(例如回溯长度或最大开仓多单数量)变成可在运行对话框中设置的旋钮——每次想尝试新数值时无需编辑文件。同样的 params 机制适用于 Run backtest(回测)、Bulk forward(AutoTrading / QuantCloud)以及 Chart forward test 的算法参数。Test 在运行代码中介绍;多次运行的扫描在优化中介绍。普通 Run 不会填充 params。
本页涵盖该流程的两个部分:
- 在 Python 文件中声明
params - 将这些 params 连接到运行对话框,以便您设置、保存和优化它们(另请参阅运行预设 (.qcs))
工作原理概览
- 在策略文件中,您导入一个特殊的
params对象,并读取它的属性(例如params.PERIOD)。 - IDE 扫描您的代码以发现这些名称,并在运行对话框(Test、bulk forward 或 chart forward)中列出。
- 您在对话框中为每个名称输入类型和值(或者在优化时定义扫描范围)。
- 开始运行时,引擎会在您的脚本运行之前用您的值填充
params,因此在您的文件被导入的那一刻,这些值就已可用。
输入会在 Run backtest、Bulk forward 和 Chart forward test 对话框中填充。普通 Run(
/ws/run)不会填充——如果希望同一个文件两种方式都能运行,请使用hasattr默认值。有关params何时对回调可见,请参阅策略生命周期。
在策略中声明 params
添加一个导入,并将每个参数名称作为 params 的属性引用:
from quantcraft.inputs import params
PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14
MAX_OPEN_LONGS = params.MAX_OPEN_LONGS if hasattr(params, "MAX_OPEN_LONGS") else 3
USE_FILTER = params.USE_FILTER if hasattr(params, "USE_FILTER") else True
LABEL = params.LABEL if hasattr(params, "LABEL") else "default"适用以下几条规则:
- 请写成
from quantcraft.inputs import params。 发现用的正则表达式也接受较旧的from quantcraft.inputs_module import params和from ide.inputs_module import params,以便现有脚本继续工作——参见参考——但新代码应使用quantcraft.inputs。它必须是from … import params的形式:import quantcraft.inputs as inp不会被检测到,因此 Script 标签页不会出现。 - 运行器会在入口脚本加载之前应用对话框中的值,这对策略文件中的
from quantcraft.inputs import params已经足够。 params是单一的“活动”对象。 每次运行都会替换其背后的值,因此它始终显示本次运行的输入——包括在早先的前向运行期间导入过它的辅助模块,以及同时处于活动状态的各个前向运行(彼此独立)。不带输入启动的运行看到的是空的params,绝不会是上一次运行的值。- 每个参数名称必须是有效的 Python 标识符(
A–Z、a–z、0–9、_,且不以数字开头);其他名称会被跳过。 - 每个输入必须在源代码中包含字面的
params.NAME标记,以便 IDE 发现。客户端通过正则匹配params.<标识符>;仅通过getattr(params, "NAME", default)引用的名称不会被发现,也不会出现在 Script 标签页上。getattr(params, "NAME", default)在运行时是有效的——只需在同一行保留字面的params.NAME以便发现。 - 您可以在文件的任何位置使用
params.NAME——顶层、on_init内、on_bar内等。每个唯一的引用都会成为对话框询问您的一个输入。 - 模块本身没有模式(schema)——您引用的名称就是模式。
避免(表单不会列出该参数):
MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token
PERIOD = 14 # no params reference常见写法:
def on_init():
global lookback
lookback = int(params.PERIOD)
def on_bar(bar_index, bar, fundamentals=None, symbol=None):
if bar.bars_back < lookback:
return
...提示:将值只读取一次到局部/全局变量中,这样就不必在每根 K 线上承担属性查找的开销。
连接 Test / 回测对话框
从编辑器工具栏(Test 按钮)打开 Test 对话框。当您的文件声明了 params.NAME 输入时,会出现带有参数行和 Optimize 的 Script 标签页。IDE 已经扫描了您的活动文件中的 params.NAME 引用,因此您使用的每个参数都会显示为一行。
对每一行,您需要设置:
| 列 | 您输入的内容 |
|---|---|
| Parameter | 名称(只读——来自您的代码)。 |
| Type | int、float、str、bool 之一(别名 integer、number、boolean 在传输中也被接受)。 |
| Value | 本次运行要使用的值。 |
关于 Type 选择的说明:
int/integer— 整数(例如14);千位分隔符可以接受(1,000→1000)。float/number— 小数(例如0.5、1e-3);数字中的逗号会被去除。bool/boolean—true/false、yes/no、y/n、on/off以及1/0(不区分大小写)。其他任何值都会以invalid boolean: …终止运行。对话框提供 True/False 选项。str— 自由文本,保持原样(去除首尾空白)。
开始回测时,对话框会将您的各行打包并发送给引擎。引擎会在您的 on_init() 运行之前将值设置到 params 上,因此:
from quantcraft.inputs import params
PERIOD = params.PERIOD # <- already filled by the time this line executes如果某个参数名称在对话框中没有对应的行(您删除了对话框条目,或您的文件引用了一个您尚未设置的全新名称),params 就不会有该属性,直接读取 params.NAME 会引发 AttributeError。请在对话框中添加该行并重新运行——或者使用上面展示的 hasattr + else 默认值模式(它仍然包含用于发现的 params.NAME 标记)。
您在对话框中的值会在多次运行之间被记住,因此无需每次重新输入。使用运行预设 (.qcs)保存并重新加载完整的参数集。
优化参数
在 Script 标签页上启用 Optimize,即可使用不同的参数组合多次运行您的策略。选择 Brute force 或 Genetic:
暴力搜索
对于每个参数行,对话框会在适用时添加 Step 和 Max 列:
int/float— 定义离散网格:起始值 → 步长 → 最大值。bool—true和false都会尝试。str— 保持固定(字符串参数不构成网格)。
引擎会运行这些离散值的每一种组合,并在 Test Results 视图中分别报告每次运行。
适用于小网格(少数几个参数,每个参数只有几个值)。组合数会迅速膨胀——请保持搜索空间适中。
遗传
对于更大的搜索空间,请切换到 Genetic,让进化式搜索在不尝试每个单元格的情况下找到较好的组合:
- Population size — 每一代评估的参数组合数量。
- Generations — 运行多少代(每一代是一整个种群的回测)。
- Elitism — 顶尖个体不变地复制到下一代。
- Crossover rate(
0–1)— 两个亲本产生混合子代的概率。 - Mutation rate(
0–1)— 某个基因跳变为另一个值的概率。 - Fitness metric — 要优化的指标(Sharpe、Sortino、总收益等)。
- Random seed (可选)— 种群和算子的可复现性。
两种模式都会在输出面板中显示实时进度(标题栏中的进度条),并提供 Stop 按钮以结束长时间运行。
优化完成后,Test Results 视图会按您的适应度指标对各次运行排序,您可以深入查看每一次。
提示
-
名称是从您的文件中发现的:如果某一行没有出现,请仔细检查您的
params.NAME引用,以及您是否从quantcraft.inputs导入params(对于现有脚本,较旧的quantcraft.inputs_module和ide.inputs_module路径也会被匹配)。 -
名称使用 UPPER_SNAKE_CASE — 按惯例,它们在您的代码中读起来像常量。
-
在对话框中提供合理的类型,使类型转换符合预期(例如,不要为
0.5这样的值设置int)。 -
布尔值不区分大小写 —
True、true、1、yes都会被判定为真。 -
使用 Optimize 进行参数搜索,而不是编辑器脚本:暴力搜索是穷举的,遗传搜索适用于更大的空间。
-
普通 Run 不会填充 params:点击 Run 时,
params不会被填充。如果希望同一个文件对 Run 和 Test 都适用,请使用hasattr默认值(并带有字面的params.NAME标记):from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 -
前向运行使用相同的发现规则 — bulk forward 和 chart forward 对话框扫描
params.NAME的方式与回测对话框相同。

