请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3364712 新帖:0

动态复权(真实价格)模式原理详解!

EA发表于:5 月 10 日 03:08回复(1)

如果没有意外,你之前一直在使用前复权价格做回测,使用前复权价格回测存在未来函数(未卜先知,提前使用未来的数据),因此你的回测结果都是错的。

Tell me why?

使用前复权价格,不论回测开始时间、结束时间是何时,使用的数据都是基于今天(回测当天)或某个时间的复权因子进行前复权获得的价格,因此使用前复权价格进行回测,回测结果肯定有问题。示意图如下:

传统回测模式

不论历史时刻1或历史时刻2,拿到的数据都是基于未来某一天的前复权价格,使用这样的数据存在未来函数(未来函数是回测最大的敌人之一)

真实价格回测(动态复权回测)是如何解决这个问题的?

开启真实价格回测

使用真实价格回测模式,回测到历史时刻1,使用历史时刻1的真实价格撮*交;如果需要复权,会使用的历史时刻1的复权因子,对“历史时刻1"之前的价格进行前复权,这样有效避免了未来函数,因为回测全程都不可能使用未来的数据。

enter image description here

你可能没有看懂,下面举个例子:

p3

如现有一只股票,股价一直没有波动,只进行了拆分。

  • 前复权回测模式

    • 站在“历史时刻3”看历史数据:因为使用今天的复权因子,“历史时刻3”之前的股价均为2;

    • 站在“历史时刻2”看历史数据:因为使用今天的复权因子,“历史时刻3”的股价是2;

    • 站在“历史时刻1”看历史数据,因为使用今天的复权因子,“历史时刻2”和“历史时刻3”的股价是2;

  • 真实价格回测模式

    • 站在“历史时刻3”看历史数据:因为使用历史时刻3的复权因子,“历史时刻3”之前的股价均为8

    • 站在“历史时刻2”看历史数据:因为使用历史时刻2的复权因子,“历史时刻3”的股价是4;

    • 站在“历史时刻1”看历史数据:因为使用历史时刻1的复权因子,“历史时刻2”和“历史时刻3”的股价是2;

因为使用了未来的复权因子,前复权回测模式,回测过程中使用的价格是不正确的。

下面再举一个真实的例子,比较一下前复权回测模式和真实价格回测模式的区别

GL_pre

GL_pre

2007-01-30,波导股份的真实股价(绿色曲线)是低于格力电器(黑色曲线)的;但使用前复权价格,波导股份的价格会高于格力电器。
采用最简单的交易思路,购买股价低的股票并持有,前复权模式会买入格力电器,真实价格回测模式会买入波导股份。

下面我们使用JoinQuant进行回测,根据2007-01-30当天格力电器与波导股份的收盘价,买入低价位股票并持有到现在。回测结果如下所示:

前复权回测模式的回测结果:
初始资金:100,000
策略收益:776.54%
沪深300收益:21.98%
最大回撤:64.98%

gbzs

真实价格回测模式的回测结果:
初始资金:100,000
策略收益:78.35%
沪深300收益:21.98%
最大回撤:79.78%

kqzs

由回测结果不难看出,前复权回测模式因为存在未来函数,结果是不准确的,使用前复权回测模式可能会让你获得非常高的收益,但实盘时,效果却非常一般;在某些策略中,如使用到价格因子,前复权模式会导致回测中买卖信号与实际中不一致,从而导致回测结果不准确,影响策略在真实场景中的应用。

如果你想要获得正确的回测结果,请使用真实价格回测。

作为最专业的量化交易平台,JoinQuant全球首推真实价格回测,从此,再也不用担心回测结果不准确了。

如何开启真实价格回测功能?

其实很简单,只需一步即可搞定:

在initialize中使用set_option即可,如下所示:

def initialize(context):set_option('use_real_price', True)

全部回复

0/140

量化课程

    移动端课程