回测很容易重新运行,却也很容易在记录时漏掉关键条件。单看图表或结果表,通常看不出数据来源、成交假设,也看不出曾经尝试过多少组参数。我的目标是把这些选择写清楚,让下一次研究是在回答同一个问题,而不是不知不觉换了题目。
先定义研究范围,再运行测试
从一个具体问题开始,并把研究范围记录下来:
- 品种与合约规则: 写明代码、交易所、合约月份或连续合约构建方式,以及换月规则。
- 时间范围与时钟: 记录起止日期、时区、交易时段和 K 线周期。时区或时段定义不同,即使日期相同,实际样本也可能不同。
- 数据来源与字段: 说明数据来自哪里、何时取得、包含哪些字段,以及需要注意的数据权限或复权方式。条件允许时,保存原始文件或稳定标识和校验值。
- 策略与参数: 记录策略版本、所有参数、入场和退出规则,以及会影响订单处理的假设。若要判断结果变化由何而来,尽量一次只调整少数因素。
解释结果之前先检查数据:有没有缺失或重复的 K 线、异常时间戳、合约换月造成的跳变,或不符合该品种特征的数值。即使一项回测可以被精确复现,如果输入数据有误,结论仍可能产生误导。
区分三种不同的证据
历史回测是把规则应用于历史数据,并通过成交模型估计订单可能如何执行。结果取决于数据和执行假设,它不是实盘成交记录。
参数优化会评估一组候选配置,帮助观察结果如何随限定范围内的参数变化。但它不能证明表现最好的参数今后仍然有效。在同一段历史数据上尝试的组合越多,就越容易挑中恰好贴合噪声的一组。关于回测过拟合的研究讨论了为什么历史表现最好的配置可能在样本外失效(Bailey 等人的《The Probability of Backtest Overfitting》原文)。
模拟交易(Paper Trading)发生在券商的模拟环境中,可以帮助观察特定时期里的工作流和连接行为,但它既不等同于历史回测,也不等同于实盘执行。演示样例又是另一回事:它用于了解产品,不是策略表现的证据。
Algoryn 当前公开版本提供面向 MGC 的本地历史回测与有限范围参数优化工作流。这个描述有意限定在 MGC,不代表所有品种都有通用优化器,也不表示任何策略已经通过验证。软件可以帮助组织研究流程;研究者仍需检查数据、配置和假设。
把成本与成交假设记完整
记录使用的佣金和费用、买卖价差与滑点假设、订单类型、成交时点,以及部分成交或拒单等情况如何处理。如果某项成本或执行环节被省略或简化,也应注明。只扣除部分成本的结果不能随意与完整计入成本的结果比较;模型假设的成交也不能写成实际观察到的成交。
不要只给参数组起一个“基准”名称,却不保存数值。每次研究还应记下应用或代码版本、数据版本、运行日期、配置文件和人工修改。如果后续版本改变了行为,这些信息能帮助区分新结果与旧设置的重跑。
减少过度拟合的机会
在查看结果前,先根据理由确定有限的参数范围。把用于形成规则的数据与留待后续评估的数据分开;看到留出区间的结果后,不要反复移动边界或继续调参。时间序列需要按时间顺序处理,随机打乱 K 线可能把未来信息带进测试过程。
不要只盯着得分最高的那一组参数。还应查看相邻设置、不同市场阶段,以及结果对合理成本和数据假设的敏感程度。表现相对平稳的参数区域也不能证明未来表现;但如果结果只有一个尖锐的高点,就值得继续追问。记录每次尝试,或至少保留完整搜索范围,才能看清筛选过程的规模。
保存研究过程,而不是覆盖历史
每项研究都可以保留一份简短记录:研究问题、品种、日期、数据来源与标识、策略版本、参数、成本模型、验证区间、软件版本和输出文件。方法发生变化时,建立新的版本记录,而不是覆盖旧记录;同时注明改了什么、为什么改,不要看到有利结果后再补写理由。
研究记录的目的不是让每次测试都显得成功,而是让后来的人——包括未来的自己——能够重跑相同过程、看清局限,并判断下一步还需要验证什么。历史回测或模拟交易都不能保证未来表现;本文也不构成投资建议。