交易小苑24:量化交易从零到一


(astroman) #1

写这篇文章的目的,是为广大想从事量化交易行业的朋友提供一个简单的行动指南。这两天一直有朋友问我如何搭建一个简单的量化交易系统,这篇文章就是一个初步的解答和步骤。因为时间有限,我没有办法完全一对一的互动,因此会以先写一篇攻略,解答共性多的问题,然后再单独回答一些特例的问题,再把特例总结成共性这样交替进行的方式实现。

量化交易本来是一件非常简单的事情,但是由于市面上很多书籍和教学内容过于深入量化交易的某一方面,比如如何写python代码,或者某一种特定的策略,而让很多初学的人产生了很多误解。有些人花了几个月去学习某一种编程语言,学会了语言,却依然不知道量化怎么做;有些人看了很多策略的样例,但是光有策略,却不知道如何将策略真实的变成交易所中的实际仓位。所以我想做的事情,就是先让读者把骨架的东西学会,花几天的时间,就可以将一个简单的策略交易起来(对的,就是几天甚至一天的时间),只有你开始交易了,你才会对市场有更多的思考,知道哪里需要改进,为了改进,比如为了交易更多的标的,更快的下单,你就会去学计算机语言;为了优化策略,你就可以去看别人是如何构建更稳健的策略的;或者你的策略多了,你就有了学习策略组合优化的动力。

但所有的前提是,你可以通过量化的方法,先开始交易起来,在市场中获得成长;而不是这看看,那看看,花了几个月,但是依然没有入门。

为什么要做量化交易?

交易,或者量化交易,其实就是一门手艺,一项技能。当你水平达到一定程度之前,你需要投入一定的时间,实盘测试的时候需要亏掉一点点钱(对于低频的策略,可以模拟盘,连钱都不需要亏);而水平达到一定程度之后,你可以稳定的获取一定的收入回报,如果你愿意全力投入,你甚至也可以做一个基金经理,或者开设一家对冲基金(当然这样,你的要求就不是赚钱这么简单了,而是要达到一定的盈利标准)。

量化交易,相对主观交易的好处是,入门的学习曲线更平缓;并且水平达到一定程度之后,更容易保持水平,不像主观交易还需要每日操劳,量化交易可以让你实现躺赚的目标(当然最好还是每年花至少几天的时间做一些研究,来适应市场新的变化)。

当然,量化交易不是所有人都会马上成功的,但是做量化的过程中有很多对你有益的副产品,尤其是计算机技术这方面,其实对于未来的职业发展也是非常有帮助的。比如我认识一个朋友,做量化没赚到钱,但是在写代码过程中发现了自己做软件开发的兴趣和天赋,后来凭借做量化的开发经验,找到了一家游戏公司的工作。

量化交易的本质

量化交易其实并不复杂,本质就是寻找市场中对于未来价格变化有预测能力的一些特征。然后当这些特征再次出现的时候,你认为历史会重复(概率上的重复,比如出现10次,6次对,4次错误,最后平均的预测还是对的)。

这一点是量化超越主观的一个好处。人也会观察市场现象,然后做预测,但是如果预测错了,人会觉得这个现象预测不准确,没法用。而量化却依然可以用,因为量化可以根据同样的现象做大量的预测,只需要预测结果平均起来,打赢交易成本,就可以了。因此人的主观交易,需要产生预测能力非常强的判断,但是量化交易,却可以集成大量只有微弱预测能力的现象,组合起来产生更好的预测。

如何寻找预测性现象

预测的现象并不是特别难找,最简单的方式,就是自己观察市场,发现一些特例的规律,然后看看能不能普适到历史的场景,或者所有的交易品种上。比如,在某些交易周期,连续上涨3个周期,未来平均意义上,会继续上涨;比如短期均线和长期均线,短期均线上穿长期均线,未来平均意义上,会继续上涨。这些预测性现象看起来虽然既“低端”,又“烂大街”,但实际上稍微加一些限制或者改变,也是可以找到预测性还可以的组合的。

