任何事情都应该使其尽可能地简单,直到无法再简单为止。——爱因斯坦。
1、引言
量化交易最大的特点是有明确的交易策略并具备可回测性(Backtest)
交易策略必须包含明确的规则,如买卖信号、加减仓条件等。量化技术依赖的是明确的交易策略,结合资产的历史交易数据,可以对交易策略的历史表现进行回测。可回测性是量化交易区别于主观投资的最重要的特征。近年来,随着量化投资和Python的流行,以及量化平台和开源框架的迅速发展,使用历史交易数据进行回测变得越来越便利。但是往往发现,回测非常好看的策略,实盘却可能表现不佳。今天给大家分享关于如何识别貌似可行的策略,以及如何规避量化回测的陷阱,内容参考了(加)欧内斯特·陈的《量化交易——如何建立自己的算法交易事业》一书。
2、常见的回测陷阱
量化回测是基于过去发生的行情数据产生历史交易,从而考察这些交易业绩表现的过程。使用计算机编程对历史交易数据进行回测看似简单,但实际上很容易出错。历史业绩高估(相对于已发生的现实交易)是回测的常见错误。使用有存活偏差数据会导致回测业绩高估。然而还有一些与如何编写回测程序以及如何构造交易策略相关的常见回测陷阱,最常见的有两种:前视偏差和数据迁就偏差。
前视偏差
简单理解是使用交易完成之后的信息。例如,在“日最低价的1%之内买入股票”的交易规则,就有前视偏差,因为在当日市场收盘前,是不可能知道日最低价的。又如,使用全部数据回归得来的系数,来产生一个基于前后两段价格序列的线性回归模型的交易信号,同样有前视偏差。
如何避免前视偏差?
使用“滞后”的历史数据来计算策略信号,可以避免前视偏差。滞后数据系列意味着,在计算移动平均值、最高价、最低价、成交量等指标时,只使用“上一”交易期限的收盘数据。
数据迁就偏差
所谓数据迁就偏差,主要是指因迁就历史数据的噪音而过度优化模型参数,造成策略的回测业绩高于未来业绩。在基于历史数据的统计预测模型中,数据迁就偏差非常普遍,而在金融中,因为独立数据的量非常有限,所以这个问题就更加严重。独立数据的量越少,交易模型中用到的可调参数就应该越少。构建数据驱动模型时,几乎不可能完全消除数据迁就偏差,但有几种方法可以降低这种偏差。
合理的样本含量。降低数据迁就偏差的最基本方法是,按照要优化的自由参数个数,使用足够多的回测数据。根据经验规则,通常假定优化参数所需的数据点个数,是模型中自由参数个数的252倍(一年交易天数为252天)。例如,回测三参数的当日交易模型,至少要用三年的日价格数据,如果是分钟交易模型,则至少需要7个月(252/390年)的分钟数据(每天交易分钟数6.5*60=390)。
进行样本外测试。将历史数据根据时间先后分为两段,后一段数据用于样本外测试。构建模型时,参数优化和定性选择使用前一段数据(训练集),所得模型的测试使用后一段数据(测试集)。两段数据的大小要大致相等,若数据量不够,则至少用三分之一的数据做测试。训练集的最小含量由样本含量经验规则确定。
动态参数优化是更严密,也更复杂的样本外测试方法,通过使参数不断适应变化的历史数据,来消除数据迁就偏差。不过最靠谱的样本外测试方法是仿真交易,用尚未发生的真实数据运行模型,是最可靠的测试方法。仿真交易不仅能做真实准确的样本外测试,同时也常常可以发现模型中的前视偏差,以及各种与操作相关的问题。
3、如何识别策略的好坏?
上述两个回测陷阱往往容易造成“回测很丰满,实盘很骨感”的窘境。那么 面对纷繁复杂的量化交易策略,漂亮的历史回测收益率曲线,如何分辨策略的好坏与回测的可靠性呢?其实不管策略多么复杂,不管年化收益与风险指标多么漂亮,我们只要回答好下面几个问题,就能识别出改策略的优劣。
01.策略与基准相比如何?收益持续性如何?
策略的超额收益可以通过信息比率或夏普比率来衡量。
信息比率 = 超额收益率的均值 / 超额收益率的标准差
其中,超额收益率=组合收益率-基准收益率,基准通常是市场指数。如只买卖创业板股票,对应的市场指数就是创业板指数,如果买卖沪深大盘股,对应的市场指数应该是沪深300或上证50(超大盘股策略),中下盘股一般使用中证500。
夏普比率是信息比率的一个特例,基准使用无风险利率。实践中,由于对市场基准的选择不同,使得不同策略的信息比率不具有可比性,但是对无风险利率比较有共识,因此夏普比率适合对不同种类的策略进行比较。一个比较有用的经验规则是,任何夏普比率低于1的策略都不适合单独使用,几乎每月都实现盈利的策略,其年化夏普比率通常大于2,几乎每天盈利的策略,其夏普比率通常大于3。
02.交易成本如何影响策略?
每次基于策略的买卖都会产生交易成本。交易越频繁,交易成本对策略的盈利影响就越大。交易成本不仅包括证券中介的手续费,还包括流动性成本——当你以市场价格买卖证券时,要支付买卖价差。如果采用现价指令买卖证券,确实可以避免流动性成本,但却要承担机会成本,因为限价指令可能不被执行,从而错失了交易的潜在盈利。同样,如果你买卖大笔证券,不可能在不影响价格的情况下完成整个交易。这种由自身指令所引起的市场价格变动效应被成为“市场冲击”。当市场流动性不好时,往往成为交易成本的大头。此外,由于互联网或软件的滞后,指令通过程序传送到交易所与指令在交易所被执行存在时间上的滞后,这种滞后会造成价差(称为“滑点”),即触发指令的价格和执行价格之间的差。当然,滑点有正有负,但平均而言,是成本而不是收益。
03.数据有无存活偏差
股票价格的历史数据库往往不包括那些由于破产、退市、兼并或收购而不再交易的股票,因此存在所谓的存活偏差,即数据库中只有幸存者。使用有存活偏差的数据进行回测是很危险的,因为会夸大策略的历史业绩。这在策略有“价值”偏好时(倾向于买便宜的股票)尤为突出,因为有些股票便宜的原因是公司即将破产。如果你的策略只包含哪些当时非常便宜但却存活下来的股票(而且可能已经兴盛),而忽略那些退市的股票,回测的结果当然会比交易员当时的实际经历要好很多。
04.策略的业绩如何随时间变化而变化?
许多策略10年期的业绩要远远好于现在,至少从回测的结果来看是这样。如果用今天的交易成本做回测,会不现实地抬高早年的收益。有存活偏差的数据也会使早年业绩表现较好,回测回溯的越早,消失的股票越多,有些股票消失是因为已经破产倒闭,一个纯多头策略在回测的早期会比当年实际的盈亏看起来好。因此,在判断一项策略的适用性时,要重点关注其最近几年的业绩。此外,当股票市场转态发生转化(如重大制度变革,如股权分置改革;再如2018年的退市制度完善,中弘股份和长生生物相继退市),早年的交易数据并不能简单地应用于今天的相同模型。股票市场的监管变化或其他宏观经济事件或股灾,都可能导致重要的制度变换。
一般会认为,数据越多,回测在统计上就越可靠。这其实只是对由平稳过程产生的金融时间序列来说才是正确的。但是金融市场时间序列数据往往是非平稳的。
05.策略是否存在过拟合或参数调优偏差?
如果构建一个有多个参数的策略,很容易通过优化参数,使历史业绩看起来很优秀。通过参数的调优,只是使模型与过去发生但未来不会再重现的任何偶然历史事件温和。一般而言,策略的规则越多,模型的参数越多,就越可能出现过度拟合问题。能经得起时间考验的往往是简单的模型。
来源:python金融量化
推荐阅读: