如何负责任地进行SMMA回测?
在测试前明确定义SMMA
SMMA代表平滑移动平均(Smoothed Moving Average)。它是一种移动平均线,其值逐根K线逐步更新,而非每根K线都从头重新计算。在回测中,“负责任”的第一步是明确定义你将要模拟的具体机制:
- 时间步长和数据:什么构成一根K线(例如,分钟、小时、日),以及使用哪个价格(开盘价、最高价、最低价、收盘价,或平均值)。
- 周期长度(period):SMMA定义中使用的K线数量。
- 初始化:SMMA的初始值,以及在数据集开始时如何设定初始值。
- 更新规则:每根新K线到来时应用的计算公式。
如果这些要素未在测试前明确说明,两个人可能运行“SMMA回测”,但实际测试的却不是同一事物。
区分稳定机制与可变条件
移动平均线的形态源于其计算机制,但交易结果(如果你模拟交易)则取决于多种可变条件。为了负责任地回测,应将它们分开处理:
- 稳定机制:SMMA的计算规则和参数定义。
- 可变市场条件:波动率状态、点差行为、价格跳空,以及价格数据是否真实反映可交易价格。
- 执行与成本:佣金、买卖价差、滑点和订单执行时机。
即使你仅研究指标行为(而非交易策略),仍需有稳定的定义,以便结果可比。
明确假设与成本建模
回测结果往往在忽略成本和执行细节时显得“更好”。负责任的回测应对所有计算或示例中使用的假设进行记录。关键假设包括:
- 成本:你是否建模每笔交易的佣金?是否将点差作为成本?或两者都包括?
- 滑点:你是否假设固定滑点?滑点是否为波动率的函数?或采用保守的最差情况范围?(选择一种并说明理由。)
- 执行时机:如果规则在K线收盘时触发,你是以下一K线开盘价执行,还是在收盘价执行,或采用其他时机假设?
- 数据质量:时间戳是否一致?是否存在缺失K线?价格是否对齐,以确保SMMA和任何事件逻辑使用同一根K线?
由于成本和执行情况各不相同,目标不是“预测”真实结果,而是避免产生误导性的乐观模拟。
控制偏差:防止未来信息泄露和过拟合
负责任的回测需检查你的设置是否无意中使用了本不应拥有的信息。
- 未来信息泄露(look-ahead):确保在时间 t 使用的每个值仅依赖于截至 t 的可用数据。这包括指标的预热期和任何过滤逻辑。
- 重参数偏差:如果你尝试多个SMMA周期并选择样本内表现最佳的一个,可能会导致过拟合。应采用结构化流程:先定义参数搜索范围,然后在评估前锁定选择。
- 数据选择偏差:仅使用“干净”时段或剔除大幅回撤段会夸大结果。应优先采用透明规则来决定包含哪些历史时段。
使用样本外验证测试稳定性
历史表现可能随市场条件变化而改变,因此“负责任”的测试需要在用于建模的数据之外进行评估。
典型方法包括:
- 训练(样本内):使用历史数据的一部分来确定SMMA参数选择,以及从指标行为到测量结果的映射。
- 验证(参数调优):使用另一独立数据段减少过拟合。
- 测试(最终评估):仅使用最后的数据段进行最终检验。
也可考虑前向滚动(walk-forward)评估,即反复仅使用过去数据重新训练/选择参数,并在下一数据段上测试。这有助于揭示结果是否依赖于特定时期。
报告局限性与失效模式
即使代码完全正确的SMMA回测,也可能因模型不匹配或市场状态变化而失败。主要局限性示例包括:
- 状态依赖性:平滑方法在趋势市和盘整市中的表现可能不同。
- 对成本敏感:一旦加入实际的点差和滑点,微小优势可能消失。
- 预热效应:早期K线可能使用初始化值,无法反映稳态行为。
- 数据-模型不匹配:如果历史价格不代表可执行交易价格(或执行时机不现实),回测结果可能无法泛化。
负责任的报告不仅应包括“什么有效”,还应说明“在何时、为何可能失效”。
可独立进行的验证
为在不依赖外部声明的情况下验证自身回测的严谨性,可采取以下步骤:
- 手动计算几根K线的SMMA值,使用你声明的公式和初始化方法,然后确认你的代码结果一致。2.