这里是一个个人建议。虽然市面上有很多看起来复杂,高端的做预测的方法,但是对于初学者来说,一个是要花很多时间搞清楚其背后的基础理论,一个是里面有很多细节,搞不好就会出错,并且搞出来,虽然可能和简单的方法相关性很低,但是预测性其实是半斤八两。所以仅仅从刚开始进行量化交易的角度,与其花费一周时间搞清楚一个复杂的,不如先花几分钟时间,把简单的先搞一搞。之后随着你的理解水平的提高和经验的丰富,你可以根据你的口味,选择自己更喜爱的方式。

除了观察市场之外,也有很多其他的灵感来源。现在知乎、公众号有很多量化、程序化交易的文章,也有很多传统技术分析的方法,上面有大量对于市场的朴素观察可以提供灵感。python,R,MATLAB有一些别人开发好的技术分析库,也可以参考借鉴(但是我不推荐直接调用函数,而是自己重新实现一遍,理解这个函数本质是在描述什么现象)。再者,就是大量的学术论文了,也是有帮助的。

这个过程中,还需要练习自己的一个能力,就是将一些模糊的市场观察,转化成计算机可以理解的数据的能力。把过去的价量信息或者其他的信息,变成一个数字序列,或者一个方向预测序列,如何实现,这个地方需要动一些脑筋。

如何检验预测性现象

检测预测性现象的方法有很多,用来解决不同的问题和需求。但是一般来说,我们掌握一个最简单的方法,就可以解决大部分的场景了。之后如果有其他的需求,我们再二次学习即可(这一点一直在反复强调,就是初学者不要被一些看似高端的方法迷惑,导致无从下口、邯郸学步,其实大部分时候,用一些简单的方法就足够了)。

检测预测性现象最简单的方法,就是历史回测。

做历史回测,需要几个前提,一个是有历史数据。历史数据最简单的方法是管我要,但是因为精力有限,因此我可能会回复的比较慢。想自力更生的话,这里篇幅有限,不能详细介绍,只介绍一些常见的来源。通达信、开拓者、tushare可以下载免费的历史数据,但是有一些限制。如果愿意花一点钱的话,rqdata,或者从淘宝买也是可以的。有一些针对机构的数据库,比如wind,聚源,天软等等,但是对刚开始的个人来说,可能会有点贵,可以自己探索一下。

下面就是如何回测了。很多人有个误区是,做量化,就要学个诸如python,R,Matlab这样的语言。其实Excel做回测就足够了。当然,如果你想实现复杂的事情,别人用python一秒搞定的事,你需要在Excel操作上十分钟,你肯定会觉得很辛苦。所以学习语言也是必要的,可以让你的生活更轻松一点。

我们这里提供一个最简单的历史回测模板,对于做一个粗糙的回测是足够了,对于不会编程的朋友,在Excel里就可以操作;如果会编程,可以使用任何语言序列类的数据结构轻松实现相同的操作。

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘711’%20height='461’>)

案例中,我们只使用收盘价格close_price,来构建一个双均线交易策略。这个策略的前提假设是,我们只在收到数据点时刻进行交易决策,是行情数据驱动类型的策略。(这样很简单,不需要考虑未来数据的问题,实际上回测有一些常见的错误,但是篇幅有限没法深入,这块内容很多书籍都讲述的很清楚了)

右侧的ma3和ma6分别是过去三个数据周期的收盘价平均值,即三周期moving average;和六周期均值。我们认为如果短期均线在长期均线之上,未来上涨的概率更大;短期均线在长期均线之下,未来下跌的概率更大,因此短期均线和长期均线的差值有预测性。右侧的ma3_ma6_diff就是其差值。

这个差值可以有很多不同的用法,有时候也需要做标准化,大家可以修改我的做法。我的做法是最粗糙的一种,就是如果是正值,就开多一手,如果是负值,就开空一手(如果之前有多头,就平多反空),得到右侧的target_position列。

