文档1.0 (latest)
页面输入参数 · 14 / 29

输入参数

输入参数让您可以将策略代码中的值(例如回溯长度或最大开仓多单数量)变成可在运行对话框中设置的旋钮——每次想尝试新数值时无需编辑文件。同样的 params 机制适用于 Run backtest(回测)、Bulk forward(AutoTrading / QuantCloud)以及 Chart forward test 的算法参数。Test 在运行代码中介绍;多次运行的扫描在优化中介绍。普通 Run 不会填充 params。

本页涵盖该流程的两个部分:

  • 在 Python 文件中声明 params
  • 将这些 params 连接到运行对话框,以便您设置、保存和优化它们(另请参阅运行预设 (.qcs))

工作原理概览

  1. 在策略文件中,您导入一个特殊的 params 对象,并读取它的属性(例如 params.PERIOD)。
  2. IDE 扫描您的代码以发现这些名称,并在运行对话框(Test、bulk forward 或 chart forward)中列出。
  3. 您在对话框中为每个名称输入类型和值(或者在优化时定义扫描范围)。
  4. 开始运行时,引擎会在您的脚本运行之前用您的值填充 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名称(只读——来自您的代码)。
Typeint、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 的方式与回测对话框相同。

阅读约 3 分钟建议修改 ↗
输入参数 — 文档 (1.0 (latest)) | QuantCraft