不想错过精彩课程?一键“订阅”,轻松学习!
大家好,欢迎来到金十交易学院《智能量化交易》课程。
摘要:在上一篇中,我们从C++语言的简介、基础语法、策略架构等方面为大家讲解实现交易策略的前提部分,本篇我们将继续上篇内容,直接从一个策略入手,帮助大家一步一步实现一个可行的量化交易策略。
一、策略简介
技术分析中最常用的三大指标之一KDJ,相信那些交易老手已经不陌生了。KDJ的全名叫“随机指标”,它是一种新颖,并且很实用的技术分析指标,最早起先用于期货市场,后被广泛用于股票和外汇的中短期趋势分析,也是金融交易市场上最常用的技术分析工具。
KDJ是通过统计学原理,通过9根K线内出现过的最高价、最低价、最新的收盘价三者之间的比例关系,来计算随机值(RSV),然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判价格走势。
由于融合了动量观念、强弱指标和移动平均线的一些优点,来度量股价脱离价格正常范围的变异程度。因此,能够比较迅速、快捷、直观地研判行情。当K值大于D值时,表明股价当前正处于上升趋势之中,因此,当K线从下向上交叉突破D线时,正是买进股票的时机。反之,当K值小于D值时,表明股市当前处于下降趋势。因此,当K线从上向下交叉突破D线时,正是卖出股票的时机。
二、KDJ指标计算方法
KDJ指标的计算比较复杂,首先计算出随机值(RSV),然后再计算K值、D值和J值。其计算方法如下:
l RSV = (收盘价-N周期最低价)/(N周期最高价-N周期最低价)*100
l K值 = RSV的N周期平均值
l D值 = K值的N周期平均值
l J值 = 3*K值-2*D值
三、策略逻辑
KDJ的使用方法有很多,可以单独使用,也可以和其他指标结合在一起使用。 本节教程我们将用最简单的使用方法,来抛砖引玉。即:如果K值大于D值,我们认为多方力量正在走强,一波上涨行情已经形成,买入开仓信号产生;如果K值小于D值,我们认为空方力量正在走强,一波下跌趋势已经形成,卖出开仓信号产生。
如果买入开仓后,D值由向上转为向下,我们认为多方力量正在走弱,或者空方力量正在加强,卖出平仓信号产生;如果卖出开仓后,D值由向下转为向上,我们认为空方力量正在走弱,或者多方力量正在加强,买入平仓信号产生。
四、买卖条件
多头开仓:如果无持仓,并且K值大于D值
空头开仓:如果无持仓,并且K值小于D值
多头平仓:如果持多单,并且D值小于上根K线的D值
空头平仓:如果持空单,并且D值大于上根K线的D值
五、策略代码实现
用代码实现策略的第一步,就是先考虑我们需要什么数据?通过什么API去获取?然后获取数据后,如何计算交易逻辑?最后通过哪些下单方式去交易?接下来,让我们一步一步来实现吧:
第一步:使用策略架构和交易类库
所谓的策略架构就是设计整个策略的方式,如下图所示,该架构由2个函数构成:一个是main主函数,程序是从主函数开始执行代码,它的功能是处理策略逻辑核心之外的事情,比如:判断与交易所连接是否正常、过滤一些不必要的日志信息、控制执行策略逻辑核心执行的时间间隔等等;另一个是onTick函数,在这个函数里面,主要编写策略逻辑,包括:获取原始数据、计算数据、下单买卖等等。
上图就是使用发明者量化工具的C++策略架构。这是一个固定的代码格式,所有的交易逻辑代码从第2行开始编写,其他地方不用任何修改。当然如果你是老手,可以添加或修改你需要的功能。
C++交易类库是由发明者量化官方推出的一套标准下单方式,使用交易类库可以不必考虑开发量化交易策略的琐碎问题,直接把精力放在编程交易逻辑上。比如,如果不使用交易类库的话,在下单的时候,需要考虑换月移仓、下单买卖价格、下单不成交时撤单或追单等等问题......
第二步:获取各种数据
各种原始数据是组成交易逻辑的重要部分,仔细想下,都需要哪些数据呢?从我们的策略交易逻辑中发现:首先需要获取K线数据,有了原始的K线数据,就可以计算出KDJ指标了,最后比较K值与D值的相互关系,判断是否下单。那么接下来让我们一一获取这些数据吧。
获取K线数据
首先就是获取K线数组,因为有了K线数组,才能计算出KDJ指标。用代码写出来是这样的:
如上图所示我们每一行代码做系统的讲解,初学者可以跟着我们的案例自己编写并理解:
第1行:定义了一个变量,这个变量是接收持仓状态用的。
第3~12行:定义了一个onTick函数,并且这个函数带了一个参数,参数的作用就是传入合约代码。
第14~24行:定义一个main函数,这个函数主要处理非策略逻辑,唯一可以更改的就是第20行的合约代码“rb000”,其他地方不需要修改,因为这是一个固定的格式。
我们重点看下onTick函数,看它是怎么获取K线数据的:
第4~7行:设置合约代码,并判断如果设置不成功,就返回false。
第8行:获取K线数组,这是一个固定的格式。
第9~11行:过滤K线的长度,因为我们计算KDJ指标用的参数是9,当K线小于10根的时候,是无法计算KDJ指标的。
所以这里要过滤下K线的长度,如果K线少于10根,就直接返回false,继续等待下一根K线。
获取KDJ指标以及K值和D值
接着就需要计算KDJ指标的K值和D值了。那就要先获取KDJ指标数组,在从数组中获取K值和D值。在发明者量化工具中,获取KDJ数组还很简单,直接调用KDJ的API就可以了,难的是获取K值和D值,因为KDJ数组是一个二维数组。
二维数组其实很好理解,它就是数组中的数组,那么获取的顺序就是:先获取数组中指定的数组,然后在从指定的数组中获取指定的元素,如下图所示:
如下图,第12行直接使用发明者量化工具的API,获取KDJ指标数组,这是一个二维数组:arr = [[K值, K值, K值...], [D值, D值, D值...], [J值, J值, J值...]]。
第13行是获取上根K线的K值,K值当然就是arr[0],然后在从arr[0]中获取倒数第2个元素,arr[0].size()可以获取arr[0]这个数组的长度,arr[0].size() - 2就是这个数组的倒数第2个元素,写在一起就是:auto k = arr[0][arr[0].size() - 2];第14、15行以此类推。
第三步:下单交易
有了以上数据,就可以编写交易逻辑以及下单交易的代码了。格式也非常简单,最常用到的是“if语句”,用文字可以描述为:如果条件1和条件2成立,下单;如果条件3或条件4成立,下单。如下图所示:
上图中,第19行~28行就是交易逻辑以及下单交易的代码。不过在这之前,需要先在第16行定义一个字符串变量“action”,它的作用是辅助判断下单动作用的。
第19~21行的语句块是:如果上根K线的D值小于上上根K线的D值,并且持有多单,就全部平仓。或者如果上根K线的D值大于上上根K线的D值,并且持有空单,就全部平仓。并把变量“action”设置为“cover”。
第21~25行的语句块分别是:开多单和开空单的条件,当条件为true的时候,就把“action”设置为“buy”或者“sell”。
第26~28行的语句块就是执行下单啦,首先会根据字符串变量“action”的长度,来判断是否有下单的指令,如果有就进入到第27行,然后调用发明者量化工具C++的交易类库,执行下单。
有两个地方需要注意:
1、尽量(但不是必须)把策略逻辑写成当根K线条件成立,下根K线发单,或者上根K线条件成立,当根K线发单,这样回测的结果与实盘的结果相差不大。不这样写也可以,但是要注意策略逻辑是否正确。
2、一般而言,把平仓的逻辑写在开仓逻辑的前面,这样做的目的是,尽量让策略逻辑符合你的预期。比如:如果策略逻辑刚好赶上反手的时候,反手的规则是,先平仓再开新仓。而不是先开新仓,再平仓。如果我们直接把平仓逻辑写到开仓逻辑前面,就不会出现这种问题。
下节预告:至此,本系列课程中的策略编写教程已经完结,相信如果你是跟着教程一步一步走过来的,一定会有很大的收货。不管怎么说,从量化交易基础课程这个角度讲,万里长征已经走了一大半。在最后一个章节中,我将会教大家如何使用发明者量化交易工具的回测功能,以及如何避免回测中的坑,为实盘交易做好最后的准备。虽然是一小部分内容,但却是你进入量化世界大门的一大步!
课后习题
1、试着用发明者量化工具中的C++语言实现KDJ指标算法。
2、试着用本节的知识,举一反三,动手实现一个CCI指标策略。
最后给大家一个温馨小提示:在课程和直播页面,点击“订阅”按钮,就可以及时接收提醒,不错过课程和直播的精彩内容!
金十交易学院,8点准时更新