回测的目的在于使用历史及样本外数据对策略进行验证,确定其能否创造预期收益,结果也会被看做为做为略实盘操作的一个预期值。但实盘涉及因素极其复杂,回测并不能确保策略的成功。
回测可能是量化交易中要求最为精细的一环,因为太多可能的人为偏差会涉及其中,一般包括前视偏差、幸存偏差和优化偏差(也被成为数据透视偏差)。关于回测还有几个需要关注的关键点,包括历史数据的质量和可得性、实际交易成本的影响及如何确定一个健壮的回测平台,下文指令执行系统中会进一步讨论交易成本。
通过历史数据测试及优化是回测必须的步骤。市场中有各种不同的标的资产,更有数不胜数的数据供应商,服务价格取决于数据的质量、深度及实时性。对于菜鸟量化交易员(至少是个人投资级别)来说,一般Yahoo金融上的免费数据就足以大家使用。我会着重介绍在处理历史数据集是的常见问题,数据供应商这里不会详述。
注:数据透视偏差是指使用过多参数与拟合历史数据,而没有进行大数据量、样本外测试及敏感度分析导致的偏差
关于历史数据主要关心准确度/清洁度、幸存者偏差及对于公司行为(如发放股利、拆股等)的调整。
准确度指数据的整体质量(是否存在谬误数据)。错误数据有时候很容易发现,比如使用窄带滤波器可以从时间序列数据中筛选出超出范围的数据并修正它们,但有时候也非常难以确定,通常我们需要两个以上的数据提供商,通过比对确定数据是否准确。
幸存者偏差,通常免费或比较便宜的数据集都存在这个问题,幸存者偏差是指数据集中不在包含已经不再流通的资产,比如已经退市或者破产的股票。使用这种数据集进行回测会导致评估业绩比真实的(历史上)业绩要好,因为数据集相当于做了一次自我筛选,筛选出了历史上表现较好的股票。
公司行为通常会对原始股票价格出现阶梯性影响,而这部分影响在计算基于价格的收益率时不应当被考虑进来,股利分发与拆股是最为常见的公司行为。每当发生公司行为时,都要经历价格的回调,要注意千万别把拆股与真实的价格调整给混淆了,许多交易员都曾在公司行为上栽过跟头。
执行回测需要一个软件平台,你可以选择专业的回测软件,如Tradestation;一个数值处理平台,比如Excel或MATLAB;也可以使用Python或者C++自主研发一套软件。这里不会详述Tradestation、Excel和MATLAB,因为我希望构建一套完整的技术栈,这么做的一个好处在于回测软件和指令执行系统可以紧密的结合在一起,即使面对的是一个高级统计学策略,对于高频交易策略,自主研发甚至可以说是必须的。
进行回测时,回测系统必须能够定量地给出策略的收益表现。最大跌幅与夏普比率是业界公认的两个度量标准。最大跌幅标注了一定时期内(通常以年为单位)账户资金曲线中最大的波峰-波谷差,通常以百分比计量。因为一些统计学因素影响,低频交易的最大跌幅要比高频来得更大些。历史回测可以得到历史上的最大跌幅,对于未来具有很强的指导意义。第二个指标是夏普比率,它被定义为超额收益的平均值除以这些超额收益的标准差,超额收益指策略高于预定基准收益的部分,基准收益常会选择标普500或3个月的国债。需要注意的是,“年化收益”这个平日里常见的指标,回测里确基本不用,因为它没有将策略的波动性考虑进去。
回测完成,确信策略中已经排除了所有偏差,如果运气好夏普比率和最大跌幅表现都挺好,那么恭喜你,可以开始着手构建指令执行系统了!
上篇文章中,我们介绍了如何构建策略:
个人如何做量化交易?策略构建篇