策略的完整开发流程是怎样的?
某一天的早晨,你从床上醒来,突然想到“我是不是可以根据换手率的变化率来判断买入点?是不是可以根据不同换手率下的当日收益率来判断走势?”,你马上起床去找一个本子,胡乱写下几条交易规则,这就是实打实的策略了,但关键赚不赚钱这另说。
当然不是这样子的,至少在量化投资领域不是!
在量化界,证实一个投资策略在过去历史中是否有效的过程就是回测(Backtest),也就是说,你构建了一个投资模型,将其放到历史数据当中“跑一跑”,看看盈亏情况如何。
如果回测的净值曲线一直“萎靡不振”或“狂泻不止”,而且程序里面没检查出啥错误,那这个投资策略就很有可能就是无效的(至少在历史当中)。一般情况下,回测的效果要比实盘效果好一些,回测效果都不好的情况下,那实盘效果更加堪忧。
如果回测的净值曲线坚挺向上,稳稳的四十五度角,那也不要高兴的太早哦,那可能是“未来函数”或“过度拟合”在作祟,只有在排除这两者和程序错误之后,才有上模拟盘和实盘的意义。
那一个典型完整的策略开发流程是怎么样的呢?

作为过来人,给大家分享几个快速获取策略想法的途径:
1)大神分享的策略。除了策略想法,还可能有实现的高清源码哦,许多量化平台上都会有许多大神用户分享策略和源码,股票多因子和期货CTA都有。
2)券商的金融工程/量化研报。许多券商的研究团队都会对外分享关于量化的研究报告,里面一般会有详细的实现途径和测试结果供你参考。
3)金融交易书籍。有许多金融交易书籍里面会提到可量化的投资策略,比如说著名的《海龟策略》等。
做量化一般使用到的编程语言是Python、C++和其他量化平台独有的语言。Python是开发策略的效率非常高,几十行代码就可以实现一个策略,但是程序的执行速度相对C++来说会比较慢,但只要不是做高频交易,速度还可以接受。
由于C++的周边资源没有Python那么丰富,开发一个量化策略着实让人抓狂,计算一个简单20日移动均线值都得自己一一实现,总体来说,实现同一个策略的代码量,C++一般是Python的三倍以上。
有的量化基金为了同时兼得“鱼和熊掌”,往往是用Python快速验证策略的有效性,然后采用C++重新实现策略,提高执行速度。如果你是量化初学者,Python会更“平易近人”一些。
为大家推荐几个宽客常用的第三方量化平台:
股票:聚宽(JoinQuant)、优矿(Uqer)、米筐(RiceQuant),这三个平台皆是使用Python编程语言,都可以免费注册和使用。对了,还有可以无需编程实现股票策略的果仁网(guorn)哦。
期货CTA:交易开拓者(TradeBlazer)、文华、金字塔(weistock)、MultiCharts(MC),这四个平台基本都是使用自家的编程语言,不过新版交易开拓者(TBQuant)和金字塔支持使用Python。
以上这些平台都可以通过平台的中文名称或者英文名称在度娘里搜索到。
在策略回测和策略实现中最需要回避的就是未来函数的问题。
未来函数就是在策略中使用了未来的信息。由于证券价格都属于时间序列,站在历史中某个时点是看不到其后的数据的,但是在回测中我们是可以提前获取全部历史数据,由于人为失误在历史某个节点调用了未来的数据,获取了属于未来的信息。
举个例子,有人开发了这么一个低买高卖的策略:每日尾盘买入股票A,在第二日最高价的时候卖出。净值曲线非常完美,收益率高回撤小,但是明显犯了未来函数的错误,因为在第二日的时候,只要该日行情未走完就无法确定该日的最高价,他按照最高价卖出,就相当于使用了未来信息。
典型的未来函数错误还有:在当前年度调用当前的年度的财报数据,使用前复权数据做策略回测,不完整周期调用完整周期数据……
比如说,开发一个股票动量策略,当个股在一定期限内(例如20个交易日)上涨幅度达到某个阈值,便买入,对于小盘股和银行股来说,这个上涨幅度的阈值明显是不一样的,小盘股的波动率比较高,一个月涨20%都很正常,但是对于银行股来说,一般行情下一个月上涨20%的概率就小的多,因此做不同板块的股票所设置的参数可能就会不太相同,需要参数优化。
但是也不能矫枉过正哦,这样就会引发“过度拟合”或“过度优化”问题。
过度拟合,顾名思义,就是拟合得太过分了,专门针对样本内的数据进行优化,为了获得好看的回测曲线,全然不顾这个策略的通用性能否推广到样本外的数据上。
做一个类比,就跟男生追女孩儿一样,一哥们儿追过两三个文科女生,写朦胧情诗、下川菜馆子、送动漫周边等,基本都成功了,然后就写了一本《泡*妞*秘*籍》自诩天下无敌,那可能别人拿去追理工科女生就可能只收到“好人卡”了。要考虑行情的多样性,就像要考虑女生类型的多样性一样

模拟考最大的目的就是帮助我们查漏补缺,因为策略开发当中考虑得再细致,也可能忽略了现实当中的一些细节,需要在模拟盘中跟实时行情对接后才能发现。就跟军事模拟演习一样,平时多流汗,战场少流血,实际投资交易当中就会减少很多真金白银的损失。
模拟交易就是将策略跟实际实时行情进行对接,但不是采用真金白银进行交易,而是使用模拟账号进行模拟,若策略在模拟盘中稳定盈利,则可以上实盘赚真金白银了。
现在做策略模拟都非常方便了,在“编程实现”小节中推荐介绍得那些量化平台基本都有这个功能,也就是设置几下的问题。
对于量化初学者来说,模拟盘中一般来说需要考虑以下几点:
1)在策略开发实现当中没有考虑到品种的流动性问题,导致模拟盘无法成交;
2)对于短线策略,模拟盘实际成交滑点过大,策略出现亏损;
3)实时行情不像清洗整理好的历史数据那么“干净”,可能出现噪音数据、数据延迟和无数据,若策略中没有完善的数据确认和对齐机制,可能会出现“频繁发单”和“乱发单”等问题。
4)自建或第三方量化平台系统或行情不稳定,无法正常运行交易。
如果让我挑两者之间最大的差别,那肯定不是技术层面的,而是人的心态,就是历经历史数据和实时数据重重考验的策略在实盘交易中出现较大回撤之后,你还能不能坚持让策略跑下去。
模拟盘中也会出现回撤,但亏的不是真金白银,因此自己表现的云淡风轻,但实盘亏损的可是真金白银,那就真真让人肉疼了。
因为没有100%完美的量化策略,能适应所有的行情,特别是对于低胜率高赔率的趋势策略,两三单亏损之后就不敢再开仓了,立马把策略程序停掉,想不到的却是后来净值默默创了新高。
那可能有人要问了,难道坚持任由策略亏损下去?
虽然我劝诸位坚持,但我可没说过这话,在实际操作当中,最简单的原则就是,如果实盘交易中最大回撤是历史回撤的1.5~2倍,那这个策略可能就要停下来的,反思一下是需要调整策略参数,还是市场逻辑已经发生了根本性变化。
本文系作者 @root 原创发布在 CycleGen。未经许可,禁止转载。