Skip to content

Latest commit

 

History

History
194 lines (138 loc) · 7.35 KB

File metadata and controls

194 lines (138 loc) · 7.35 KB

JoinQuant 参数分析框架分析报告

分析日期:2026-05-18

来源:

相关本地流程:

一句话结论

这个工具本质上是一个“批量云端回测 + 结果抓取 + pkl 缓存 + 图表比较”的参数扫描框架。

它适合做第一轮参数观察,不适合直接当成自动寻优工具。跑出来的最优参数只能说明“这段历史里表现最好”,不能直接说明“未来也应该写回策略”。

它解决什么问题

手工调参通常要反复做这些事:

  1. 改策略里的某个参数。
  2. 提交一轮回测。
  3. 等回测结束。
  4. 复制收益、回撤、夏普等指标。
  5. 换下一组参数重复。
  6. 最后自己整理表格和图。

这个框架把这些重复动作封装到 parameter_analysis 类里,让研究环境自动完成大部分机械工作。

核心流程

  1. 在策略里把要调的变量写成 g.xxx
  2. 在研究环境里初始化 parameter_analysis(algorithm_id)
  3. param_names 指定要改哪些参数。
  4. param_values 指定每个参数的候选值。
  5. 框架自动展开参数组合,生成多组回测配置。
  6. 通过 create_backtest 在云端创建回测。
  7. 通过 running_max 控制同时运行的回测数量,超过上限的自动排队。
  8. 回测完成后,用 get_backtest 拉取每个回测的结果。
  9. 整理收益曲线、超额收益、年化收益、最大回撤、夏普率、波动率等指标。
  10. 保存为 results.pkl,下次可以直接读取,不必重新跑。
  11. 用内置函数画柱状图和收益曲线,人工比较参数表现。

主要输入

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 版相对旧版的改动

Python3 版主要补了工程细节:

  • 增加 python_version,默认使用 Python3 回测。
  • 增加回测失败提示。
  • 单个回测失败不会影响其他结果保存和分析,失败回测的收益等数据会以 nan 表示。
  • 解释了策略 ID、回测 ID、模拟交易 ID 的区别。
  • 修复参数传递 DataFrame 时的数据类型问题。
  • 增加 use_credit 参数。
  • 获取回测信息失败时会重试。

这些改动提升了可用性,但没有改变框架本质:它仍然是批量回测和结果整理工具。

优点

  • 能减少重复手工操作。
  • 支持多参数组合。
  • 能自动排队,适配聚宽同时回测数量限制。
  • 结果可以缓存,后续分析不用重跑。
  • 指标和图表比较比较完整。
  • 适合因子分位、窗口参数、阈值参数的第一轮观察。

风险

  • 容易过拟合。历史最优参数不等于未来最优参数。
  • 云端成本可能很高。参数组合数量会快速膨胀。
  • 如果基准不合理,超额收益判断会失真。
  • 如果只看整段回测,不看分年和分市场阶段,结论会偏乐观。
  • 如果只看收益,不看回撤、换手、交易成本和失败样本,容易误判。
  • 它没有默认做样本外、滚动窗口、bootstrap、年度拆分等稳健性检查。

放到本仓库里的使用边界

本仓库已经有本地优先研究流程。这个 JoinQuant 框架更适合放在“云端确认”阶段,而不是替代本地筛选。

推荐顺序:

  1. 本地先用 scripts.research.cli 做粗筛和复核。
  2. 本地只保留少量候选参数。
  3. 候选参数进入 JoinQuant 云端批量回测。
  4. 云端结果导出后,再回到本地做分年、滚动、样本外和稳定性检查。
  5. 只有通过稳健性检查的参数,才进入写回策略的讨论。

判断标准要分两层:

  • 方向性支持:参数在历史回测里看起来更好,可以继续研究。
  • 写回准备:参数通过多阶段稳定性检查,可以考虑进入默认配置。

两者不能混为一谈。

适合使用的场景

  • 因子分位回测。
  • MA 窗口、RSRS 窗口、动量窗口扫描。
  • 阈值类参数的粗筛。
  • 少量候选参数的云端确认。
  • 已经有明确假设,只需要比较几组参数。

不适合使用的场景

  • 大范围盲目寻优。
  • 几百上千组参数组合直接上云。
  • 没有基准设计的策略比较。
  • 只凭单次全样本回测决定默认参数。
  • 本地已经能快速排除的弱候选。

建议结论模板

使用这个框架后的结论建议按下面格式写:

本轮 JoinQuant 参数扫描显示,参数 A 在全样本收益和回撤上优于默认参数。
但该结果目前只构成方向性支持。
是否写回默认配置,还需要通过分年度、滚动窗口、样本外区间和成本敏感性检查。

这样可以避免把“回测最优”误写成“策略应采用”。

最终判断

这个框架有用,但定位要清楚:它是批量回测执行器和结果整理器,不是参数真理机。

在本仓库里,它最合适的角色是:本地研究平台筛掉大部分弱参数后,用它在 JoinQuant 云端批量确认少量候选。