Backtesting 是在明确指定的数据、时间顺序和执行假设下,对交易或决策规则进行历史模拟。它可以检验规则在过去样本中的表现,但结果的说明力取决于整个测试的设计。
Backtesting 在历史数据上重演规则,并计算在所选假设下这些规则会产生什么结果。Bailey 及其合著者将其描述为算法策略的历史模拟,同时提醒存在假阳性发现的风险。我们的编辑界定是:结果属于特定版本的规则、数据和执行模型。它不能证明有人实际完成过这些交易。可复现的计算可以发现错误或不合适的想法,但本身不能把过去变成可靠预测。 [1]
QuantConnect 描述了一种偏差:模拟使用了未来信息,例如尚未公布的财务数据或这些数据后来的修订。我们对时间可用性的约定要求为每项输入注明其可用时点,而不只是它所对应期间的日期。来自已收盘蜡烛图的信号,在没有额外假设时,不能以已无法利用的价格获得交易。在我们的示例中,前面的收盘价只用于下一期间,模型明确规定按该期间的开盘价成交。 [2]
QuantConnect 提醒注意只测试存续至期末的证券,以及把今天的指数成分回用于过去的问题。我们提出的更一般问题是:历史数据集是否也保留了当时可用、后来消失的工具。缺失数据、方法变更和市场选择都需要记录。对于比特币模拟,不能自动把某一服务的报价视为另一服务上可实现的价格。数据洁净意味着修订可追溯,而不是删除不利结果。 [2]
QuantConnect 文档将信号和订单与决定成交价格及数量的模型分开。它也指出实际交易中的部分成交,与预置模型中完全成交假设之间的差异。我们的要求是说明订单何时可以执行、流动性不足时如何处理,以及如何处理过时价格。历史数据触及某个价位,本身并不能证明任意规模的订单都有可用交易对手。成交模型的结果仍然是模拟假设。 [3]
QuantConnect 将 Slippage 描述为预期成交价与实际成交价之间的差异,并说明延迟、连接和市场条件的影响;偏差既可能有利,也可能不利。我们的成本核查将手续费、成交价格以及可能存在的其他持有或融资成本分开。已经计入成交价格的成本不能再次扣除。零值是一个具体的模型假设,并不是市场没有成本的证据。检验更高成本下的敏感性,有助于判断微小的历史利润是否依赖乐观设置。 [4]
TimeSeriesSplit 文档解释了按时间顺序划分数据,以免模型在未来数据上训练、在过去数据上评估。我们的方法要求是在查看结果之前,先确定规则设计期间以及后续验证期间。如果验证失败后又根据验证期间调整规则,这个期间就已经影响了开发。仅按时间顺序划分,并不能解决预处理中的信息泄漏、目标重叠或反复选择变体的问题。流程和数据边界都必须说明。 [5]
Bailey 及其合著者指出,在同一批数据上反复寻找最佳配置,会增加假阳性发现和拟合过去噪声的风险。我们的报告规则是披露尝试历史,而不只是获胜曲线。这包括参数、期间和工具选择的变更。经过多次尝试后选出的结果,与预先确定且未修改的规则,并不具有相同的说明力。我们的简单示例既没有执行他们估计过拟合概率的方法,也没有用一次数据划分来替代该方法。 [1]
NFA 提醒,假设结果并不反映实际交易,可能利用事后视角,并且不能完善地模拟流动性、Slippage 或真实亏损时的行为。因此,我们的报告应保留数据和代码版本、规则、成交假设、计入的成本以及完整的模拟交易列表。总收益需要风险背景和相同条件下的比较;一张精选的漂亮图表并不足够。即使历史测试的实现毫无错误,也不能保证在未来市场中可执行或获得收益。 [6]
上一期间的信号,下一期间的成交
要获得更完整的理解,请将本词条与以下词条结合阅读: Trading Plan, Trading Journal, Slippage, Overfitting, Walk-forward Analysis. 反向关联还来自: Technical analysis, OHLCV, Timeframe, Candlestick chart.
01盈利的历史回测能证明策略未来会赚钱吗?+
不能。结果可能取决于特定数据、成本、成交模型或最佳变体的选择。需要核查时间顺序是否正确、各项假设和选择流程;即便如此,也不能保证未来收益。
02只从最终利润中扣除手续费就够了吗?+
只有在这种方式与模型完全一致,且不影响可用资本和后续决策时才可以。通常需要在相应事件发生时计入成本,区分成交价格与手续费,并避免重复扣除。