您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

用Python构建阿隆策略

时间:2019-12-13 11:10:55  来源:  作者:

用Python构建阿隆策略

 

摘要

在技术分析中阿隆(Aroon)是一个很独特的技术指标,“Aroon”一词来自梵文,寓意为“黎明曙光”。它不像MA、macD、KDJ那样广为人所熟悉,它推出的时间更晚,直到1995年才被图莎尔·钱德(Tushar Chande)发明出来,作者还发明了钱德动量摆动指标(CMO)和日内动量指数(IMI)。如果说一个技术指标知道的人越多,使用的人也越多,那么其赚钱能力也越低,那么相对新颖的阿隆指标则恰恰相反,站在这个角度看这是一个不错的选择。

阿隆指标简介

阿隆指标通过计算当前K线距离前最高价和最低价之间的K线数量,来帮助交易者预测价格走势与趋势区域的相对位置关系变化。它有两部分组成,即:阿隆上线(AroonUp)和阿隆下线(AroonDown),这两条线在0~100之间上下移动,虽然命名为上线和下线,但从图表上看并不像BOLL指标那样是真正意义上的上线和下线。如下图就是阿隆指标:

用Python构建阿隆策略

 

阿隆指标的计算方法

阿隆指标要求首先要设置一个时间周期参数,就像设置均线周期参数一样,在传统行情软件中,这个周期数是14,当然这个周期参数并不是固定的,你还可以设置为10或者50等等。为了方便理解,暂且把这个时间周期参数定义为:N。确定N之后,我们就可以计算出阿隆上线(AroonUp)和阿隆下线(AroonDown),具体的计算公式如下:

  • 阿隆上线= [ ( 设置的周期参数 - 最高价后的周期数 ) / 计算的周期数 ] * 100
  • 阿隆下线= [ ( 设置的周期参数 - 最低价后的周期数 ) / 计算的周期数 ] * 100

从这个公式中,我们就能大致看出,阿隆指标的思想。那就是:有多少个周期,价格在近期高 / 低点之下,辅助预测当前趋势是否会延续,同时衡量当前趋势的强弱。如果我们把这个指标归类的话,很明显它是属于趋势跟踪类型。但是与其他趋势跟踪型指标不同的是,它更重视时间而不是价格。

如何使用阿隆指标

阿隆上线(AroonUp)和阿隆下线(AroonDown)反映的是当前时间与之前最高价或最低价的远近,如果时间越近值就越大,如果时间越远值就越小。并且当两条线发生交叉就预示着价格方向可能会发生改变,如果AroonUp在AroonDown之上说明价格处于上涨趋势,未来价格可能会进一步上涨;如果AroonDown在AroonUp之上说明价格处于下跌趋势,未来价格可能会进一步下跌。

同时我们还可以设置几个固定的值,来精确入场时机。我们知道阿隆指标是一直在0~100之间上下运行,那么在市场处于上涨趋势,也就是AroonUp在AroonDown之上时,当AroonUp大于50,说明市场上涨的趋势已经形成,未来价格可能会继续上涨;当AroonUp下穿50时,说明价格上涨的动力正在减弱,未来价格可能会震荡和下跌。

反之在市场处于下跌趋势,也就是AroonDown在AroonUp之上时,当AroonDown大于50,说明市场下跌趋势已经形成,未来价格可能会继续下跌;当AroonDown下穿50时,说明价格下跌的动力正在减弱,未来价格可能会震荡和上涨。那么根据上面两段理论,我们可以把买卖条件罗列为:

  • 当 AroonUp大于AroonDown,并且AroonUp大于50,多头开仓;
  • 当 AroonUp小于AroonDown,或者AroonUp小于50,多头平仓;
  • 当 AroonDown大于AroonUp,并且AroonDown大于50,空头开仓;
  • 当 AroonDown小于AroonUp,或者AroonDown小于50,空头平仓;

基于阿隆指标构建交易策略

理清交易逻辑后,我们就可以用代码去实现了,依次打开:fmz.com > 登录 > 控制中心 > 策略库 > 新建策略 > 点击右上角下拉菜单选择Python语言,开始编写策略,注意看下面代码中的注释。

第一步:编写策略框架
我们知道在量化交易中,程序是不断获取数据、处理数据、下单交易这样的循环过程,所以我们继续使用之前讲过的main函数和onTick函数,其中在main函数中无限循环执行onTick函数。如下:

# 策略主函数
def onTick():
 pass


# 程序入口
def main():
 while True: # 进入无限循环模式
 onTick() # 执行策略主函数
 Sleep(1000) # 休眠1秒

第二步:导入库
另外,在计算AROON时,需要用到talib库,我们直接用import一行代码导入。因为在使用talib计算时,必须先把数据处理成numpy.array类型,所以也到导入numpy库。

import talib
import numpy as np

