用Python实现价格动量分析的量化交易策略
价格动量交易策略简介
动量交易策略通过一定时期内开盘价、最高价、以及最低价之间的关系,来分析多空力量的对比,间接能了解当前市场多空双方力量的分布情况。分析价格波动,达到追踪价格未来动向的目的。
价格动量分析在传统手工炒单中有大量的运用,特别是对于判定日内单边趋势有很大的帮助,老生常谈的话题,什么是顺势而为,对于顺势最好的量化就是多空双方力量的对比的量化,价格动量分析是最好的指标之一。
本文将采用此策略在火币网上进行一个数字货币现货自动化交易程序的开发。
价格动量的计算公式
AR = [N天所有(High-Open)的和/ N天所有(Open—Low)的和] * 100
这其中:
-
N: 日时间周期的统计窗口,默认一般为30天,因为一个月大概的有效交易日为30天(数字货币24/7交易,可能这个数字还有些保守)
-
High: 单日的最高价
-
Open: 单日的开盘价
-
Low: 单日的最低价
价格动量的使用方法
价格动量在一段时间内,反应了开盘价在最高价和最低价之间的位子,这个位置就是我们判断双方力量拉锯的依据。
- 我们假设这个值为100左右,超过100,则多头力量开始增加,小于100,则空头力量开始聚集。
- AR值升高时表示行情活跃,人气旺盛,多头一路高歌猛进,但是过高则表示价格进入超买区域,应选择时机平仓。AR值的高度没有具体标准,一般情况下,AR值上升至120左右时,价格很有可能会回调下挫。
- AR值下降时表示行情衰退,空头气势正盛,需要多头努力,过低则暗示价格可能已经跌入超卖区域,可考虑伺机做多。一般AR值跌至50以下时,价格随时止跌反涨。
注意:以上数字皆是默认数值,绝非真理定式。在真正交易的过程中,我们要随着行情的变化,调试这个区间以适应当下的行情状态。
用Python实现价格动量的量化交易策略
老规矩,我们打开,FMZ.COM, 登陆账户,点击控制中心,部署托管者和机器人。
关于如何部署托管者和机器人,请参考我之前的文章:https://www.fmz.com/bbs-topic/4140
想购买自己云计算服务器部署托管者的读者,可以参考这篇文章:https://www.fmz.com/bbs-topic/2848
接下来,我们点击左侧栏目当中的策略库,点击新建策略
在编写策略页面右上角记得选择编程语言为Python,如图:
接下来我们把Python代码写入代码编辑页面中,下面的代码,有着非常详细的逐行注释,各位读者可以慢慢理解和体会,更重要的是,虽然本策略是根据现货交易来写的,但是以下代码的扩展性方面也考虑到了期货交易,感兴趣的读者可以尝试把以下代码改写成期货交易,策略本身的逻辑是通用的。在发明者量化平台,我们已经为大家注备好了各大现货和期货交易所的API接口,所以改写工作将会非常的轻松和方便。
我们就用火币网的比特币现货为交易标的,开始实现这个策略把:
import types # 导入Types模块库,这是为了应对代码中将要用到的各种数据类型
def main(): # 主函数,策略逻辑从这里开始
IDLE = 0 # 用来标记持仓状态,可以理解为0即为空闲状态,也就是空仓状态
LONG = 1 # 多头持仓
SHORT = 2 # 空头持仓,注意,此策略应用于现货市场,所以不存在空头开仓或者持仓情况,这里这样写,是为了方便理解策略和以后的扩展(如扩展到期货市场)
state = IDLE # 标记持仓状态的变量
while True: # 进入循环
r = exchange.GetRecords() #GetRecords是发明者量化平台的官方API,详细用法请参见:https://www.fmz.com/api
if len(r) <= 1: # 判断K线是否大于一根,也就是当前是否为开盘状态,否则可能会进入死循环,这里也方便读者进行扩展,大一些的K线周期趋势状态更稳定。
Log("bar的数量不足, 等待下一根bar...") # 输出日志
continue # Python循环控制语句,继续下边的循环内容
# 开始进行价格动量的量化分析
ar = sum(r.High - r.Open) / sum(r.Open - r.Low) * 100 # 计算公式
account = _C(exchange.GetAccount) # 获取账户信息,_C同样为发明者量化平台的官方API,用法请参见:https://www.fmz.com/api
if ar < 95 and (state == IDLE or state == SHORT) : # AR值小于超卖线且账户拥有资金,则全仓买入
if account["Balance"] > 50:
exchange.Buy(-1, account["Balance"] * 0.9) # 市价单全仓买入
state = LONG # 改变持仓状态为LONG
elif ar > 80 and (state == IDLE or state == LONG): # AR值大于超买线且账户有持仓,则全仓卖出
if account["Stocks"] > 0.01:
exchange.Sell(-1, account["Stocks"] * 0.9) # 市价单全仓卖出
state = SHORT # 改变持仓状态为SHORT
LogStatus(_D(), exchange.GetAccount() , state) # 更新日志信息
策略回测
写完策略后,我们首先要做的就是回测它,看它在历史数据中表现如何,但是请各位读者千万注意,回测的结果不等于未来的预判,回测只能作为一种参考信息来考虑我们的策略有效性。一旦市场发生变化,策略开始有大的亏损出现,我们应该及时去发现问题,然后改变策略以适应新的市场环境,比如上文提到的阀值,如果策略出现大于百分之10的亏损,我们就应该马上停止策略运行,然后查找问题,可以先从调节阀值开始入手。
点击策略编辑页面中的模拟回测,在回测页面,参数的调节可以根据需求的不同,进行方便快捷的调试,特别是对于逻辑复杂,参数众多的策略,不用再回去源码,进行逐个修改。
回测时间我们选最近一个月的,点击添加火币现货交易所,BTC交易标的。
查看回测结果
可以看到,此策略在本月的回测中,表现不错。
价格动量策略的优缺点
- 优点方面
相比于一些其他传统技术指标,价格动量的优点是它使用的不是单一开盘价或收盘价,而是引入了最高价和最低价。对它们进行了动态的比较,通过价格日内的波动,使得市场信息更全面,反应更迅速,也更加宏观。
- 缺点方面
独立使用价格动量值来判断价格是否过高或低,来判断做多/做空,很有可能会在一波大趋势中过早下车,或者在一波大跌市中过早抄底。总体来讲,此策略仍然属于一种震荡有效性策略。
策略的阈值设定也需要根据交易标的的特性来决定。数字货币市场价格起伏都比较大,交易量巨大,特别是主流币种如比特币上,又没有涨跌幅限制,所以阀值比传统股票市场要高,80超卖线,通常很难触碰到,产生买入信号较少;而170的超买线又经常处于阀值之下,卖出信号却被频繁触发。这会造成策略运行时大部分时间处于空仓状态,资金利用率变得很低。如今年一月份以来,比特币一波大牛市行情中,价格从3500最高涨到了接近13000。阀值在很早就穿越了170线,之后一直处于高位。如果我们按照传统的170超买线卖出,大概在价格5000的时候就下了车,之后一直没有开仓信号,一波大牛市只赚了很少部分。
因此,这市场从来没有什么圣杯交易策略,可以不用回测,不用调试,就永远赚钱的策略。我们量化交易者和主观交易者一样,最终都是殊途同归,需要根据市场的变化,因地制宜,以万变应万变,遇到策略无效的时候,需要及时调整。
有问题的朋友可以到 https://www.fmz.com/bbs 留言,无论是关于策略还是平台的技术,发明者量化平台有专业的人员随时为您解答。