页面优化 · 20 / 29
优化
QuantCraft 可以使用不同的输入参数值连续运行多次回测,并让您比较结果。从 Test 配置运行(运行代码);汇总结果显示在测试结果中。有两种搜索策略:
- Brute force — 尝试您列出的值的每一种组合。
- Genetic — 使用遗传算法,以少得多的运行次数探索大型搜索空间。
两种模式都在 Run backtest 对话框(Test 按钮)的 Script 标签页中配置,并且仅在您的脚本通过 quantcraft.inputs 声明参数时才会出现(为兼容现有脚本,较旧的 quantcraft.inputs_module / ide.inputs_module 路径仍会被匹配)。使用运行预设 (.qcs) 保存优化网格和其他对话框设置(optStep / optMax 会存储在回测预设中)。
在哪里找到
- 使用 IDE 工具栏中的 Test 按钮打开 Test 对话框。
- 打开 Script 标签页(当您的脚本从
quantcraft.inputs或较旧的quantcraft.inputs_module/ide.inputs_module路径导入params时显示)。 - 启用 Optimize 并选择 Brute force 或 Genetic。
优化运行使用与普通回测相同的 Symbol & data 和 Simulation 设置。您只需配置参数如何变化。
启用优化后的参数表行为
启用优化后,Parameter values 表会多出两列:
| 列 | 用途 |
|---|---|
| Parameter | 脚本中的名称(只读)。 |
| Type | int、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 size | 4 – 64 | 每代评估的候选数量。典型值为 8–32。必须大于 Elitism。 |
| Generations | 1 – 40 | 每一代运行一整个种群的回测。 |
| Elitism | ≥ 1,< 种群规模 | 顶尖候选不变地复制到下一代。 |
| Crossover rate | 0 – 1 | 两个亲本产生混合子代的概率(否则复制第一个亲本)。 |
| Mutation rate | 0 – 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 报告。

