首发于wequant

AR(人气指标)策略在比特币市场中的应用

首先预祝各位朋友2017新年新气象,越活越精彩!再插段小广告:请加入WeQuant量化交流QQ群 519538535,群主会不定时发放交易策略和实盘引擎的源码,带你一起飞~~ 以下是正文:

AR(人气指标)策略简介

人气指标通过一定时期内开盘价、最高价、以及最低价之间的关系,来分析多空力量的对比,反映市场买卖人气,分析价格波动,达到追踪价格未来动向的目的。


计算公式(以日为单位举例)


AR = [N天所有(High-Open)的和/ N天所有(Open—Low)的和] * 100
  • 解释:

N: 回看的时间窗口,一般设为26天

High: 每天的最高价

Open: 每天的开盘价

Low: 每天的最低价


使用方法

简单来说,AR指标反映了一段时间内,开盘价在最高价和最低价之间的位置。

(1) 若AR值为100左右,说明这段时间内开盘价大体处在最高价和最低价中间,价格走势比较平稳,没有出现剧烈波动。一般我们定义这个区间为80-120。

(2) AR值走高时表示行情活跃,人气旺盛,过高则表示价格进入高价区域,应选择时机退出,AR值的高度没有具体标准,一般情况下,AR值上升至150以上时,价格很有可能会回档下跌。

(3) AR值走低时表示人气衰退,需要充实,过低则暗示价格可能已经跌入过低区域,可考虑伺机买入。一般AR值跌至70以下时,价格有可能随时反弹上升。

由上图可以看出,AR指标帮助我们比较准确的抄到了一个低点,并在一个较高的位置及时抛出,锁定收益,避免了未来下跌的风险。

除了从数值上考虑,AR指标也可以从走势上给我们提供信息。AR指标有时也有领先价格到达峰顶和谷底的功能。当AR到达顶峰并回头时,如果价格还在上涨,就应考虑卖出,获利了结;如果AR到达低谷后回头向上时,而价格还在继续下跌,就应考虑逢低买入。

在股市中,还有BR(意愿)指标,与AR类似,只不过用的不是开盘价而是前一个收盘价。BR与AR指标一起使用,更加有效。但是由于比特币市场是24小时连续交易,昨日收盘价与今日开盘价是连续的,几乎没有缺口,所以AR与BR只需要考虑一个。


优点

相比于一些其他指标,AR指标比较明显的优点是它用的不是单单一个开盘价或收盘价,而是引入了最高价和最低价,即考虑到了日内的波动,使得信息更全面,更加可信。


缺点

单独使用AR值来判断价格是否过高/过低,来判断卖出/买入,很有可能会在一波大牛市中过早下车,或者在一波大熊市中过早入坑。

AR的阈值设定也需要根据标的的特性来设定。比特币市场比较火热,人气很旺,又没有涨跌幅限制,所以AR值比传统股票市场要高。70超卖线,很难触碰到,有时会很少产生买入信号;而150的超买线又经常处于AR值之下,卖出信号频繁发出。这会造成投资者大部分时间处于空仓状态,资金利用率很低。如线图中,比特币一波大行情中,价格从2900点最高涨到了接近5200点。AR值在很早就穿越了150线,之后一直处于高位。如果我们按照传统的150超买线卖出,大概在3300点的时候就下了车,之后一直没有入场信号,一波大牛市只赚了个零头。

所以,AR指标的超买超卖线的设定,还要根据行情的不同而做出调整,不能无脑的使用传统的默认值。


策略源码

# !/usr/bin/env python
# -*- coding: utf-8 -*-

# 策略代码总共分为三大部分,1)PARAMS变量 2)initialize函数 3)handle_data函数
# 请根据指示阅读。或者直接点击运行回测按钮,进行测试,查看策略效果。

# 策略名称:AR指标策略
# 关键词:价格波动、超买超卖。
# 方法:
# 1)利用一段时间内开盘价在最高价和最低价中所处的位置构建AR人气指标
# 2)当人气指标过高(人气过热)时卖出,过低(人气过冷)时买入

import numpy as np


# 阅读1,首次阅读可跳过:
# PARAMS用于设定程序参数,回测的起始时间、结束时间、滑点误差、初始资金和持仓。
# 可以仿照格式修改,基本都能运行。如果想了解详情请参考新手学堂的API文档。
PARAMS = {
    "start_time": "2016-01-01 00:00:00",
    "end_time": "2016-10-01 00:00:00",
    "slippage": 0.00001,
    "account_initial": {"huobi_cny_cash": 100000,
                      "huobi_cny_btc": 0},
}


