好的,我们来深入探讨一下在期货CTA策略回测中,应该使用哪种数据以及各种方法的优劣对比。
核心目标是让回测尽可能地模拟实盘交易的真实情况,从而得到更可靠的策略绩效评估,减少回测与实盘之间的差距(Slippage之外的结构性偏差)。
基于原文的讨论,我们主要比较以下几种常用的数据源及其用于回测的方式:
1. 主力连续合约数据(未复权)
- 数据构成: 将历史上每一天的主力合约数据直接拼接起来。换月时,数据会直接从旧主力合约的价格跳到新主力合约的价格。
- 优点:
- 获取相对简单。
- 反映了每个时间点上流动性最好的合约的“名义价格”。
- 缺点:
- 致命缺陷:换月跳空。 这个跳空是人为拼接造成的,并非真实的价格波动。它会严重干扰依赖历史数据的指标计算(如均线、波动率、动量等),导致信号失真。例如,一个向上的跳空可能被误判为强烈的上涨信号,反之亦然。
- 回测结果极不可靠。 基于这种数据计算信号的回测,其结果与实盘会相差巨大,几乎没有参考价值,尤其是对于中低频策略。
- 适用性: 基本不适用于严谨的CTA策略回测信号计算。 除非是极高频、不依赖长周期历史数据的策略,但也存在风险。
2. 指数合约数据 (Index Contract)
- 数据构成: 如原文所述,通常是根据各合约持仓量加权平均计算得到的虚拟合约价格。
- 优点:
- 数据连续,无跳空。 这是其主要设计目的。
- 获取方便。 各大行情软件(如文华、博易等)通常直接提供。
- 一定程度上反映了整个品种所有月份合约的综合价格趋势。
- 缺点:
- 原理性缺陷导致失真(核心问题)。 在换月期间,持仓量的转移叠加远近月合约的价差,会导致指数价格产生独立于真实价格波动的“被动”变化。当远近月价差大时,这种失真尤为严重,甚至可能出现指数与主力合约、次主力合约走势完全背离的情况(如原文苹果例子)。
- 信号失真风险高。 使用失真的指数信号去交易实际的主力合约,可能导致错误开平仓,回测结果过于乐观或产生误导。
- 无法完全复制。 指数是虚拟的,其实盘表现无法通过交易单一主力合约或简单组合来精确复制。
- 适用性:
- 可以直接用于回测交易指数本身(信号端=指数,交易端=指数),但这并非典型的实盘做法。
- 用于信号计算,然后交易主力合约(信号端=指数,交易端=主力)是常见做法,但必须认识到其潜在的巨大偏差,尤其是在农产品等季节性强、基差大的品种上。回测结果需要打很大的折扣,或者作为初步筛选,后续必须用更可靠的数据验证。
3. 复权主力连续合约数据 (Adjusted Continuous Contract Data)
- 数据构成: 以主力合约数据为基础,通过特定算法(通常是向后复权或向前复权)消除换月跳空,形成一条连续的价格曲线。
- 向后复权 (Backward Adjustment): 保持当前最新的主力合约价格不变,向前调整历史上所有旧合约的价格,使得换月点前后价格连续。这是推荐用于计算交易信号的方法,因为它保证了最近的数据是真实的、未经修改的。
- 向前复权 (Forward Adjustment): 保持最早的主力合约价格不变,向后调整后续合约的价格。这通常用于计算累计收益率,但不适合用于计算基于绝对价格水平的交易信号。
- 优点:
- 数据连续,无跳空。 解决了未复权数据的最大痛点。
- 更贴近持有主力并换月的“收益率”变化。 复权后的价格变化率能在一定程度上模拟连续持有主力合约并进行移仓所带来的收益/亏损(不考虑移仓成本和滑点)。
- 信号相对可靠。 基于向后复权数据计算的指标和信号,失真度远小于未复权数据和指数数据。
- 缺点:
- 历史价格失真。 复权(尤其是向后复权)会改变历史上的绝对价格水平。随着时间的推移和新的换月发生,更久远的历史价格会被不断调整。
- 历史信号“闪烁” (Look-ahead Bias in Analysis): 如果你今天基于向后复权数据回测,得到的历史信号可能与你一年前基于当时的向后复权数据回测得到的同一历史时点的信号不同。但这不影响实盘,因为实盘信号总是基于当前可得的最新复权数据计算的。主要是对历史复盘分析时需要注意。
- 复权算法细节差异。 不同数据商或自己实现的复权算法(基于价差绝对值还是比例)可能略有不同,导致数据源之间存在细微差别。
- 适用性:
- 强烈推荐用于CTA策略回测的信号计算。 这是目前业内较为常用且相对可靠的方法,尤其是在回测中模拟交易主力合约时(信号端=复权主力,交易端=主力)。能较好地平衡数据连续性和贴近实盘的需求。
4. 分段主力合约数据 (Segmented Main Contract Data)
- 数据构成: 不拼接。直接使用每个历史时期对应的主力合约的原始数据段。例如,在CU1905是主力的时期,就用CU1905的数据;换月到CU1907后,就用CU1907的数据。
- 优点:
- 数据最真实。 在每个主力合约的生命周期内,使用的都是该合约未经修改的真实价格和成交量数据。
- 无复权或指数合成引入的失真。 信号计算基于当下实际交易合约的历史。
- 缺点:
- 数据不连续。 指标计算跨越换月期时需要特别处理。例如,计算一个N日均线,当计算周期横跨换月点时,是只用新合约的数据重新开始算,还是有更复杂的衔接逻辑?
- 回测逻辑复杂。
- 需要在换月点模拟移仓操作:平掉旧合约仓位,根据模型在新合约数据上的信号状态,决定是否在新合约上开立新仓。
- 信号计算的衔接处理是关键和难点。如何处理需要跨合约计算的指标(例如长周期均线、波动率)是个挑战。简单地在新合约上从头开始计算可能导致信号在换月初期不稳定或失真。
- 实现难度大。 需要自行管理多段数据,并编写复杂的换月和信号计算逻辑。
- 适用性:
- 理论上最接近实盘逻辑。 如果能精确地在回测中模拟实盘的换月决策和基于新合约数据的信号判断与执行,这种方法可能得到最真实的回测结果。
- 适合动手能力强、追求极致拟合度的开发者。 但需要投入大量精力处理技术细节。
结论与建议:
- 绝对避免使用“未复权的主力连续合约数据”进行信号计算和回测。
- 谨慎使用“指数合约数据”计算信号然后交易主力合约。 认识到其在换月期可能存在的严重失真,尤其关注农产品等品种。这种方法得到的回测结果(特别是收益风险比、最大回撤)往往过于乐观,需要结合交易主力合约的回测(如原文所示)进行更现实的评估。
- 强烈推荐使用“向后复权的主力连续合约数据”作为回测信号计算的基础。 这是目前兼顾数据连续性、信号相对准确性和实现复杂度的较优方案。务必确保你的回测框架中,交易逻辑是基于“主力合约”执行的(即使信号源是复权数据)。
- “分段主力合约数据”是理论上最仿真、但实现最复杂的方法。 如果你的策略对换月处理有特殊要求,或者你追求最高程度的回测保真度,并且有能力处理好换月时的信号计算与仓位衔接逻辑,可以尝试此方法。
总而言之,对于大多数CTA策略开发者而言,使用高质量的【向后复权主力连续合约数据】进行信号计算,并在回测中模拟【交易主力合约】(包括合理的移仓逻辑和成本),是目前进行可靠回测的最佳实践之一。 同时,理解各种数据源的优缺点和潜在陷阱,对于正确解读回测结果、管理实盘预期至关重要。