感谢原作者:JoinQuant-TWist
转自:JoinQuant
重要提示:聚宽提供了非常好的数据库接口,愁没研究数据的小伙伴可以加微信(jqdata01)详细了解
原文链接:https://www.joinquant.com/view/community/detail/13845
摘要
评价策略回测的指标
建立模拟交易
未来函数
运行过慢
过拟合
策略失效
收益与风险的取舍
自测与自学
在学习了如何编写策略后,我们将介绍下评价策略回测的指标,如何建立模拟交易,以及除回测之外还有哪些需要关注的方面。
策略回测指标
如下图,一个策略回测后会给出一些指标,可以在API文档:风险指标查看这些指标的公式及基本说明。下文将补充介绍下几个重要指标。
策略收益。这是最基础的指标,衡量回测期间策略收益率的。
基准收益。基准默认是沪深300指数,所以此指标是回测期间基准收益率的。一般来说,基准收益代表市场整体的收益情况,所以如果策略收益长期低于基准收益,往往意味着策略是失败的。通过set_benchmark()这个API可以自定义基准。
年化收益率。年化收益率是一个衡量策略盈利能力的重要指标,越大越好。刚刚讲的策略收益这个指标是和回测时间长短强相关的,比如一个普通策略运行10年肯定比优秀的策略跑半年策略收益高,但这样就不利于比较策略的盈利能力。因此,通过数学方法,把策略收益统一互相化归为一年时间的收益率,比如10年的变为平均每年的收益率,半年的变为以这半年盈利能力运行一年的收益率,如此一来,让策略盈利能力在比较时有了一个大致等同的时间标准。
最大回撤率。最大回撤率是一个衡量策略风险的重要指标,越小越好。新手初见这个指标的时候可能会感到一点点的困难,其实这个指标是对应着一个很自然的想法的,比如,你现在要实盘用真钱去跟一个策略操作,而你现在是知道这个策略的过去一段时间的历史收益曲线的,你觉得你的最大亏损率估计是多少?建议读者自己随手画下几条曲线当做历史收益曲线,思考下这个问题。一个经典的回答就是最大回撤率的含义,它的思路是这样的,既然我们还在拿历史数据做回测,说明我们应当还是相信历史对未来有指导意义的,那么我现在实盘用真钱去跟策略操作,接下来我们假设策略收益的未来走势应当是跟历史走势相当的,历史走势有一直涨的时候,也有一直跌的时候,那么我实盘跟策略最大亏损率应该就是,我刚开始跟策略就开始走的跟历史走势中一直跌的那一段那样,而且是一直跌且跌的最多的那段,那么历史走势中一直跌且跌的最多的那段跌跌了多少呢?用人眼一般很容易找到是哪段,而且聚宽的回测图中也标出了,如下图。不过不妨进一步思考下怎么算出最大回撤率,然后看下文档中的公式说明,看你的结果是否正确。当然,初学者知道最大回撤率越小越好可能就够了,但有志者应该借机学习如何思考如何评估风险以及量化风险,因为难度相对不高。
交易次数。交易次数其实是一个可以初步衡量策略回测结果是否可靠的指标,过少往往意味着回测结果不可靠。试想这样一种情况,别人给你推荐一个策略,策略进行了10年历史数据的回测,年化收益非常高,最大回撤非常小,你很高兴,但仔细一看,交易次数只有2次,此时,你愿意用真金白银去使用这个策略吗?你难免会想可能只是这2次操作运气好而已,这样的回测结果虽好但是不可信不可靠。其实这基于一个简单统计学思想,样本过少,则统计结果不可靠,所以足够多的交易次数才能让回测结果有说服力。目前,回测结果中不能直接看到交易次数了,可以通过回测结果页面的其他指标中的盈利次数与亏损次数相加得到,也可以通过回测结果图表下面的每日买卖大致看出,位置如下图。
Alpha(阿尔法)与Beta(贝塔)。在资本资产定价模型(CAPM)中,投资组合的收益被分为和市场系统风险相关与和市场系统风险无关的两部分,而Beta与Alpha这两个希腊字母则是该模型中的两个重要系数,分别代表这相关部分与无关部分。其实策略持有的股票可以看成一个投资组合,基准收益作为市场系统收益,Beta则是代表相关部分的策略收益相对市场波动的倍率,如Beta为2则代表市场涨1%,相关部分的策略收益波动涨大概2%(统计意义上并非实时精确),beta为负数代表与市场反向变动。而Alpha则代表独立于市场波动不受其影响的无关部分的策略收益,越大越好,所以如果策略年化收益为负但Alpha为正而且很大,说明策略有超过市场的盈利能力,不过策略整体盈利被与市场相关部分拉下来了。为了便于理解,Alpha与Beta的含义讲的很粗暴,建议数理基础不错的有志者有空去自学下Alpha与Beta的构造思路与过程。
夏普比率(Sharpe Ratio)。代表所承担的单位风险所带来的收益,越大越好。夏普比率是在资本资产定价模型进一步发展得来的,不展开讲。
建立模拟交易
之前讲过回测是用历史数据模拟执行策略,模拟交易是用未来的实际行情模拟执行策略,因此当策略完善的自以为差不多没什么问题时,建议建立一个模拟交易观察一段时间,当作进一步的检验。建立的模拟交易的方法很简单,点击回测结果界面,如下图,右上部红色模拟交易按钮,即可新建模拟交易。
建立模拟交易成功后,点击聚宽导航栏我的交易,可以看到创建的模拟交易,如下图。
点击右边的微信通知开关,将OFF调到ON,按照指示扫描二维码,绑定微信,就能微信接收交易信号了。当策略买卖操作,微信会收到信号提醒类似下图。自定义消息内容请看API send_message。
未来函数
未来函数的前文讲过,即指策略利用了历史当时无法得到的信息,造成回测结果极大失真。未来函数排查方法一般是人工查看,重点看一切跟时间有关的地方,尤其注意各个API关于时间的默认处理方法。当然有时未来函数隐藏的很隐蔽,而更好但稍花时间的方法是用策略建立模拟交易,一般让模拟交易运行几天,多数未来函数问题都能被发现,因为模拟交易是不可能引入未来数据的,所以往往引入未来函数的策略无法成功运行模拟交易。
需要注意的是有时同一个代码的策略在模拟交易中是没有引入未来函数的,而是在历史回测中引入未来函数。此时会发现历史回测结果很好,模拟交易也能正常运行,但回测结果是失真的,而模拟交易运行时间长了往往也与回测相去甚远。一个具体的情况是,策略无意中引入了未来信息,导致策略选的股票过去一年中涨的最好的股票买,那么当然用过去一年做回测时效果会很好,但在模拟交易中可能就效果很差。
一条判断策略引入未来函数的经验法则是,当你发现策略回测收益极高,回撤又极低,而且各个时间段表现都特别好,感觉自己发现了自动印钞机式的交易策略时,则此策略大概率是引入未来函数了:)
运行过慢
策略的运行效率也是需要关注的问题,尽管新手几乎不会遇到,但需要简单了解下,有个意识。有时策略比较复杂,计算量会很大,极端时可能会造成交易延迟,延误买股票的时机,分钟级策略尤其需要关注下耗时问题,而相关函数就是enable_profile() API文档-性能分析
用法就是把enable_profile()这行代码复制粘贴放到策略代码的第一行。然后你成功回测后可以在回测详情页面查看性能分析的结果,如下图,从而可以查看哪行代码耗时比较多,从而有目的性的去改进。
过拟合
过拟合(overfitting)常用于描述这样的情况。策略一般都有一些参数,如持股数量、交易频率等,选择不同的参数,固定的一份历史数据下,策略的回测结果好坏也不同,人们往往会选回测结果最好的参数作为策略的参数使用,但随后若换了一份历史数据(换一个时间段)做回测或随后用现实数据运行模拟或实盘,发现效果远不如之前的回测结果,此时很可能策略的参数过拟合了,或说之前选回测结果最好的参数这一行为使参数过拟合了。当参数多的时候,更容易发生。
过拟合的核心思想是,过度细致的解读样本数据,从而没有认识到本质的规律,从而使策略或系统失去了普适性,对原样本数据表现极其优异,但对非原样本数据外情况的有效性大大降低。
一个关于帮助理解过拟合的比喻是,老师拿一个试卷(样本数据)考学生(策略),学生成绩不理想,老师要教学生(调整参数),此时老师不是教学生学科原理,而是教学生背试卷的答案(过度拟合),当然结果会导致,当再考同一个试卷时学生肯定表现极度优异,但因为只背了答案而没理解原理,所以当换套题目或应用时学生就表现极差了。
因此在选择并优化策略的参数时,要考虑参数的鲁棒性,即策略好坏对参数变化的敏感性。对于参数优化与选择对应有复杂最优化理论与鲁棒性测试,对初学者在此问题建议是,控制参数数量,多测几组参数大致看下参数变化对策略的影响,另外考虑进行样本外测试,即用一份样本数据回测挑选参数,用另一份样本数据回测看选择的参数在样本外情况下表现如何。
策略失效
策略一般是有时效的。当你的策略十分完善,并且模拟效果理想,实盘效果也很理想,不要以为策略就会像印钞机一样一直赚钱,策略可以失效的,比如当策略运行中出现历史上罕见的情形时往往就要警惕了,比如最大回撤创历史新高,策略收益率不再增加甚至减少等。如何判断策略是否失效以及找出失效的原因并无通法,但策略失效的原因可能有以下几种,可供参考。
策略生效的逻辑基础不再成立。比如策略的有效性是建立在涨跌停制度下的、或是建立在某行业不断成长前提下的、或是建立在全球某资源持续稀缺前提下的等,当这些制度或前提不再成立,如制度调整、新政发布、科技进步等,那么策略自然也就失效了。因此,理解策略有效的逻辑是十分重要的。
操作资金量过大。更大的操作资金,会导致更大的冲击成本,即使买入时价更高、卖出时价更低,而当操作资金过大使市场流动性不足承载时,冲击成本会极大的变高,大大降低利润,甚至导致亏损。所以策略是有资金容量的,建议逐步增大策略操作资金量。
市场上运行的相似策略过多。同类相似的策略都想赚市场上的同一份钱,然而这份钱是有限的,所以这些策略彼此间会竞争,导致策略赚钱变难,甚至完全失效赚不到钱。具体的表现可能是要买的股票买不到、想卖的股票卖不到理想价位等。因此,交易行业是非常注意保密且不适合分享的行业,而有志者则要注重培养自学能力。
市场出现了寄生策略。当你的策略被发现市场中的有心人发现并足够程度的监测时,他可以写出一个针对你策略的策略,从而寄生在你的策略上,比如在比你买之前买入,在你买后拉升股价后卖。这种针对你策略的寄生策略,往往会压缩你策略的盈利空间,使策略失效。
收益与风险的取舍
往往策略的收益能力与抗风险能力是互相制约不能兼顾的,两者之间如何取舍建议是,达到基本的收益能力后,极力追求低风险,理由是盈利水平往往可以通过增加资金量来提高。具体的讲就是,策略a是一个年化收益率300%,最大回撤率50%的策略,策略b是一个年化收益率30%,最大回撤率5%的策略,只要给策略b提供相当于策略a的10倍的资金量,两者盈利能力就是一样的,但很难让策略a有像策略b一样的抗风险能力。
自测与自学
尝试下建立模拟以及用微信接收交易信号。
到聚宽的策略擂台栏目看看他人的策略。
策略成功回测后,体验下归因分析这个新功能,位置如图。