原 从回测到实盘系列(2):如何让回测更贴近实盘结果

来源:掘金量化myquant.cn ,作者:胡琛,转载请注明出处!

前言:

在上一篇中,我们解读了三个不同技术指标,并千辛万苦,通过对技术指标的涵义解读,对不同技术指标进行结合,为了能够尽量去避免系统风险,我们甚至加入了大盘指数的判断,最后才勉勉强强有一个在回测区间内能看到正收益的策略。

但是,这样的策略是否就能用于实盘并且获取盈利了么?这想必也是很多读者关心的问题。不管回测结果如何,我们希望的不是说看到回测的收益曲线非常牛逼,而是希望回测能够尽量去贴近实盘情况,以便在实盘的时候,我们的策略能尽可能去达到回测时达到的正收益的效果,为了去贴近实盘,我们需要尽量去模拟实盘中可能或者必然需要考虑的情况,哪怕这会导致回测的收益曲线非常差,至少回测能告诉我们,真实市场,你很可能面临甚至比当前更糟糕的境况,而这,才是我们想要的。

手续费与滑点

在我们进行股票交易或者期货交易的时候,我们在交易的时候,都需要付给券商或者期货交易所一笔手续费,而如果股票在卖出的时候,我们不仅需要交手续费,还要交千一的印花税,可能看着这些钱不多,但是,日积月累,这些交易成本会对我们收益造成非常大的影响。

不仅是手续费与印花税等交易成本,如果我们买入的金额很大,但是对应股票交易量比较小,那么,很可能对应股票买入的价格,要比我们设定的最初买入价格要高,这是股票交易中的滑点。但是,股票交易的滑点,并不好进行计算,这和我们买入金额,对应股票成交量有很大关系。一个去尽量避免滑点的操作方式是,我们用小周期的 Bar进行回测,同时对我们每次买入的总量进行拆分,每次买入的数目不超过当前 Bar的交易量的譬如 25%,以此来避免滑点的出现。即便如此,我们依然可以在回测中设置滑点,以增加我们策略的回测的可靠性,那么,设置多少滑点比较合适呢,上交所一篇论文给出的数据是 0.246%,供参考,不过需要指出的是这是 2004 年发表 的论文。

在加入手续费,滑点后,我们之前写的一个赚钱的策略,此时收益会如何呢,简单起见,依然以日线数据进行回测,原始代码可以见《从量化角度告诉你常见的技术指标到底能不能赚钱》我们只需要在原始代码最后的 `run`函数中,添加对应的手续费与滑点影响,需要注意的是,回测代码中并没有印花税的设置选项,但是我们可以将之归到手续费中,将手续费相应加大。这里,我设置手续费为万五,滑点为千三,即0.3%,为了使得手续费与滑点展示效果,我同时设置了初始资金为一百万,每次符合条件股票买入10 手,最后的回测曲线如下图所示1:
作为对比,没有手续费,滑点的回测收益曲线如下所示:

可能因为开平仓没有那么频繁,在收益曲线图上没有太大差别,但是从绩效分析,简单的几个指标,包括收益率,最大回撤,能很明显到,加入了手续费和滑点后,回测的效益还是有比较明显的下滑:

复权对回测的影响

在回测时候,如果是股票的话,对于复权的处理需要比较小心,有些人不注意复权的处理,直接就用原始价格进行回测,回测的结果可能很好,也可能很差,但无论好坏,如果股票出现过除权除息,那么,用原始价格回测的结果是不可信的。举个简单例子,譬如有人用双均线策略作为自己的决策辅助,在回测区间内,某一天,选入的某支股票进行 10 送10,当天开盘,股票价格价格直接腰斩,按照双均线策略,这时候应该对该股票进行卖出的。但是,该股票的价值并没有变,假如原来有 1 手该股票,股票价格为 10元,持有股票价值为 1000 元, 10 送 10 后,股票价格变为 5 元,但是原来的1 手股票会变成 2 手,持有股票价值并没有变化。甚至于股票市场上可能会有填权行情,这时候去出场并不合适。