有了close_price和target_position,我们就可以计算策略的损益(PnL)情况。每一个周期的pnl,等于前一期的持仓乘以这一期的收盘价和前一期收盘价的差额(当然很多人喜欢用价格变动,即收益来做研究,那么就乘以当期价格变动即可)。比如以第12行为例,之前的持仓是-1(11行),在11到12行的过程中,价格从1001涨到了1005,因此造成了-1*(1005-1001)=-4的亏损。这一期策略翻多,下一期的损益就是1*(1007-1005)=2的盈利。我们按照这个方法,计算出interval_pnl列。

交易涉及交易成本,包括手续费和市场冲击(滑点)等等,我们假设交易成本为1,计算出trade_cost列。最后累加interval_pnl,并减去trade_cost,计算出最后的累积利润cum_pnl。

所以基础的回测,其实是非常简单的,即使在Excel中,也大概只需要花费5分钟的时间(数据太多的话,记得利用单元格右下角的向下填充功能),如果用其他语言,也就是两行代码三四秒钟的时间。

所以一些朋友,开始学做量化的时候,问我,开发一个回测平台,需要多久时间?我回答5分钟,他们以为我是忽悠他们。实际上,搞一个简单的,确实是非常容易的,但是如果你想考虑一些复杂的因素,或者实现一些便利的测试和分析功能,那确实需要花很久时间。但是你究竟需不需要这些功能呢?你又不是卖软件的,你只需要开发你自己觉得有用的功能。你可以一点一点加进来,或者如果你赚钱了,可以雇人帮你加进来。(总之,之后的开发,都是为了让你的生活更轻松)

评价策略的话,最简单就是看曲线,看看曲线好不好,然后算收益率啊,各种比率啊,最大回撤什么的,篇幅有限,就不多说了,百度一下吧。

实时行情

如果你的交易是基于日级别数据的,那么实时行情就很简单,交易标的不多的话,你甚至可以手工更新。但是如果是基于分钟数据,那么就有一定难度,因为你几乎不可以用手工的方式更新,如果你的策略对决策速度有要求,你甚至需要考虑如何减少行情延迟这样的问题,对于初学者来说,这块是不太友好的。

对于股票数据,目前有诸如tushare,新浪等等的可以提供免费实时行情的来源,同时也有一些收费的解决方案。但是都需要一点点编程技巧,这篇文章没办法展开。

对于期货,如果你有一个期货账户(或者开一个simnow的模拟账户),你是可以自己订阅免费的数据的,但是你需要开发接口。不过一个好的消息是,我自己弄了一个简单的小工具,只要你有期货账户,就可以在一个文件夹里面自动下载好excel可以阅读编辑的csv类型行情数据。然后你可以用Excel打开拖拽产生目标持仓,或者用任何编程语言,读取这个文件更新数据,都可以。

交易执行

有了策略,最后一步就是如何把策略转化成市场中实际的仓位,从而赚钱(或者亏钱)了。

现在市面上有个误区,就是把量化交易和程序化交易搞混,认为量化交易必须是完全自动化下单的。但是实际上,国内外很多规模很大的量化基金,都是量化团队产生目标持仓,然后由人工下达到市场里面的(比如英国著名的3家CTA基金,我认识其中一家的国内的交易员,他们的工作就是,上午手工把交易目标实现,然后下午去跑路演,因为他们一天只调一次仓)。所以量化是量化,通过量化的方法产生目标仓位;程序化是程序化,通过计算机把订单下达。做量化不一定要程序化;程序化,也可以是人决策目标持仓,然后由程序执行。

当然,如果你要做高频交易,或者每天交易几次或者几十次类型的策略,那么就还是要程序化自动执行一下的。完全手敲,就算你自己不觉得辛苦,也很容易出错。但是如果你选择那种持仓在几天甚至几周的策略,纯手工也是完全可行的。

