技术 | 回测交易策略时的错误

编程是一个反复实验,你需要足够顽强不放弃才能让你的代码能够成功跑起来。这篇文章总结了7个回测交易策略时的错误,希望对大家有帮助。

 

过去几年,作为Quant Researcher, 我大部分的工作是在开发交易系统策略。我花了我大部分的时间来思考交易的好点子,这一步基本与代码不管,这更是一个观察市场,阅读书籍,浏览学术论文和从通常的聊天中国收集想法。

 

接下来是编程阶段,我试图验证我的假设。这包括访问市场数据和对各种交易规则进行编码。也许毫不奇怪,编程阶段可能相当耗时,特别是在调试代码时。无论我们选择测试什么交易规则,我们都要确保我们的回测能够代表真实的市场。我们还希望确保我们正在测试的交易规则与我们头脑中的规则相匹配。如果回测不真实,而我们的交易规则又是荒谬的,那么整个过程便会变得比较浪费时间。

 

显然非常令人沮丧的是,经过几个小时的代码处理后,您发现代码中存在一些微不足道的错误,这些错误导致了回测中的所有问题。但是, 随着时间的推移,你会对最常出现的回测错误类型有所了解。虽然我的重点是交易,但其中一些错误可适用于许多数据科学问题。我列出了在回测交易策略时可能犯的一些错误。我想在这些年我已经犯了这些错误中的大部分错误.。显然,这些并不是你回测时可能发生的唯一错误。这里的关键是这些错误会致使回测变得不现实。我希望它能值得人们思考。

 

问题一:将市场数据的时区搞乱

 

有些烦人的是,对于任何一个交易,世界上没有单一的时区!因此,无论何时处理市场数据(尤其是日内数据),都要小心。将所有市场数据存储在一个时区(通常是UTC)是最简单的。但是,您需要小心,您的所有时间戳仍然正确。当读取数据时,供应商可能并不总是给您提供UTC数据时间戳,他们可能在自己的本地时区中。如果你得到的数据没有贴上标签,那么需要做一些检查。如果是交易所交易,你至少知道交易日的开盘和收盘时间,这会十分有帮助。对于全天候交易的外汇来说,没有开盘和收盘时间。但是,您可以通过查看波动模式来推断时区,例如。纽约时间上午8:30,当美国数据公布时,如果你没有任何其他信息。

 

问题二:试图在市场时间之外进行交易

假设你正在对一个交易亚洲资产的策略进行回测。你也许能在纽约收盘时得到该资产的报价。然而,实际上,该资产当时可能并没有真正交易。因此,当资产实际交易时,报价很可能会在几个小时内失效。如果你最终对这个策略进行了回测,但却使用了纽约的其他数据来生成信号,你猜怎么着……?你会遇到预测偏差!你试图以一个你无法交易的价格交易一项资产。这种像讲故事的迹象通常会导致一个出乎意料的Sharpe ratio!

 

问题三:忘记总回报

如果我们是长期资产,我们累积的损益不仅仅是现货收益。我们通常也有一些carry component。以长期澳元/日元为例。如果我们持有它很长一段时间,我们累积的业绩报酬可能是相当大的。如果我们忽略回测中的总回报,我们最终可能会使我们的模拟损益完全不具代表性。我们可以构建我们自己的总回报指数,或者通常请况下,我们可以找到预制的指数。

 

问题四:使用不正确的交易成本

无论何时进行交易,您都会受到一些市场影响,我们可能会遇到一些下滑。如果您持有流动资金,您将越过买/卖差价。回测时考虑到这一点的一种简单方法是增加交易成本,既包括支付差价也包括下滑。我们还可以创建市场影响模型,用一个函数来表示交易成本,而不是一个常数。许多因素将影响我们的交易成本,资产的交易量,我们想要交易的金额,一天中的时间等。如果我们假设交易成本太小,我们可能会发现策略在回测中可能看起来有利可图,但在实际交易时情况就不这样了。如果我们的交易规模很大或交易频率很高,交易成本会对我们的回报产生重大影响。因此,我们不应该认为交易成本“不重要”。

问题五:浪费时间做太低级的回测

如果你做的是非常高频的交易,让你的回测尽可能准确是有意义的。您可能需要对订单簿进行建模,并在波动点级别对市场进行建模。然而,这对于理解一个每日交易策略在反向测试中是否有利可图来说可能是过分的。是的,我们想做一个现实的回测。然而,我们不会浪费时间去建模那些与你所看到的时间频率无关的东西。 

 

问题六:不对交易策略进行记录

它总是要比不记录交易策略或注释回测代码快得多… 不然当你一年后回到代码中,却不知道发生了什么时,这会非常麻烦。之前省下的时间,迟早会花掉的。正确地编写代码(以及底层策略),就不会发生这种情况。 

 

问题七:每次回测都是一次

如果您没有一种通用的回测方法,那么更新你的分析可能会非常耗时。每次你想出一个新的交易点子,你就不得不从头开始一次回测。实际上,回测应该是非常相似的——主要区别在于信号的计算方式(这是您应该花时间的地方!)。帮你自己一个忙,花点时间使你的回测过程尽可能的通用。