如果没有意外,你之前一直在使用前复权价格做回测,使用前复权价格回测存在未来函数(未卜先知,提前使用未来的数据),因此你的回测结果都是错的。
Tell me why?
使用前复权价格,不论回测开始时间、结束时间是何时,使用的数据都是基于今天(回测当天)或某个时间的复权因子进行前复权获得的价格,因此使用前复权价格进行回测,回测结果肯定有问题。示意图如下:
不论历史时刻1或历史时刻2,拿到的数据都是基于未来某一天的前复权价格,使用这样的数据存在未来函数(未来函数是回测最大的敌人之一)
真实价格回测(动态复权回测)是如何解决这个问题的?
使用真实价格回测模式,回测到历史时刻1,使用历史时刻1的真实价格撮*交;如果需要复权,会使用的历史时刻1的复权因子,对“历史时刻1"之前的价格进行前复权,这样有效避免了未来函数,因为回测全程都不可能使用未来的数据。
你可能没有看懂,下面举个例子:
如现有一只股票,股价一直没有波动,只进行了拆分。
前复权回测模式
站在“历史时刻3”看历史数据:因为使用今天的复权因子,“历史时刻3”之前的股价均为2;
站在“历史时刻2”看历史数据:因为使用今天的复权因子,“历史时刻3”的股价是2;
站在“历史时刻1”看历史数据,因为使用今天的复权因子,“历史时刻2”和“历史时刻3”的股价是2;
真实价格回测模式
站在“历史时刻3”看历史数据:因为使用历史时刻3的复权因子,“历史时刻3”之前的股价均为8
站在“历史时刻2”看历史数据:因为使用历史时刻2的复权因子,“历史时刻3”的股价是4;
站在“历史时刻1”看历史数据:因为使用历史时刻1的复权因子,“历史时刻2”和“历史时刻3”的股价是2;
因为使用了未来的复权因子,前复权回测模式,回测过程中使用的价格是不正确的。
下面再举一个真实的例子,比较一下前复权回测模式和真实价格回测模式的区别
2007-01-30,波导股份的真实股价(绿色曲线)是低于格力电器(黑色曲线)的;但使用前复权价格,波导股份的价格会高于格力电器。
采用最简单的交易思路,购买股价低的股票并持有,前复权模式会买入格力电器,真实价格回测模式会买入波导股份。
下面我们使用JoinQuant进行回测,根据2007-01-30当天格力电器与波导股份的收盘价,买入低价位股票并持有到现在。回测结果如下所示:
前复权回测模式的回测结果:
初始资金:100,000
策略收益:776.54%
沪深300收益:21.98%
最大回撤:64.98%
真实价格回测模式的回测结果:
初始资金:100,000
策略收益:78.35%
沪深300收益:21.98%
最大回撤:79.78%
由回测结果不难看出,前复权回测模式因为存在未来函数,结果是不准确的,使用前复权回测模式可能会让你获得非常高的收益,但实盘时,效果却非常一般;在某些策略中,如使用到价格因子,前复权模式会导致回测中买卖信号与实际中不一致,从而导致回测结果不准确,影响策略在真实场景中的应用。
如果你想要获得正确的回测结果,请使用真实价格回测。
作为最专业的量化交易平台,JoinQuant全球首推真实价格回测,从此,再也不用担心回测结果不准确了。
如何开启真实价格回测功能?
其实很简单,只需一步即可搞定:
在initialize中使用set_option即可,如下所示:
def initialize(context):set_option('use_real_price', True)