欢迎你们订阅《Python实战-构建基于股票的量化交易系统》小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,而且会有选择地收录至小册中,更便于广大读者查阅知识点。本篇专栏为小册子内容的加推篇!!!微信
目前量化交易正在不断地快速发展,量化交易的可回测性是区别于主观投资的重要特征。量化回测是指基于历史行情数据将交易策略产生历史交易,从而评估交易策略的历史表现。markdown
网上出现了愈来愈多的分析软件、交易策略,咋一看回测的效果都很是漂亮,获利百分之几百的收益十分广泛。可是这个收益业绩却有多是高估的,不明真相的朋友购买后本身使用时才发现现实是残酷的。网络
这里建议你们在亲眼看到策略代码以前,都要保持半信半疑的谨慎态度,由于策略的收益是能够人为作出来的。真正赚钱的策略必定是由本身开发并创建起自信的策略,这也是笔者为何要介绍你们制做量化交易策略的方法,授人鱼不如授人以渔嘛。测试
对于我的编写的交易策略每每也会存在,回测效果很是完美,实盘却可能表现不佳。优化
为了不在回测过程当中高估策略的业绩表现,咱们须要考虑如何编写回测程序以及如何构造交易策略。spa
本次小册的加推篇咱们来一块儿扒一扒量化交易中常见回测陷阱。code
前视误差是指在策略回测阶段采起了将来的信息来决定以前的交易,而这些信息在实盘操做中是没法获知的。这里咱们提供几个典型的案例来介绍下:orm
买入策略1:“当天的收盘价突破前一天的最高价,则利用当天开盘价买入股票”,很明显,在开盘价成交几乎是不可能的事情了。开发
买入策略2:“当日K线突破M20均线的时候以当前开盘价买入股票”,很明显,在开盘的时候是没法预知今日K线最终是否是可以突破M20均线。get
前视误差是咱们要极力避免的错误。如何避免前视误差?可使用“滞后”的历史数据来计算策略信号。滞后的数据意味着,在涉及到移动平均值、最高价、最低价、成交量等指标时,只使用“上一”交易日的收盘数据。好比如下代码:
""" 收盘价超过N1最高价 买入股票持有""" buy_index = stock_df[stock_df.Close > stock_df.N1_High.shift(1)].index stock_df.loc[buy_index,'signal'] = 1 """ 收盘价超过N2最低价 卖出股票持有""" sell_index = stock_df[stock_df.Close < stock_df.N2_Low.shift(1)].index stock_df.loc[sell_index,'signal'] = 0 复制代码
shift(1)是在index不变的状况下对序列的值向后移动一个单位。目的是获取昨天为止的最高/最低价格。这样就能使用“滞后”的历史数据来计算策略信号。
若是一个交易策略要求你利用信号触发时的价格进行交易,那么这个交易策略就存在偷价的状况。
不少人会低估偷价的危害性,事实上,固定点数的偷价至关于在本来的资金曲线上叠加了一条斜率为正的直线(在每次交易都是固定手数的状况下)。
假设一年250个交易日,每一个交易日均对一只长期保持10元的股票执行一次100股的买卖,每次买卖都偷价1个tick(tick设置为1个点,即0.1元),那么整年下来能够多获利500*0.1*100 = 5000元
,这甚至超越了你的本金。
然而,现实的状况是不但没法低于一个tick的价格成交,更多的反而是高于一个甚至多个tick的价格成交。缘由很简单,大多数趋势交易者都会在某个关键点位建仓,竞争致使价格在这些关键位置造成剧烈波动,而且这种波动一般是对程序化交易不利的波动。因此在构建一个频率较高的交易系统的时候,更可能是要考虑和解决滑点问题。
手续费至关于在本来的资金曲线上叠加了一条斜率为负的直线(在每次交易都是固定手数的状况下)。策略进行测试时,若是不计入手续费,资金曲线可能会产生巨大差别,甚至不计手续费时盈利的策略,在计入手续费后可能产生亏损。 当前股票交易费用由三部分组成:佣金、印花税、过户费(仅上海股票收取)
印花税:成交金额的1‰。2008年9月19日至今由向双边征收改成向出让方单边征收(卖的时候才收取)。受让者再也不缴纳印花税。投资者在买卖成交后支付给财税部门的税收。上海股票及深圳股票均按实际成交金额的千分之一支付,此税收由券商代扣后由交易所统一代缴。债券与基金交易均免交此项税收。
过户费:这是指股票成交后,更换户名所需支付的费用。根据中国登记结算公司的发文《关于调整A股交易过户费收费标准有关事项的通知》,从2015年8月1日起已经更改成上海和深圳都进行收取,此费用按成交金额的0.02‰收取。
交易佣金:最高收费为3‰,最低收费5元。
滑点是指触发指令的价格和最终成交价格之间的差别,它是不免会发生的状况,一般滑点产生的缘由有如下两类:
行情波动剧烈、市场容量不够等状况致使的
网络延迟、交易平台不稳定等状况致使的
滑点是一个合格的交易策略必须充分考虑的因素。若是在一个交易策略中,将滑点数设置为0,即采用现价指令买卖证券其资金曲线就会优于同一个滑点数不为0的策略。一般咱们要在最极端的条件下去构建和测试系统,通常系统都是高于2个tick的滑点来构建的。
过分优化是指为了迁就历史数据的噪音而将一个策略的参数或者规则反复优化到最佳的状况。
显然,即使是一个不能赚钱的策略,若是用暴力枚举法优化选取参数,也可以有个别参数可以使策略盈利,可是根据过分优化获得的最佳参数来制定策略和控制风险,在实盘中是难以盈利的。
避免过分优化的有效办法有如下几个:
通常而言,策略的规则越多,模型的参数越多,就越可能出现过分拟合问题。所以采用的参数越少,能够优化的规则越少,天然过分优化的状况就可以获得很好的避免,而且,越少参数构建的策略,每每越稳健。
合理选择样本。有些策略覆盖的股票品种太少,时间周期过短,不能充分展示策略效果。好比策略只用于个别品种上,或者仅仅覆盖了一种类型的行情。这些策略在遇到大相径庭的市场状况时,表现可能会截然不同。
进行样本外测试。构建策略模型时,将历史数据根据时间前后分为两段。参数优化和定性选择使用前一段数据(训练集),策略模型的测试使用后一段数据(测试集)。
以上介绍的这些策略陷阱都有一个共性,就是在回测时表现地很是优异,但与实盘并不相符,不少交易者在策略的开发中不自觉地会犯下这类错误,若是将回测结果做为本身预期收益和风险管理的依据,后果不堪设想,你们千万要引觉得戒。
更多的量化交易内容欢迎你们订阅小册阅读!!同时也欢迎你们关注个人微信公众号【元宵大师带你用Python量化交易】了解更多Python量化交易相关内容