分析日期:2026-05-18
来源:
- JoinQuant Python3 版:https://www.joinquant.com/community/post/detailMobile?postId=aaaf43b0b39a46f1600cbf44f3cf8513
- JoinQuant Python2 原版:https://www.joinquant.com/community/post/detailMobile?postId=4351
相关本地流程:
这个工具本质上是一个“批量云端回测 + 结果抓取 + pkl 缓存 + 图表比较”的参数扫描框架。
它适合做第一轮参数观察,不适合直接当成自动寻优工具。跑出来的最优参数只能说明“这段历史里表现最好”,不能直接说明“未来也应该写回策略”。
手工调参通常要反复做这些事:
- 改策略里的某个参数。
- 提交一轮回测。
- 等回测结束。
- 复制收益、回撤、夏普等指标。
- 换下一组参数重复。
- 最后自己整理表格和图。
这个框架把这些重复动作封装到 parameter_analysis 类里,让研究环境自动完成大部分机械工作。
- 在策略里把要调的变量写成
g.xxx。 - 在研究环境里初始化
parameter_analysis(algorithm_id)。 - 用
param_names指定要改哪些参数。 - 用
param_values指定每个参数的候选值。 - 框架自动展开参数组合,生成多组回测配置。
- 通过
create_backtest在云端创建回测。 - 通过
running_max控制同时运行的回测数量,超过上限的自动排队。 - 回测完成后,用
get_backtest拉取每个回测的结果。 - 整理收益曲线、超额收益、年化收益、最大回撤、夏普率、波动率等指标。
- 保存为
results.pkl,下次可以直接读取,不必重新跑。 - 用内置函数画柱状图和收益曲线,人工比较参数表现。
get_backtest_data() 是最主要的入口。
常用参数:
algorithm_id:策略 ID,用来创建新回测。benchmark_id:可选,自定义基准的回测 ID。file_name:保存结果的 pkl 文件名,默认类似results.pkl。running_max:同时运行的回测数量上限。start_date/end_date:回测区间。frequency:日频或分钟频。initial_cash:初始资金。param_names:要调的参数名列表。param_values:每个参数对应的候选值列表。
例子:
param_names = ["factor", "quantile"]
param_values = [["BP"], [(0, 10), (10, 20), (20, 30)]]这表示固定 factor = "BP",再分别测试三个分位区间。
框架会把结果放在类对象里,也会保存到 pkl 文件。
关键对象:
params_df:每个回测对应的参数组合。evaluations:每个回测的原始指标字典。evaluations_df:指标和参数合并后的 DataFrame,更适合比较。backtest_ids:每组参数对应的回测 ID。benchmark_returns:基准收益曲线。returns:策略收益曲线。excess_returns:相对基准的超额收益曲线。log_returns:对数收益曲线。log_excess_returns:对数超额收益曲线。excess_max_drawdown:超额收益最大回撤。excess_annual_return:超额年化收益。
常用函数:
get_eval4_bar():画年化收益、最大回撤、夏普率、波动率。get_eval():画年化收益和最大回撤。get_excess_eval():画超额年化收益和超额最大回撤。plot_returns():画收益曲线。plot_excess_returns():画超额收益曲线。plot_log_returns():画对数收益曲线。plot_log_excess_returns():画对数超额收益曲线。
这些图的价值不是“自动给答案”,而是帮助快速看出:
- 参数变化后收益是否单调。
- 是否只是一两个参数点偶然好。
- 超额收益是否稳定。
- 回撤是否随收益一起变大。
- 不同参数之间是否差异足够明显。
Python3 版主要补了工程细节:
- 增加
python_version,默认使用 Python3 回测。 - 增加回测失败提示。
- 单个回测失败不会影响其他结果保存和分析,失败回测的收益等数据会以
nan表示。 - 解释了策略 ID、回测 ID、模拟交易 ID 的区别。
- 修复参数传递 DataFrame 时的数据类型问题。
- 增加
use_credit参数。 - 获取回测信息失败时会重试。
这些改动提升了可用性,但没有改变框架本质:它仍然是批量回测和结果整理工具。
- 能减少重复手工操作。
- 支持多参数组合。
- 能自动排队,适配聚宽同时回测数量限制。
- 结果可以缓存,后续分析不用重跑。
- 指标和图表比较比较完整。
- 适合因子分位、窗口参数、阈值参数的第一轮观察。
- 容易过拟合。历史最优参数不等于未来最优参数。
- 云端成本可能很高。参数组合数量会快速膨胀。
- 如果基准不合理,超额收益判断会失真。
- 如果只看整段回测,不看分年和分市场阶段,结论会偏乐观。
- 如果只看收益,不看回撤、换手、交易成本和失败样本,容易误判。
- 它没有默认做样本外、滚动窗口、bootstrap、年度拆分等稳健性检查。
本仓库已经有本地优先研究流程。这个 JoinQuant 框架更适合放在“云端确认”阶段,而不是替代本地筛选。
推荐顺序:
- 本地先用
scripts.research.cli做粗筛和复核。 - 本地只保留少量候选参数。
- 候选参数进入 JoinQuant 云端批量回测。
- 云端结果导出后,再回到本地做分年、滚动、样本外和稳定性检查。
- 只有通过稳健性检查的参数,才进入写回策略的讨论。
判断标准要分两层:
- 方向性支持:参数在历史回测里看起来更好,可以继续研究。
- 写回准备:参数通过多阶段稳定性检查,可以考虑进入默认配置。
两者不能混为一谈。
- 因子分位回测。
- MA 窗口、RSRS 窗口、动量窗口扫描。
- 阈值类参数的粗筛。
- 少量候选参数的云端确认。
- 已经有明确假设,只需要比较几组参数。
- 大范围盲目寻优。
- 几百上千组参数组合直接上云。
- 没有基准设计的策略比较。
- 只凭单次全样本回测决定默认参数。
- 本地已经能快速排除的弱候选。
使用这个框架后的结论建议按下面格式写:
本轮 JoinQuant 参数扫描显示,参数 A 在全样本收益和回撤上优于默认参数。
但该结果目前只构成方向性支持。
是否写回默认配置,还需要通过分年度、滚动窗口、样本外区间和成本敏感性检查。
这样可以避免把“回测最优”误写成“策略应采用”。
这个框架有用,但定位要清楚:它是批量回测执行器和结果整理器,不是参数真理机。
在本仓库里,它最合适的角色是:本地研究平台筛掉大部分弱参数后,用它在 JoinQuant 云端批量确认少量候选。