有鉴于此,回测的时候,对于回测股价的复权处理就显得很必要了。但是复权的方式有两种:前复权,后复权,应该选择什么复权方式去进行回测呢?

后复权是指以除权前的价格为基准来测算除权后股票的市场成本价。通过把除权后的价格按以前的价格换算过来,我们可以看到该股上市以来累计涨幅。往后进行复权处理,这样当然不会再有因为分红,送股等导致的股价"跳空"的问题,因此,有些人会喜欢用后复权进行回测,但是,后复权有一个问题,某些股票在历史上分红很多,后复权后,价格会变得非常高,当设定好初始资金后,回测的时候,能够买入的股票数目可能就会变得很少,甚至于买不到。这里,笔者试着去获取 2018 年 6 月 28日的时候,格力电器的后复权价格。利用掘金量化平台,笔者首先获取格力电器的复权因子,然后用 6 月 28日的复权因子乘以当日收盘价,就有得到 6 月 28日的后复权价格,代码片段如下:

可以看到,后复权处理后,股价已经变得非常高了,但是同样的,可以看出,格力电器是一家分红很慷慨的一家公司,如果基于基本面投资,从历史上看,该公司的股票是不错的选择。

前复权就是保持现有价位不变,将以前价格因为分红,送股导致的跳空,通过对应的前复权处理,保持股价走势的连续,方便对股票进行技术分析。假如以今日 (2018 年 6 月 28)为基准,那么,2011 年 5 月 3 日的格力电器股价可以根据相应复权因子算出来:

当然,这里为了举例,笔者利用复权因子进行了计算,实际我们可以通过直接指定复权方式,获取前复权,后复权以及不复权的价格

那么,是否简单使用前复权进行回测就行了呢?如果我们回测区间为 2015 年 5月3日到 2016 年5月3日,回测标的为格力电器,那么,我们统一用今日(2018 年 6 月 28 日) 往前前复权处理进行回测,理解上,回测区间标准统一,应该没有什么问题。但是,有一个问题是,我们用今日往前进行复权是否就真的没有问题了么?
回测的假设是我们处在回测对应区间内,没有之后的信息,也就是所谓的未来信息,如果我们用回测区间外,往后的时间的信息去进行回测,不得不怀疑会不会引入未来信息。对于这个问题,笔者认为,可能会有影响,但是影响没有那么大,那么,什么时候会有影响。是不是用定点前复权,也就是用回测区间结束点往前进行复权,回测会更好呢?

这里,笔者试图用一个极端例子去加以说明:

1.这个示例是某个微信群友提出来的,对于定点前复权可能出现的问题的说明。假设我们有两支走势完全相同的股票,回测区间结束的时候,股票 A 会进行 10 送 10,股票 B没有任何处理,那么,会导致两支股票前复权价格变得完全不同了,假如我们做的是两支股票的套利,那么回测结果就会完全不同了,这样的极端的例子是否有呢?譬如,格力和美的股票走势很接近,有某位雪球大 V提过,可以利用两支股票做套利,但是如果回测时间点,格力电器分红了,而美的没有分红,回测出来的结果很明显就会有差异。当然,这个问题比较极端,但是回测的时候,需要针对策略和交易标的仔细思考是否会有这种情况出现。

2.关于不用定点前复权导致的未来信息,对于回测的影响有多大,一个简单的办法就是用回测看下回测结果如何,篇幅所限,这里不再进行代码举例,感兴趣的读者可以自己去对比看一下,掘金量化终端默认是定点前复权,如何去以当前日期往前复权计算,只需要获取相应日期的复权因子,然后进行计算即可,实际结果基本相同。但是,是否有其他的极端情况,笔者并没有考虑清楚,欢迎读者有比较好的示例回帖告诉笔者。

买入价格的设置

