BigQuant 2026年度私享会

SR-中证2000策略 before_start_days 参数设置影响分析报告

由peng1960hong创建,最终由peng1960hong 被浏览 16 用户

引言

前文《探析:量化交易策略回测绩效与实盘表现不一致》中“before_start_days (历史数据向前取的天数)”参数设置对于回测绩效与实盘(模拟交易)表现不一致的影响有所涉及,但例证数据不够详实,分析不够全面深入,本文以仍以策略文件:SR-中证2000策略-参数测试.ipynb 为例,对BigQuant 平台可视化编程StockRanker模型策略模块:m3(训练数据)、m4(预测数据)、m7(回测引擎) 中before_start_days (历史数据向前取的天数)参数不同设置影响回测绩效与实盘(模拟交易)表现不一致的原因进行更进一步的探析,并提出具有操作性的应对举措。(说明:本文部分内容系作者与BigQuant 平台Cowork交流互动生成,逐一检查核对汇入全文。)

\

一、研究背景与核心问题

1.1 问题的提出

在使用 SR(StockRanker)机器学习模型策略进行量化研究时,经常出现以下困惑:回测绩效良好,但实盘(模拟交易)表现明显不如预期,且两者的选股结果存在差异。导致这一现象的原因众多(过拟合、未来函数、数据泄露等),但其中有一类原因往往被忽视——before_start_days 参数在不同模块中的设置不当,导致回测与实盘使用了实质上不一致的数据计算逻辑

本文聚焦于此,通过以下方式进行验证:

机制分析:深入解析 m3、m4、m7 三个模块中 before_start_days 的技术作用及其对计算结果的影响;

对照实验:用两个不同时间起始点的样本(回测期分别从 2025-01-01 和 2025-04-21 开始),参数配置完全相同的条件下对比重叠期内的逐日选股结果;

参数修正实验:将 before_start_days 从 90 天调整为 200 天,观察差异是否显著收敛;

应对方案:提出可操作的参数规范化建议,使回测环境尽量贴近实盘环境。

1.2 before_start_days 参数的基本含义

在 BigQuant 平台中,before_start_days (参数单位为“自然日”)是 extract_data_dai 和 bigtrader 模块中的一个参数,其作用是:

核心作用:为时序窗口函数提供足够的历史数据做"预热"(warm-up),确保 start_date 当天的因子值不是基于不完整历史数据计算出的"冷启动"值。

单位强调:BigQuant 平台该参数以自然日计算(含周末节假日),与交易日不同:

\

二、SR-中证2000 策略架构与数据流

2.1 策略模块结构

2.2 三个模块的角色定位

三者在数据流中处于完全不同的位置,`before_start_days` 在每个模块中的作用机制和影响方向截然不同。

\

三、各因子的预热需求——确定理论下限

3.1 时序因子预热需求汇总

before_start_days 的核心功能是为时序窗口函数提供历史数据。对于每个时序因子,需要的最小自然日数(保证 start_date 当天计算有效)如下:

结论:本策略的时序因子技术最小预热需求为 ≈ 127 自然日(由 `m_lag(close, 90)` 决定)。

3.2 截面因子的特殊性

3.3 EMA 因子的特殊预热规律

综合结论:策略中技术最小预热需求 = 127 自然日(由 `m_lag(close,90)` 决定,EMA 因子无需额外添加)。

\

四、m3 模块分析——训练数据的预热与甜蜜点

4.1 m3 的作用

m3 负责抽取用于训练 StockRanker 模型的历史数据,时间范围为 2022-01-01 至 2024-12-31。其上游是 m2,m2 在 m1 因子的基础上加入了训练标注 label(基于未来5日收益的分位数分箱)。

4.2 当前 m3.before_start_days=90 的问题

4.3 m3 甜蜜点现象的机制

实际观测到的现象是:m3 的 before_start_days 存在一个"甜蜜点"——太小绩效差,在临界值附近绩效最好,超过临界值绩效反而下降。这与直觉("多取历史数据应无害")相悖,原因在于两个方向的效应相互博弈:

方向一:预热不足(before 太小时)

方向二:全局统计污染(before 太大时)

结论:m3.before_start_days 的甜蜜点是上述两个效应的平衡点。

4.4 m3 参数建议

\

五、m4 模块分析——预测数据与回测一致性的核心

5.1 m4 的作用

m4 负责抽取实盘预测所用的因子数据(时间范围为预测期:2025-01-01 至 2026-03-06),由训练好的 StockRanker 模型(m5)对这些数据进行打分,生成选股信号(m6)。m4 是连接"历史训练"与"未来预测"的桥梁,其数据质量直接决定模型打分的可靠性,进而影响实盘选股结果。

5.2 关键问题:m4 的 start_date 随回测起点动态变化

当前策略代码中,m4 的配置如下:

当用户在回测引擎(m7)中调整回测起始日期时,m4 的 `start_date` 也同步改变。 这意味着:不同的回测起点 → m4 的 start_date 不同 → query_start_date 不同 → 因子数据的历史覆盖范围不同 → 相同自然日的因子值可能不同 → 选股结果不同,这是回测绩效与实盘(模拟交易)结果不一致的重要隐性原因之一:实盘运行时只有一个固定的 m4 查询范围,而回测时可能用了不同查询范围的数据,两者的模型打分并不等价。

5.3 当前 m4.before_start_days=90 的预热不足问题

5.4 两样本 query_start_date 的差距与影响

5.5 m4 参数建议

方案B(快速修复):增大 before_start_days

方案A(根本解法):固定 m4 时间范围,独立于回测起点

方案A 的价值:确保不论何时开始回测、不论何时启动实盘,m4 生成的因子数据和模型打分完全一致——这是消除回测与实盘选股差异的根本措施

\