目前,国内比较规范的,适合大部分人的交易标的,一般来自于两家证券交易所(上交、深交)和四家期货交易所(中金、上期、郑商、大商)。

对于证券交易所,大部分标的每天只能交易一次,并且一般的交易者也很难获得程序化接口,因此量化决策,手工执行是非常现实的解决方案(当然,股票量化策略比我上面介绍的案例要复杂一些,因为你需要在接近或者超过1000只标的里面做决策,并且做空非常困难,因此需要一些特殊的方法)。

对于期货交易所,进行自动化交易是十分简单的。市面上有大量的工具来实现期货的自动化交易,但是我比较不喜欢的一点就是,一定要用户绑定某一种特定的语言。比如需要用户用python接受行情下单订单,同时用python做策略;或者用一个内置的自己写的语言,来做策略。这样很不自由,也很不干净,把简单的事情搞的很复杂。

我自己做了一个工具,我起名叫LeGao,其实就是一个c++版本的期货交易接口,实现了一个简单的篮子下单功能,同时可以下载实时行情。具体的运作方式是,工具会给你你打开软件后接收到的全部实时行情,你自己update这些数据到历史行情之后,然后通过任何方法(Excel拖拽,VBA,python,matlab,R,stata,c++)产生一个你希望的目标持仓,然后工具会帮助你实现成,交易所里面的真实仓位。取名LeGao的意思,也是如此,就是给你最基本的塑料块,把麻烦的地方解决完,剩下的,交给使用者,使用者愿意简单的摞起来也可以,愿意做一个变形金刚也可以,全看本事。自由,干净,比较符合我的审美。

结语

这篇文章的灵感来自于EP Chan,一个美国比较有名的量化交易“教育家”,教育家这名字有点调侃,不过他管理的基金也是不错的。他的经历是先在一些知名的投资银行和对冲基金(摩根斯坦利、瑞士信贷、千禧年),但是职业生涯比较失败,他试图用一些复杂的数学工具和先进的计算工具来开发策略,但是根本赚不到钱。后来他离开了专业投资机构,在家里办公,从最简单的策略开始,管理自己之前攒下的工资,最后反而越做越好,不仅仅教育工作被认可,管理的基金也蒸蒸日上。

EP Chan的经验告诉我们,机构交易者不一定有完全的优势,只要个人交易者使用正确的方法,也可以在市场中找到自己的位置。

我的第一份工作是一家传统的培养主观/日内/套利交易员的公司,公司在交易技术方面在我入职之后,逐渐落伍,但是公司的一套系统化的发掘、培养交易员,让大部分交易员可以盈利,并在其中可以挖掘出一两个明星交易员的模式,我觉得还是非常有趣的。但是如何在国内环境下,培养出一个明星交易员,或者一个明星量化交易员,我这一年一直在尝试,这事也确实不容易。今年的成就,是帮一个之前水下的朋友,回到了水上;当然这也不是我的功劳,这位朋友比大部分人都更热爱交易,更努力,花了非常多的时间在上面,非常敬佩。今天刚好是2018年的最后一天,2019年的目标,是希望可以帮助一两个朋友取得足够好的业绩吧。

这篇文章算是在培养量化明星交易员的探索工作中迈出的第一步,但是远远不够。这篇文章的作用,仅仅是告诉你怎么走路,但是要赚钱,还需要很多细节的探索。有些聪明的朋友可以自己完成这些步骤,但是大部分人,还是会有自己的疑问。所以欢迎大家私信我,我可以有空的时候回答大家的问题(最近时间比较少,回复比较慢还请见谅),然后把共性的问题整理出来,给大家解答。说实话,解答问题的过程我是很有收获的,大家的脑回路的差异超出了我的预期。另外如果希望用到LeGao这个小工具,愿意帮我测试和提供改进的思路,也欢迎联系我哈。

祝大家2019交易精进,诸君大赚!