2. 回测基础
一、什么是回测:从“事后检验”到“可复现实验”
回测(Backtesting)是指在历史数据上模拟一套模型或策略的决策过程,并据此评估其表现的方法。它的本质不是“证明模型能赚钱”,而是回答一个更朴素的问题:如果过去按这套规则执行,会发生什么?在量化投资、信用评分、推荐系统、需求预测等场景中,回测都是模型从实验室走向生产环境前的关键关卡。
一个严谨的回测至少包含四个要素:历史数据、决策规则、执行假设和评估指标。缺少任何一项,回测结果都可能失真。例如,用未来数据训练模型再回测过去,会得到虚高的收益;忽略交易成本,会把高频策略的利润全部吃掉;只报告准确率而不看回撤,会掩盖模型在极端行情下的脆弱性。
二、历史演变:从手工验算到事件驱动引擎
回测并非伴随计算机诞生。早期交易员用纸笔和行情图手工复盘,逐笔核对买卖点,效率低且难以覆盖大量标的。20世纪70年代后,随着数据库和编程语言普及,向量化回测开始出现:把价格序列当作数组,用矩阵运算一次性计算信号和收益。这种方式速度快,但难以处理仓位变化、止损和资金约束。
90年代到2000年代,事件驱动回测框架逐渐成熟。它按时间顺序逐条推送行情事件,模拟订单、成交、持仓和资金曲线,更接近真实交易。与此同时,学术界提出了一系列偏差修正方法,如样本外测试、滚动窗口、多重检验校正等,回测从“跑一个数字”演变为一套方法论。
近年来,回测进一步与工程化结合:容器化环境、版本化数据、自动化报告、并行参数扫描成为标配。回测不再是一次性脚本,而是可复现、可审计、可协作的实验平台。
三、在模型开发中的定位:不是终点,而是过滤器
在完整的模型开发流程中,回测位于“模型训练与调参”之后、“实盘部署”之前。它承担三个角色:
- 过滤器:快速淘汰明显无效或过拟合的模型,避免浪费实盘资源。
- 诊断器:暴露模型在特定市场状态、时间段或标的上的弱点。
- 沟通工具:用统一的指标和图表,让策略研究员、风控和投资经理对模型表现形成共识。
需要强调的是,回测不是实盘的替代品。它无法模拟流动性枯竭、交易所故障、网络延迟等真实摩擦。因此,回测通过只是必要条件,而非充分条件。
四、方法流程:一个可落地的回测清单
下面给出一个通用的回测流程清单,适用于多数预测型或交易型模型:
| 阶段 | 关键动作 | 常见产出 |
|---|---|---|
| 1. 定义目标 | 明确预测目标、评估周期、约束条件 | 回测需求文档 |
| 2. 准备数据 | 清洗、对齐、划分训练/验证/测试集 | 数据版本与血缘记录 |
| 3. 设定假设 | 手续费、滑点、成交延迟、仓位限制 | 假设配置文件 |
| 4. 执行回测 | 按时间推进,记录信号、订单、持仓、盈亏 | 交易日志与资金曲线 |
| 5. 评估分析 | 计算收益、风险、稳定性指标 | 回测报告 |
| 6. 复盘迭代 | 归因分析,修正假设或模型 | 改进项列表 |
在工程实现上,一个最小回测循环可以用伪代码表示:
for t in timeline:
data = market_data[t]
signal = model.predict(data)
order = risk_manager.adjust(signal, position)
fill = broker.execute(order, data)
portfolio.update(fill)
recorder.log(t, signal, order, fill, portfolio)
report = analyzer.summarize(recorder)
这段代码的关键在于时间顺序:模型只能看到当前及之前的数据,订单必须经过风控和撮合,所有中间状态都被记录,以便事后审计。
五、案例场景:一个均线策略的回测复盘
假设我们开发一个简单的双均线策略:当短期均线上穿长期均线时买入,下穿时卖出。在回测中,如果不考虑交易成本,策略可能显示年化收益20%;加入单边0.1%手续费和0.05%滑点后,收益可能降至8%;如果再加入“信号出现后下一根K线开盘成交”的延迟假设,收益可能进一步降到5%。
这个案例说明:回测结果对假设极其敏感。很多看似有效的策略,在加入现实约束后优势消失。因此,回测报告必须同时展示基准假设和敏感性分析,而不是只给一个孤立的收益数字。
六、常见误区与复盘要点
- 未来函数:使用了当时无法获得的数据,如用收盘价决定开盘交易。
- 幸存者偏差:只回测当前仍存在的标的,忽略了已退市或违约的样本。
- 过拟合:在历史数据上反复调参,直到曲线完美,但样本外失效。
- 忽略容量:策略在小资金下有效,但资金规模扩大后冲击成本急剧上升。
- 只报收益不报风险:最大回撤、波动率、夏普比率、胜率、盈亏比应同时呈现。
复盘时,建议按“数据—假设—执行—评估”四个维度逐项核对,并把每次回测的配置、代码版本和结果归档。只有这样,回测才能真正成为模型开发中可信赖的过滤器,而不是自我安慰的数字游戏。