买入价格的设置问题,有些量化平台,包括掘金终端,为了避免出现偷价问题,当我们回测时候,选择用市价单成交的时候,默认会使用下一个交易日的开盘价进行成交,但是,这样会出现一个潜在的BUG,如果下一个交易 日直接一字板涨停,譬如当初 360借壳江南嘉捷,如果按照普通双均线策略进行择股买入,完全可以成交,然而实际上我们都知道当初江南嘉捷复牌后,连续很多个一字板涨停,我们并不能买进去。

那么,如果去避免这样的问题,一个最粗糙的做法,将股票池中回测收益最大的股票的收益去除来看股票组合的收益,避免幸亏者偏差。比较精细的做法,设置买入为限价单,限定买入价格,达到触发价格再进行买入,而且对买入价格和当日高、开、低、收以及涨跌停价进行比较,避免去在一个不可能成交的价格触发策略买入。

说在最后

篇幅与精力所限,笔者仅列举了有限的一些回测中可能疏忽的问题,希望能够给读者们一些启发,并有一些自己的新的见解。在考虑了上述所有问题后的回测曲线,我们才能部分地去相信这个策略,然后,将策略利用仿真进行进一步地验证。

市面上经常会有人售卖或者分享各种回测收益曲线非常牛逼的策略,并不是说百分百的策略都是垃圾,但是,基本上而言,九成九都是有问题的,一个简单逻辑,既然人家的策略这么牛逼,为什么人家自己不拿着资金去放到市场上去跑,去挣钱,而是把策略给到你,这里,只有几种情况,要不这个策略有问题,人家在市场上挣不到钱,还不如进行售卖;要不就是策略实际收益很低,或者策略容量很低,在市场上的收益远不及去将策略售卖所得的多;最后一种可能,当然人家就是热心肠,乐于将收益很好的策略去共享出来,但是,必须考虑一个因素,当一个策略公布出来后,其有效时间还有多长,考虑到用的人多了后,很容易就达到策略的容量上限,或者被人针对性的进行操作,而且,要从良莠不齐的各种策略中找到好的策略,本身也是一件很困难的事情。

但是,是否这样我们就可以对市面上的所有策略都 say no了么?也不尽然,各种策略的形成,必然有其内禀逻辑所在,我们完全可以在各种不同策略中间去寻找灵感,去形成自己的一套完整交易逻辑。譬如市面上流行的海龟策略,公布了几十年,直到现在,依然有人称能将其实盘得到比较好的收益。海龟策略交易逻辑本身是很简单的,长短两个周期的唐奇安通道,利用通道突破形成的交易条件,利用过去市场波动的情况去控制我们开仓的仓位,以此来平衡我们可能面临的风险,确定好出场条件,避免人手动去判断出场点导致的心理波动,这样的策略在问世了几十年依然有那么多拥趸,与其策略内禀的逻辑,风险控制的理念有着密切的关系。

最后,希望读者能够博取各家所长,形成一套自己的独特的交易理念,并将之实践。不要相信天下会掉馅饼,努力并思考的人才更可能收获到成功。

Footnotes

[1] 由于符合条件股票比较多,可能出现某些股票因为金额不足而无法买入的情况,请读者自行测试

来源:掘金量化myquant.cn     作者:胡琛博士         编辑:掘金小Q

------------------------------------------------------------------------------------------------------------------------------------------------------------

关联文章阅读:

从量化角度告诉你常见的技术指标到底能不能赚钱? https://www.myquant.cn/community/topic/649/2
程序化交易(3):从回测到实盘,还需要注意些什么? https://www.myquant.cn/community/topic/668

《算法导论 第三版英文版》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版

《Python科学计算》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版