第三步:定义虚拟持仓变量
量化交易中判断持仓分为两种,一种是真实的账户持仓,另一种就是虚拟持仓,还有一种是真实持仓和虚拟持仓联合判断。实盘时我们只使用真实持仓就足够了,但这里为了简化策略,作为演示使用虚拟持仓。

mp = 0 # 用于控制虚拟持仓

使用虚拟持仓的原理很简单,策略运行之初默认是空仓mp=0,当开多单后把虚拟持仓重置为mp=1,当开空单后把虚拟持仓重置为,mp=-1,当平多单或空单后把虚拟持仓重置为mp=0。这样我们在判断构建逻辑获取仓位时,只需要判断mp的值就可以了。

第四步:计算阿隆指标
计算阿隆指标,首先要获取基础数据,但前提是先要订阅数据,也就是订阅具体的合约代码,你可以订阅指数或者主力连续,甚至还可以订阅具体交割月份的合约代码。然后是获取K线数组,K线数组是一个包含开高低收、成交量和时间的序列数据,同时也是计算大部分指标的基础数据。

在获取K线数组之后,紧接着就需要判断一下K线数组的长度,因为如果K线数组太短,不足以计算指标时就会出现异常。所以我们在这里使用if语句,判断如果K线数组小于指标参数时,就直接返回。

在使用talib计算指标时,它所传入的参数是numpy.array类型数据,所以还要把K线数组中的必要数据提取出来,并转换成numpy.array类型数据。这里我们自定义一个get_data函数,先别必要的数据提取出来。

# 把K线数组转换成最高价和最低价数组,用于转换为numpy.array类型数据
def get_data(bars):
 arr = [[], []]
 for i in bars:
 arr[0].Append(i['High'])
 arr[1].append(i['Low'])
 return arr
 
 
exchange.SetContractType("ZC000") # 订阅期货品种
bars = exchange.GetRecords() # 获取K线数组
if len(bars) < cycle_length + 1: # 如果K线数组的长度太小,所以直接返回
 return
np_arr = np.array(get_data(bars)) # 把列表转换为numpy.array类型数据,用于计算AROON的值
aroon = talib.AROON(np_arr[0], np_arr[1], 20); # 计算阿隆指标
aroon_up = aroon[1][len(aroon[1]) - 2]; # 阿隆指标上线倒数第2根数据
aroon_down = aroon[0][len(aroon[0]) - 2]; # 阿隆指标下线倒数第2根数据

talib在计算阿隆指标时,需要三个参数,依次是:最高价numpy.array类型数据、最低价numpy.array类型数据、时间周期。所以我们在自定义get_data函数中只需要把K线数组中的最高价和最低价提取出来就可以了,并把它们都转换成numpy.array类型数据。

紧接着,就可以计算阿隆指标了,直接调用talib.AROON方法并传入参数。计算后的阿隆指标是一个二维数组,所以我们分别把阿隆指标上线和下线分别提取出来,以便于判断开平仓逻辑。

第五步:下单交易
在下单交易之前,我们要先获取当前最新价格,因为在下单时需要在函数中传入下单价格。还需要引入全局变量mp,主要用于控制虚拟仓位。

close0 = bars[len(bars) - 1].Close; # 获取当根K线收盘价
global mp # 全局变量,用于控制虚拟仓位
if mp == 0 and aroon_up > aroon_down and aroon_up > 50: # 如果当前空仓,并且阿隆上线大于下线,并且阿隆上线大于50
 exchange.SetDirection("buy") # 设置交易方向和类型
 exchange.Buy(close0, 1) # 开多单
 mp = 1 # 设置虚拟持仓的值,即有多单
 
if mp == 0 and aroon_down > aroon_up and aroon_down > 50: # 如果当前空仓,并且阿隆下线大于上线,并且阿隆下线小于50
 exchange.SetDirection("sell") # 设置交易方向和类型
 exchange.Sell(close0 - 1, 1) # 开空单
 mp = -1 # 设置虚拟持仓的值,即有空单
 
if mp > 0 and (aroon_up < aroon_down or aroon_up < 50): # 如果当前持有多单,并且阿隆上线小于下线或者阿隆上线小于50
 exchange.SetDirection("closebuy") # 设置交易方向和类型
 exchange.Sell(close0 - 1, 1) # 平多单
 mp = 0 # 设置虚拟持仓的值,即空仓
 
if mp < 0 and (aroon_down < aroon_up or aroon_down < 50): # 如果当前持有空单,并且阿隆下线小于上线或者阿隆下线小于50
 exchange.SetDirection("closesell") # 设置交易方向和类型
 exchange.Buy(close0, 1) # 平空单
 mp = 0 # 设置虚拟持仓的值,即空仓

万事俱备之后,就可以判断策略逻辑并开平仓下单交易了。在判断策略逻辑时肯定是使用if语句,先判断mp的持仓状态,然后再判断阿隆上线和下线的相互位置关系。需要注意的是在期货交易下单之前,先指定交易的方向类型,即:开多、开空、平多、平空。调用exchange.SetDirection()函数,分别传入:“buy”、“sell”、“closebuy”、“closesell”。最后下单之后重置持仓状态mp的值。

