文档1.0 (latest)
页面优化 · 20 / 29

优化

QuantCraft 可以使用不同的输入参数值连续运行多次回测,并让您比较结果。从 Test 配置运行(运行代码);汇总结果显示在测试结果中。有两种搜索策略:

  • Brute force — 尝试您列出的值的每一种组合。
  • Genetic — 使用遗传算法,以少得多的运行次数探索大型搜索空间。

两种模式都在 Run backtest 对话框(Test 按钮)的 Script 标签页中配置,并且仅在您的脚本通过 quantcraft.inputs 声明参数时才会出现(为兼容现有脚本,较旧的 quantcraft.inputs_module / ide.inputs_module 路径仍会被匹配)。使用运行预设 (.qcs) 保存优化网格和其他对话框设置(optStep / optMax 会存储在回测预设中)。


在哪里找到

  1. 使用 IDE 工具栏中的 Test 按钮打开 Test 对话框。
  2. 打开 Script 标签页(当您的脚本从 quantcraft.inputs 或较旧的 quantcraft.inputs_module / ide.inputs_module 路径导入 params 时显示)。
  3. 启用 Optimize 并选择 Brute force 或 Genetic。

优化运行使用与普通回测相同的 Symbol & data 和 Simulation 设置。您只需配置参数如何变化。


启用优化后的参数表行为

启用优化后,Parameter values 表会多出两列:

列用途
Parameter脚本中的名称(只读)。
Typeint、float、bool 或 str。
Value对于数值类型,这是网格的起始值。对于 bool/str,它是固定值。
Step仅数值。相邻值之间的步长(正或负)。
Max仅数值。升序网格的上限,或降序网格的下限。

按类型的行为:

  • int / float — 值按 start, start+step, … 生成,直至并包括 Max(int 会取整)。
  • bool — 自动展开为 true 和 false(两个值)。
  • str — 保持固定;字符串参数不会变化。

当值无法展开时,每行会显示一个小的占位符(true / false 或 fixed),让您一眼就能看出哪些参数真正在变化。


暴力搜索(参数网格)

暴力搜索会评估您定义的值的每一种组合。如果您为 length 列出 5 个值、为 threshold 列出 4 个值,那就是 5 × 4 = 20 次回测。

限制与验证

  • 组合总数上限为 256 次运行。超过后,对话框会阻止提交,并给出明确消息,要求您扩大步长或从网格中移除参数。
  • 每个数值范围需要 Value(起始值)、Step 和 Max 三者齐全。Step 不能为 0。
  • 如果在所选的 Step 符号下,Max 无法从 Value 到达,对话框会说明问题(例如,正步长要求起始值 ≤ 最大值)。

运行时您看到的内容

提交暴力搜索优化时:

  • Test results 视图中会出现一个标题栏横幅:Optimization — <file> (current/total)。
  • 输出面板会记录每次运行及其参数组合,外加一行标题:Optimization (brute force): N backtest run(s).
  • 输出面板的进度条显示 Run X / N。
  • 提供 Stop 按钮 —— 已完成的运行会被保留并显示在结果中。

完成时您看到的内容

Test Results 窗格会显示 Optimization 视图:

  • 一个汇总脚本和已完成运行数量的标题。
  • 所有运行的标签栏,每个标签页以参数组合命名(例如 length=20, threshold=1.5)。当标签过长时,完整的组合会显示在活动运行的图表上方。
  • 选择一个标签页会显示该次运行的常规绩效视图(净值图表、指标、交易),因此您可以深入查看任何组合。
  • 如果运行在所有组合完成之前被停止,横幅会提示结果为部分结果。

遗传搜索

当暴力搜索的网格会过大时,遗传模式是正确的选择。它不是尝试每种组合,而是让一小群候选解经过若干代演化,保留最优者并进行重组。

超参数

将内部标签页切换到 Genetic,您会看到这些字段:

字段范围说明
Population size4 – 64每代评估的候选数量。典型值为 8–32。必须大于 Elitism。
Generations1 – 40每一代运行一整个种群的回测。
Elitism≥ 1,< 种群规模顶尖候选不变地复制到下一代。
Crossover rate0 – 1两个亲本产生混合子代的概率(否则复制第一个亲本)。
Mutation rate0 – 1每个基因随机跳变为另一个离散值的概率。
Fitness metric下拉列表搜索所最大化的目标(见下文)。
Random seed (optional)文本使用相同的种子可以精确复现一次搜索。

运行的回测总数为 population × generations。该乘积上限为 400 次评估 —— 如果超过,对话框会要求您降低其中一个值。

等位基因(每个参数可取的离散值)与暴力搜索构建的网格完全相同:

  • 数值参数使用 Value / Step / Max 创建离散列表。
  • Bool 参数变为 true / false。
  • 字符串参数是固定的(不影响搜索)。

遗传搜索需要至少一个可变化的参数(多于一个等位基因)。如果所有参数都是固定的,对话框会阻止提交,并要求您扩大数值网格或包含一个 bool。

适应度指标

下拉列表提供(越高越好):

  • Sharpe ratio(默认)
  • Sortino ratio
  • Total return
  • Total P/L ($)
  • Profit factor
  • Calmar ratio

该指标取自每次回测的账户绩效 —— 出错的运行会得到可能的最低适应度,因此始终排在最后。

运行时您看到的内容

  • 标题栏横幅:Genetic optimization — <file>,以及 Generation g of N, individual i of P。
  • 输出面板记录搜索:Genetic optimization: population P, N generation(s), fitness = …,然后对每次回测输出 ── Gen g/N, indiv i/P: <combo> ──。
  • 进度条显示 Gen g/N · i/P。
  • 第一批运行完成后,会立即出现部分结果面板 —— 已评估的候选按适应度排序,并带有 G<g>·… 前缀列出,让您无需等待整个搜索结束就能看出谁领先。

完成时您看到的内容

  • Test Results 窗格显示 Genetic optimization — <file>,以及所使用的适应度指标和运行次数。
  • 最终视图包含按适应度排序的最后一代,最佳者在最上面。每个标签页会打开该次运行的完整绩效视图。
  • 如果您按下 Stop,截至目前所有世代中已完成的评估会按适应度排序显示,横幅会提示搜索被提前停止。

实用提示

  • 从小处着手。 3 个参数、每个 10 个值的暴力搜索网格就已经是 1000 次运行 —— 远超 256 的上限。启用优化前先缩减步长。
  • 大空间优先使用 Genetic。 超过约 3 个数值参数时,几代遗传搜索通常比一个很小的暴力搜索网格更快、更有用。
  • 当您希望 Genetic 运行可复现时(例如用同一次搜索比较两个策略),请固定种子。
  • 放心使用 Stop。 两种模式都会保留已完成的运行,因此一旦出现明显的赢家,您就可以中断。
  • 有意识地选择适应度。 Sharpe 和 Sortino 奖励稳定性,Total return / Total P/L 追求原始增长,Profit factor 奖励盈亏平衡,Calmar 惩罚深度回撤。
  • 检查每次运行。 每个结果标签页都包含标准的净值图表、指标和交易历史 —— 您可以像单次回测一样导出任何一次运行的 HTML 报告。
阅读约 2 分钟建议修改 ↗
优化 — 文档 (1.0 (latest)) | QuantCraft