不想错过精彩课程?一键“订阅”,轻松学习!
大家好,欢迎来到金十交易学院《智能量化交易》课程。
摘要:上篇我们学习了Python语言的简介、基础语法、策略框架等等。虽然内容很枯燥,但这是你实现交易策略的必备技能,也是必须要学会的。那么本篇我们将趁热打铁,继续上篇的Python基础知识,从一个简单的策略入手,边学边用,一步一步帮助大家实现一个可行的量化交易策略。
一、唐奇安通道策略简介
在众多交易策略中,唐奇安通道策略应该是最为经典的突破类策略之一,早在1970年就已经大名远扬,当时国外有家公司专门对主流的程序化交易策略进行模拟测试和研究,结果表明,在所有策略测试中,唐奇安通道策略最为成功。
后来,在美国又发生了一件交易历史上最著名的“海龟”交易员培训,造就了巨大的成功。当时“海龟们”的交易方法是保密的,但过了十几年,《海龟交易法则》公之于众,人们才发现“海龟们”用的正是改进版的唐奇安通道策略。
突破型交易策略适应于走势比较流畅的交易品种,最常见的突破交易方式就是,利用价格与支撑和阻力的相对位置关系,来判断具体交易买卖点位。本节的唐奇安通道策略也正是基于这个原理。
二、唐奇安通道策略规则
唐奇安通道属于趋势型指标,它的外表与信号与布林带指标有点相像。但是唐奇安的价格通道是根据一定期间内的最高价格与最低价格构建的。比如:在计算最近50根K线最高价的最大值,形成上轨;计算最近50根K线最低价的最小值,形成下轨。
如上图所示:该指标由3条不同颜色的曲线组成的,默认是20个周期内的最高价和最低价来显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市场波动比较大。
如果价格升破上轨时,就是买入信号;反之,如果价格跌破下轨时,就是卖出信号。由于其上轨和下轨是用最高价和最低价计算出来的,所以一般情况下,价格很少同时升破和跌破上下通道线。大多数情况下,价格是沿着上轨或下轨单边运动,或者在上轨和下轨之间运动的。
三、唐奇安通道计算方法
在发明者量化工具中,唐奇安通道的计算方法很简单,直接使用获取指定周期内的最高价或最低价就可以了,如下图所示:第5行就是获取50周期最高价的最大值,第6行就是获取50周期最低价的最小值。
四、唐奇安通道策略逻辑
唐奇安通道的使用方法有很多,可以单独使用,也可以和其他指标结合在一起使用。本节课程我们将采用最简单的使用方法。即:当价格自下而上突破上轨,即突破上方压力线时,我们认为多方力量正在走强,一波上涨行情已经形成,买入开仓信号产生;当价格自上而下跌破下轨,即跌破支撑线时,我们认为空方力量正在走强,一波下跌趋势已经形成,卖出开仓信号产生。
如果买入开仓后,价格又重新跌回到了唐奇安通道中轨,我们认为多方力量正在走弱,或者空方力量正在加强,卖出平仓信号产生;如果卖出开仓后,价格又重新涨回到唐奇安通道中轨,我们认为空方力量正在走弱,或者多方力量正在加强,买入平仓信号产生。
买卖条件
多头开仓:如果无持仓,并且收盘价大于上轨
空头开仓:如果无持仓,并且收盘价小于下轨
多头平仓:如果持多单,并且收盘价小于中轨
空头平仓:如果持空单,并且收盘价大于中轨
策略代码实现
实现策略的第一步是先获取数据,因为数据是组成交易策略的前提部分,想象一下,我们都需要哪些数据呢?以及如何获取这些数据?然后再根据这些数据计算设计交易逻辑;最后就是配合交易逻辑买卖下单交易。具体步骤如下:
第一步:使用交易类库
你可以把交易类库想象成一个功能模块,使用交易类库的好处是,可以让你把精力放到编写策略逻辑上面。举个例子:当我们使用交易类库时,开平仓的时候,直接使用交易类库中的下单API就行了;但如果不使用交易类库,开平仓的时候,需要获取盘口价格、需要考虑报单却不成交的问题、需要考虑撤单的问题等等。
上图就是使用发明者量化工具的CTA策略框架。这是一个固定的代码格式,所有的交易逻辑代码从第4行开始编写。其他地方不用任何修改。
第二步:获取各种数据
仔细想下,都需要哪些数据呢?从我们的策略交易逻辑中发现:首先需要获取当前的持仓状态,然后比较收盘价与布林带指标上中下轨的相互关系,最后判断行情是不是即将收盘。那么接下来让我们一一获取这些数据吧。
获取K线数据
首先就是获取K线数组和当前K线收盘价,因为有了K线数组,才能调用获取N周期最高价或最低价的API。用代码写出来是这样的:
如上图所示:
第4行:获取K线数组,这是一个固定的格式。
第5行:过滤K线的长度,因为我们计算N周期最高价或最低价,用的参数是50,当K线小于50根的时候,是无法计算的。所以这里要过滤下K线的长度,如果K线少于50根,就跳过本次循环,继续等待下一根K线。
第6行:我们用代码“records[len(records) - 1]”先获取到K线数组的最后一个数据,也就是最新的K线数据。这个数据是一个对象,里面包含:开盘价、最高价、最低价、收盘价、成交量、时间等数据,既然它是一个对象,那么我们就直接用“.Close”就是获取最新K线收盘价。
获取持仓数据
持仓信息是量化交易策略中一个很重要的条件,当交易条件成立时,还需要通过持仓状态和持仓数,来判断是否下单。比如:当买入开仓交易条件成立时,如果有持仓,就不必在重复下单了;如果无持仓,就可以下单。这次我们直接把持仓信息封装成一个函数,只需要调用这个函数就可以使用了:
如上图所示:
这是一个获取持仓信息的函数,如果是空仓就返回0;如果持多单就返回1;如果持空单就返回-1。注意看上面的代码:
第2行:创建一个函数,名字是mp,这个函数并没有参数。
第3行:获取持仓数组,这是一个固定的格式。
第4行:判断持仓数组的长度,如果它的长度等于0,那肯定是空仓,所以就返回0
第6行:使用for循环,开始遍历这个数组,接下来的逻辑就已经很简单了,如果持多单,就返回1;如果持空单,就返回-1。
第18行:调用刚才写的获取持仓信息函数mp。
获取最近50根K线的最高价和最低价
在发明者量化工具中,直接使用“TA.Highest”和“TA.Lowest”函数就能直接获取,而不用再自己写逻辑计算了。并且“TA.Highest”和“TA.Lowest”函数返回的结果是具体的数值而不是数组。这一点非常方便,不止如此,官方内置了上百个指标函数。
如上图所示:
第19行:调用TA.Highest”函数,获取50周期最高价的最大值
第20行:调用“TA.Lowest”函数,获取50周期最低价的最小值
第21行:根据50周期最高价的最大值和50周期最低价的最小值,计算出平均值
第三步:下单交易
有了以上数据,就可以编写交易逻辑以及下单交易的代码了。格式也非常简单,最常用到的是“if语句”,用文字可以描述为:如果条件1和条件2成立,下单;如果条件3或条件4成立,下单。
如上图所示:
第22行:使用交易类库,这是一个固定的格式
第23、24行:这是一个平多单的语句,其中用到了我们之前学过的“比较运算符”和“逻辑运算符”,意思是如果当前持多单,并且收盘价小于中轨,就平掉所有仓位。
第25、26行:这是一个平空单的语句,其中用到了我们之前学过的“比较运算符”和“逻辑运算符”,意思是如果当前持空单,并且收盘价大于中轨,就平掉所有仓位。
第27行:判断当前持仓状态,如果持空仓,才进行下一步。
第28、29行:判断收盘价是否大于上轨,如果收盘价升破上轨,就买入开仓。
第30、31行:判断收盘价是否小于下轨,如果收盘价跌破下轨,就卖出开仓。
下节预告:在量化交易策略开发中,站在编程语言执行速度的角度看,如果说哪个语言最快,那只能是C++莫属不可。特别是在衍生品和高频交易领域,C++独特的语言特定,C++在数值计算上有优势,与JavaScript和Python相比速度能提高几个量级,如果将来你想往衍生品和高频交易领域发展,这将是你不容错过的课程。
课后习题:
1、从临摹开始,动手实现本节的策略。
2、试着给本节的策略增加一个均线指标,减低交易频率。
最后给大家一个温馨小提示:在课程和直播页面,点击“订阅”按钮,就可以及时接收提醒,不错过课程和直播的精彩内容!
金十交易学院,8点准时更新