# 阅读2,遇到不明白的变量可以跳过,需要的时候回来查阅:
# initialize函数是两大核心函数之一(另一个是handle_data),用于初始化策略变量。
# 策略变量包含:必填变量,以及非必填(用户自己方便使用)的变量
def initialize(context):
    # 设置回测频率, 可选:"1m", "5m", "15m", "30m", "60m", "1d", "1w"
    context.frequency = "1d"
    # 设置回测基准, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc"
    context.benchmark = "huobi_cny_btc"
    # 设置回测标的, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc"
    context.security = "huobi_cny_btc"

    # 设定回看时间窗口为26天
    context.user_data.period = 26
    # 设定AR的超卖线,低于它则买入
    context.user_data.over_sell = 70
    # 设定AR的超买线,高于它则卖出
    context.user_data.over_buy = 150


# 阅读3,策略核心逻辑:
# handle_data函数定义了策略的执行逻辑,按照frequency生成的bar依次读取并执行策略逻辑,直至程序结束。
# handle_data和bar的详细说明,请参考新手学堂的解释文档。
def handle_data(context):
    # 获取回看时间窗口内的历史数据
    hist = context.data.get_price(context.security, count=context.user_data.period, frequency=context.frequency)
    if len(hist.index) < context.user_data.period:
        context.log.warn("bar的数量不足, 等待下一根bar...")
        return
    # 开盘价
    open_prices = np.array(hist["open"])
    # 最高价
    high_prices = np.array(hist["high"])
    # 最低价
    low_prices = np.array(hist["low"])
    # 计算AR值
    ar = sum(high_prices - open_prices) / sum(open_prices - low_prices) * 100

    context.log.info("当前AR值为: %s" % ar)

    # AR值小于超卖线且拥有资金,则全仓买入
    if ar < context.user_data.over_sell:
        context.log.info("AR超过了超卖线,产生买入信号")
        if context.account.huobi_cny_cash >= HUOBI_CNY_BTC_MIN_ORDER_CASH_AMOUNT:
            # 市价单全仓买入
            context.log.info("正在买入 %s" % context.security)
            context.log.info("下单金额为 %s 元" % context.account.huobi_cny_cash)
            context.order.buy(context.security, cash_amount=str(context.account.huobi_cny_cash))
        else:
            context.log.info("现金不足,无法下单")
    # AR值大于超买线且有持仓,则全仓卖出
    elif ar > context.user_data.over_buy:
        context.log.info("AR超过了超买线,产生卖出信号")
        if getattr(context.account, context.security) >= HUOBI_CNY_BTC_MIN_ORDER_QUANTITY:
            # 市价单全仓卖出
            context.log.info("正在卖出 %s" % context.security)
            context.log.info("卖出数量为 %s" % getattr(context.account, context.security))
            context.order.sell(context.security, quantity=str(getattr(context.account, context.security)))
        else:
            context.log.info("仓位不足,无法卖出")
    else:
        context.log.info("无交易信号,进入下一根bar")


回测

  • 回测参数如下:

这里使用了AR指标的默认值,26天的回看窗口以及70/150的超卖超买线。

  • 回测结果如下:



AR策略在这9个月区间内,大部分时间相对于基准都有超额收益,而且最大回撤只有13.77%, 明显好于基准,相对于基准更加的稳定。但是同时,我们也可以看到,在6月和7月这一段时间,一直处于空仓,错过了6月份的大幅上涨。作为一个摆动指标,在这种大涨大跌的时候失效也是可以预料的。而在16年上半年的震荡行情中,策略明显跑赢基准,表现出了AR指标应有的功效,帮助我们高抛低吸,在波动中获利。

回测中,我们设置的超买超卖线是从股票市场中照搬过来的,并没有结合比特币市场自己的特性。比特币市场相对于股票市场来说,投资者更加的不成熟。而且由于比特币没有涨跌停的限制,所以AR值的波动范围会很大。所以要根据比特币市场自己AR值的变动来做出调整。比如,引入AR值的移动平均来作为参考,构建上下轨,作为超买和超卖线。


总结

AR指标是一个摆动指标,能够帮助我们在市场过热的时候逃顶,在过冷的时候抄底,在波动震荡的行情中十分有效,但在单边行情中表现不佳。对于超买超卖线的设置要更为灵活,根据市场的变动及时作出调整。

编辑于 2017-08-22

文章被以下专栏收录