从回测到实盘系列(2):如何让回测更贴近实盘结果相关推荐

  1. 量化交易:如何让回测更贴近实盘结果

    前言 在上一篇中,我们解读了三个不同技术指标,并千辛万苦,通过对技术指标的涵义解读,对不同技术指标进行结合,为了能够尽量去避免系统风险,我们甚至加入了大盘指数的判断,最后才勉勉强强有一个在回测区间内能 ...

  2. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  3. 我用AI回怼美女汽车销售系列[yolo车牌识别](二)

    前期回顾: 在上一期介绍了事情的起因,为什么要做yolo车牌识别,以及最终的网络结构.(链接在这里:(141条消息) 我用AI回怼美女汽车销售系列[yolo车牌识别](一)_cjnewstar111的 ...

  4. vnpy怎么创建策略并回测_基于vnpy、rqdata的回测打通历程

    本文用于记录本人回测填坑路上蹚过的坑. 历史数据方面,最近听说rqdata数据质量不错,而且可以通过米匡注册用户享有1个月免费使用期,于是打算用于回测的数据来源. 话不多说. 安装vnpy2.0.5, ...

  5. 鸿蒙荣耀9X公测,荣耀9X系列手机开启EMUI 10公测更新

    中关村在线消息:荣耀官方正式宣布,1月10日荣耀9X系列手机开启EMUI 10系统公测升级. 升级方式为打开手机的[花粉俱乐部]App-论坛右上角的"㗊"-EMUI专区升级尝鲜:此 ...

  6. python 股票回测书籍推荐_python实现马丁策略回测3000只股票

    python实现马丁策略回测3000只股票 批量爬取股票数据 这里爬取数据继续使用tushare,根据股票代码来遍历,因为爬取数据需要一定时间,不妨使用多线程来爬取,这里要注意tushare规定每分钟 ...

  7. 字符串系列之最长回文子串

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述:     给定一个字符串S=A1A2...An,要求找出其最长回文子串(Longest Palindromic Su ...

  8. 【新人】C++小白刷题系列0009进制回文数

    题目描述 如果一个数字从左边读和从右边读一样,那么这个数字就是一个回文数.例如32123就是一个回文数:17在某种意义上也是一个回文数,因为它的二进制型式--10001--是一个回文数. 请你帮忙开发 ...

  9. 360众测重装上阵,创新服务模式重塑众测新业态

    2020年全球疫情蔓延,越来越多企业转战线上办公,互联网边界进一步拓宽的同时,随之而来的网络威胁也在不断增加. 在网络空间对抗日益军事化的国际形势下,网络安全已上升至国家战略层面.而漏洞是网络安全威胁 ...

最新文章

  1. mysql 将时间戳直接转换成日期时间,mysql查询某一天的数据。
  2. I00040 计算1000以内的勾股数
  3. Python 基础详解-列表的反转与排序!跬步千里
  4. ITM_win_agentCPU内存占用较高
  5. 李洋疯狂C语言之用递归解决李白喝酒问题(二)
  6. C++的运算符重载(转)
  7. 二开版彩虹易支付全开源10套模板带风控实名系统源码
  8. python面试题之python下多线程的限制
  9. Nginx 反向代理可以缓存 HTTP POST 请求页面吗?
  10. Vista SP1吞吃硬盘 将给我们带来哪些影响
  11. spring-第六篇之创建bean的3种方式
  12. 几种典型信号的频谱 周期单位脉冲序列的频谱
  13. uni-app自定义搜索框-自定义按钮及搜索图标
  14. 【CDN加速】项目前端性能优化之开启CDN加速
  15. ELK系列之Mac安装kibana报错License information could not be obtained from Elasticsearch due to [invalid_inde
  16. Canvas绘制圆点线段
  17. 安装pip、pip3
  18. 利用appimage工具对开发好的项目进行打包
  19. 了解一下国标和行标的代号
  20. 实验 详解LNMP应用部署Discuz

热门文章

  1. 基于javaweb+jsp的设备维修管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)
  2. 《褚时健传》读书笔记
  3. 解决FlashFXP和FileZilla传输下载文件后出现代码换行的问题
  4. mysql 读未提交数据_mysql事务之未提交读(Read uncommitted)
  5. redis当成数据库使用,时间范围查询
  6. 你真的了解USB吗?USB充电大揭秘(一)
  7. 世界坐标系/相机坐标系/图像坐标系 转换
  8. 75道程序员面试逻辑测试题内含答案
  9. 如何一键直达唤起App,提高App拉新和促活?
  10. Android端获取步数