六、m7 模块分析——为何完全没有影响

6.1 现象

将 m7.before_start_days 设置为任意值(0、30、60、90……),回测绩效的净值曲线、选股结果、各项指标完全不变。

6.2 原因:信号预生成架构

SR-中证2000 策略采用的是信号预生成型架构。m7(bigtrader)的 handle_data 逻辑如下:

m7 不进行任何因子计算,只读取 m6 预先生成的仓位信号并下单执行。因此:

  • m7.before_start_days 仅控制行情数据(价格、成交量)的加载起点
  • 这些行情数据仅用于成交模拟(撮合、滑点、手续费计算),不影响选股
  • 选股逻辑在 m4→m5→m6 中已完全确定,m7 无法改变

m7.`before_start_days` 对任何策略绩效指标均无影响,这是架构特性而非偶然。 建议设为 0 以减少不必要的数据加载。

\

七、三模块横向对比

\

八、两样本选股对比实验一:m3=90, m4=90

8.1 实验设计

通过运行两个仅回测起点不同的样本,在参数相同的条件下比较重叠期的逐日选股结果。选股差异即代表"在不同时间启动回测/实盘时,策略给出的信号差异"。

8.2 实验结果

8.3 逐日差异明细(m3/m4=90)

8.4 按季度分布

8.5 关键时间节点解析

2025-06-27 首次完全相同的机制:

\

九、两样本选股对比实验二:m3=200, m4=200

9.1 实验设计

将 m3 和 m4 的 before_start_days 统一调整为 200 自然日,保持其他条件不变,观察两样本选股差异是否显著收敛。

参数调整后的 query_start_date 对比:

9.2 实验结果

9.3 逐日差异明细(m3/m4=200)

9.4 按季度分布(m3/m4=200 vs m3/m4=90)

9.5 差异演变对比图示

9.6 m4=200 后仍有残余差异的原因

Q2-2025 的 5 个差异日(2025-04-21 ~ 2025-05-22):

Q1-2026 的 2 个差异日(2026-01-14, 2026-02-04):

十、回测与实盘不一致的成因诊断与应对

10.1 与 before_start_days 直接相关的不一致成因

基于以上分析,本策略中由 before_start_days 配置不当导致的回测与实盘差异,可归结为以下三种具体机制:

成因一:m4.start_date 随回测起点动态变化(核心成因)

成因二:m4.before_start_days 不足,预测期头部数据缺失

成因三:m3 训练数据头部缺失,模型质量受损

10.2 诊断检验方法

10.3 before_start_days 之外的其他不一致成因

10.4 应对举措汇总

第一优先级:修复 m4 的耦合与预热问题(立即执行)

第二优先级:修复 m3 的训练数据缺失(建议执行)

第三优先级:标准化验证流程(建议建立)

\

十一、最终参数建议与效果预期

11.1 三模块参数对比

11.2 两次实验效果对比

11.3 核心结论

  • m3.before_start_days=90 严重不足:技术最小预热需求为 127 自然日,当前设置导致约 11% 的训练数据缺失,模型质量受损,且与回测过程中的数据使用方式不一致。

  • m4.before_start_days=90 且 start_date 动态耦合,是回测与实盘不一致的最直接原因:两样本实验用数字证明,相同参数下仅因起点不同就造成 76.7% 的调仓日选股差异,这正是"回测期与实盘期选股不同"在策略框架层面的等价证明。

  • m4=200 显著改善但无法根本消除差异:差异率从 76.7% 降至 20.9%,但只要 m4.startdate 仍然耦合于回测起点,就始终存在 query 范围差异,必须采用方案A(固定 startdate)才能从根本上消除。

  • m7.before_start_days 对任何指标均无影响:这是 SR 信号预生成架构的确定性特征,不需要也不应该为此花费调试精力。

  • 这套分析框架的价值:通过"两样本一致性测试",可以在实盘启动前以低成本的方式量化评估策略的数据一致性——差异率越低,回测绩效与实盘表现越可能一致。这是对抗"回测好看、实盘难看"现象的一个实用工具。


    SR-中证2000策略-参数测试代码

https://bigquant.com/codesharev3/0e78513e-6943-45f0-8ff0-7ad0440111ce




\

:::warning 风险提示

本文的分析结论基于策略代码的机制推导与两次对照实验数据。需注意:

  • 参数修改(尤其 m3 的变化)可能导致策略绩效与历史回测出现偏差,这不一定是"倒退",可能是修复了数据计算逻辑后更真实的绩效体现。
  • 即便消除了 before_start_days 相关问题,回测与实盘仍可能因过拟合、因子衰减、交易冲击等原因存在差距。
  • 建议参数修改后进行充分的样本外测试(比如,预留半年以上的时间段)、滚动回测验证,不依赖单一回测结果做出实盘决策。

:::

\

:::success 感谢BigQuant Cowork的大力协助!

:::


\









\

评论
  • 为调试方便,可以临时性地在m1和m2中设置expr_drop_na=False,保留空值,然后用df1=m1.data.read(),df2=m2.data.read() 去观察数据中是否存在空值,进而判断before_start_days是否满足预热要求。(read()的结果是pd.DataFrame,可以加一些条件快速筛选df[df.isnull().any(axis=1)])。
  • ema这类长期迭代式计算的时序函数,更难处理一些,非空值也可能是错误的计算结果。最理想的解决方案是用平台预计算好的因子数据,但是平台不可能提供所有参数组合的预计算数据,只会提供一些常用的参数组合。对误差敏感时应该自己预计算一个ema因子表,或者避免使用ema。
  • before_start_days是自然日而非交易日是平台回测引擎的一个坑,造成该参数估计上的不方便,希望能早日改成交易日吧。
  • 很好,我下来试一下。
{link}