在做股票回测的时候,如果回测的时间期间比较长,如果中间存在分红、送股、拆分、合并等事件导致账户股票数目(或者权益)变化,价格可能大幅度变化的情况下,就需要考虑是否对股票价格进行复权处理。
常见的复权方式
前复权
保持当前的价格不变,对导致股票数目变化或者权益变化的事件进行同比例处理,使得事件放生前后价格是连贯的。前复权的一个特征是当前价格是实际发生的,前面的价格可能发生了巨大的变化,并且理论上是可能出现负数的。
后复权
保持上市时候的价格一致,每次复权前后保持价格保持连贯,后复权的特征就是最开始的价格是真实价格,当前价格不是真实的价格,是经过比例调整之后的。
前复权和后复权都能保持价格的前后连贯,但是不复权会造成价格的不连贯,出现缺口。
回测中几种复权方式的选择
前复权与后复权的选择
本质上,在回测中,前复权与后复权效果是一样的。但是表现形式上,有一定的不同。
前复权是根据回测结束期间的价格往前复权,结束的时候的价格和真实交易价格一样,最开始的价格是复权后变化的价格;在实际的回测中,计算的手数会出现细微的差别,比如,实际交易价格是7,我用10000元,实际上可以交易14手,总的持仓价值是9800,如果此时前复权的价格是3,那么,就可以交易33手,总的持仓价值是9900,出现了100元的持仓价值的差值。
后复权更加直观一些,符合直觉。在回测最开始的时候,价格是真实的价格,但是后面的价格就是复权后的价格。使用后复权的时候,也和前复权一样,会导致持仓价值计算有细微差别。
复权与不复权的选择
复权的时候会导致计算的持仓价值有问题,那么,另一个选择就是使用不复权数据。使用不复权数据,计算的时候,持仓价值是最准确的。然而,不复权的时候,需要保持一些分红、送股等事件,并且需要能够支持分红、送股、拆分等事件的回测框架(backtrader需要在现有基础上进行一定的改进),最关键的是,如果使用一些常规的技术指标进行择时的话,计算的指标值存在失真。不复权,依然不是太好的选择。
复权与不复权的结合
用复权后的数据计算指标值,用不复权的数据计算持仓价值,然后转换到复权后的数据(手数允许带小数)上进行交易。举例说明如何在backtrader上进行实现:
在backtrader上同时加载两个数据,data_adjust(复权数据)与data_unadjust(不复权数据)
根据策略逻辑,计算出来需要持有的股票的金额,然后看下实际用在data_unadjust上,可以交易多少手,总的持仓价值是多少
根据在未复权的数据上的持仓价值,计算在data_adjust上需要开多少手(允许出现小数)
然后,用这个手数,在data_adjust上进行交易
回归最开始
如果特别追求精确的话,可以使用复权与不复权相结合的方式进行回测,这样更精准,和实际交易更接近。但是,如果对精确度不是追求非常高的话,直接使用后复权数据吧。
达里奥曾经提到过一个80%原则:我们决策的时候,能够掌握80%的信息,做出一个能够有80%胜率的决策,那就是一个好的决策。
在回测中也一样,一个好用的策略逻辑,在数据100%准确、90%准确、80%准确的时候,回测出来的结果应该是具有一致性的,当然,回测过程中,需要精益求精,追求更高的准确度,用于精准模拟实际的情况,但是,大部分时候,我们都是不太需要那么精确的。这是一个收益与成本的权衡问题。
想要精准一些,就选择复权与不复权的方式吧。但是大部分情况,可以使用复权(后复权)数据直接回测。
实际当中,可能存在更好的处理复权问题的方式,有待更进一步的发现与探索。
注:本文写作使用59分钟
智慧、心灵、财富,总要有一个在路上,愿我们能在人生的道路上,不断成长、不断成熟~~~
感兴趣可以关注我的专栏:
my_quant_study_note:分享一些关于量化投资、量化交易相关的思考
backtrader量化投资回测与交易:本专栏免费,分享backtrader相关的内容。
量化投资神器-backtrader源码解析-从入门到精通:本专栏目前收费299元,预计更新100篇策略(更新中)+36篇backtrader讲解(已完成)+backtrader源码分析。