完整策略

'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-29 00:00:00
period: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


import talib
import numpy as np


# 外部参数
# cycle_length = 100


# 定义全局变量
mp = 0 # 用于控制虚拟持仓


# 把K线数组转换成最高价和最低价数组,用于转换为numpy.array类型数据
def get_data(bars):
 arr = [[], []]
 for i in bars:
 arr[0].append(i['High'])
 arr[1].append(i['Low'])
 return arr


# 策略主函数
def onTick():
 exchange.SetContractType("ZC000") # 订阅期货品种
 bars = exchange.GetRecords() # 获取K线数组
 if len(bars) < cycle_length + 1: # 如果K线数组的长度太小,所以直接返回
 return
 np_arr = np.array(get_data(bars)) # 把列表转换为numpy.array类型数据,用于计算AROON的值
 aroon = talib.AROON(np_arr[0], np_arr[1], 20); # 计算阿隆指标
 aroon_up = aroon[1][len(aroon[1]) - 2]; # 阿隆指标上线倒数第2根数据
 aroon_down = aroon[0][len(aroon[0]) - 2]; # 阿隆指标下线倒数第2根数据
 close0 = bars[len(bars) - 1].Close; # 获取当根K线收盘价
 global mp # 全局变量,用于控制虚拟仓位
 if mp == 0 and aroon_up > aroon_down and aroon_up > 50: # 如果当前空仓,并且阿隆上线大于下线,并且阿隆上线大于50
 exchange.SetDirection("buy") # 设置交易方向和类型
 exchange.Buy(close0, 1) # 开多单
 mp = 1 # 设置虚拟持仓的值,即有多单
 
 if mp == 0 and aroon_down > aroon_up and aroon_down > 50: # 如果当前空仓,并且阿隆下线大于上线,并且阿隆下线小于50
 exchange.SetDirection("sell") # 设置交易方向和类型
 exchange.Sell(close0 - 1, 1) # 开空单
 mp = -1 # 设置虚拟持仓的值,即有空单
 
 if mp > 0 and (aroon_up < aroon_down or aroon_up < 50): # 如果当前持有多单,并且阿隆上线小于下线或者阿隆上线小于50
 exchange.SetDirection("closebuy") # 设置交易方向和类型
 exchange.Sell(close0 - 1, 1) # 平多单
 mp = 0 # 设置虚拟持仓的值,即空仓
 
 if mp < 0 and (aroon_down < aroon_up or aroon_down < 50): # 如果当前持有空单,并且阿隆下线小于上线或者阿隆下线小于50
 exchange.SetDirection("closesell") # 设置交易方向和类型
 exchange.Buy(close0, 1) # 平空单
 mp = 0 # 设置虚拟持仓的值,即空仓
 

# 程序入口
def main():
 while True: # 进入无限循环模式
 onTick() # 执行策略主函数
 Sleep(1000) # 休眠1秒

完整策略源代码已经公开,可以直接 https://www.fmz.com/strategy/173417 复制,无需配置直接在线回测。

阿隆指标的优缺点

优点:阿隆指标可以判断趋势行情的状态,兼顾发现市场趋势行情以及判断价格转向的能力,帮助交易者提高资金的使用率,这个优势震荡行情中尤为重要。

缺点:阿隆指标只是趋势跟踪系列指标中的一种,同样也有趋势跟踪指标的缺点。并且它只判断指定时间最高价或最低价的周期数,但有时候最高价或最低价在整个行情走势中会有偶然性,这个偶然性会干扰阿隆指标本身,造成虚假信号。

总结

在策略中我们固定了一部分参数,如:aroonUp或aroonDown大于小于50,造成策略的滞后性,很多情况下是行情上涨或下跌一段时间才开平仓买卖。这样虽然提高了胜率,减少了最大回撤率,但也错过了很多收益,这也印证了盈亏同源的道理。有兴趣的朋友可以深入研究一下,并加以改进。



Tags:阿隆策略   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
摘要在技术分析中阿隆(Aroon)是一个很独特的技术指标,“Aroon”一词来自梵文,寓意为“黎明曙光”。它不像MA、MACD、KDJ那样广为人所熟悉,它推出的时间更晚,直到1995年才被图莎...【详细内容】
2019-12-13  Tags: 阿隆策略  点击:(71)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题! 从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的...【详细内容】
2021-12-28  菜鸟学python    Tags:Python4   点击:(1)  评论:(0)  加入收藏
学习Python的初衷是因为它的实践的便捷性,几乎计算机上能完成的各种操作都能在Python上找到解决途径。平时工作需要在线学习。而在线学习的复杂性经常让人抓狂。费时费力且效...【详细内容】
2021-12-28  风度翩翩的Python    Tags:Python   点击:(1)  评论:(0)  加入收藏
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(2)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(9)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(6)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(8)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条