关闭
您正在使用的浏览器版本较低,无法支持聚宽的某些特性。
为了获得更好的体验,推荐使用:
Google Chrome
或者
Mozilla Firefox
或者
IE9以上
。
返回主题列表
动态复权(真实价格)模式原理详解!
JoinQuant-PM
发布于2016-06-23
回复 81
浏览 56666
190
listen
分享到:
微信
微博
雪球
**如果没有意外,你之前一直在使用前复权价格做回测,使用前复权价格回测存在未来函数(未卜先知,提前使用未来的数据),因此你的回测结果都是错的。** ![有没有搞错.jpg][1] ### 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](https://www.joinquant.com/)进行回测,根据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) ``` [1]: https://image.joinquant.com/bc9d7b55fc63f028717c8de7346859ff
190
listen
分享到:
微信
微博
雪球
评论
abcde3869
那我可不可以这么理解,只要是不涉及比价的情况,前复权也是没有问题的。比如股票的市值不会受复权或者不复权的影响
2016-06-23
landmine
@abcde3869 也不是,当复权参数比较大的时候,如果不用真实价格,历史回测买卖的价格误差会比较大
2016-06-23
abcde3869
@landmine 这个可以理解,尤其是太过久远的。但是不复权会扭曲技术指标,这个怎么解决。
2016-06-23
landmine
@abcde3869 文中所述~真实价格回测,完美解决
2016-06-23
日记本
真实价格回测,是按照交易当天的复权因子进行回测,那么比价的时间点正好跨过除权日,那也是不精确的吧。。比如:比较两只股票十日均价的高低,可能其中一只恰好在前第五天除权了。。
2016-06-23
landmine
@日记本 嗯,是以当时回测日期的价格为基准,前复权的
2016-06-23
landmine
@日记本 不是完全真实价格
2016-06-23
abcde3869
@landmine 我的策略真实价格成交加入之后测出来的结果还是一样的,哈哈哈哈
2016-06-23
南风不竞
@landmine 设置了real_price,然后我用histroy取数据进行均线计算,会不会对均线数据有影响? 假设原来5日均线在10日均线上面,除权后,用真实价格计算的均线就成了5日在10日下
2016-06-23
spoon37
策略中不含价格比较的因素,不存在这个问题。
2016-06-23
小兵哥
我被“真实价格”这 四个 字给骗了。 其实“真实价格”也是复权价格,是一个动态的复权价格。 会根据回测的日期,自动调整为历史上当天的复权价格。 两个模式都回测过,用真实价格回测收益更高。 ``` 以下解读皆错误。 赶脚真实价格回测会有很多坑, 比如:渠道突破模型,拆股就是向下突破,该卖了; 比如:技术指标,拆股、分红,图形全走样; 比如:ATR,计算波幅,拆股分红了,难道会算的准么? 比如:百分比止损,别逗了,都 10送10 了,难道没触发你的止损价? ```
2016-06-23
JoinQuant-PM
@小兵哥 用真实价格不代表回测就会变差,例子只是一个极端的情况。 你提了一大堆的比如,也许是没有真正了解真实价格回测是什么意思,并不是说给你的数据每天都是历史上的真是数据,而是说基于回测中当天的对之前的数据进行前复权。 比如从1到10, 走到3时,[1,2]基于3进行前复权。走到7,[1,2,...,6]基于7进行前复权。就和你今天用软件看股票的前复权看行情进行分析一样,并没有对你产生什么影响。 所以,请你再想想你那一大堆比如是否成立?
2016-06-23
JoinQuant-PM
@天罗子 history里的数据是基于当天价格进行了前复权,并不会造成影响! 就如你今天用同花顺的前复权看,股票拆分,明天再用前复权看,是没有变的呀。 均线走势是没有变的呀。可能昨天查询的5日均值与今天查询的5日均值值不同,但是现实中你如此记录也是一样的。所以API里有提示,请不要自己记录数据,就是为了避免这样的情况发生!
2016-06-23
王工
今天之前的策略都活在童话世界里,呵呵
2016-06-23
小兵哥
@JoinQuant-JQ 谢谢 JQ 澄清疑虑,我之前的解读皆错误,被“真实价格”这四个字给误导了。
2016-06-23
landmine
@天罗子 只要不保存历史的数据做cache,每次都取history就没事
2016-06-24
JoinQuant-PM
@小兵哥 澄清疑虑是我们应该做的。 也是我们的问题,名字没有起好。但是一时想不出有什么特别贴切的名字来
2016-06-24
股灾入场
真是个灾难
2016-06-24
小兵哥
@JoinQuant-JQ 动态复权价格?
2016-06-24
JoinQuant-PM
@小兵哥 貌似不错!
2016-06-24
首页
上一页
1
2
3
4
5
下一页
尾页
您尚未登录,请
登录
或者
注册
聚宽发表回复。
取 消
提 交