WeQuant交易策略—ATR

ATR(真实波幅均值)策略

策略介绍

ATR(average true range,真实波幅均值),是用来衡量一段时间内价格的真实的平均波动范围,ATR不是一个领先指标,但是它测量最重要的市场参数之一——价格波动。

ATR主要应用于了解股价的震荡幅度和节奏,在窄幅整理行情中用于寻找突破时机。通常情况下股价的波动幅度会保持在一定常态下,但是如果有主力资金进出时,股价波幅往往会加剧。另外,在股价横盘整理、波幅减少到极点时,也往往会产生变盘行情。真实波幅(ATR)正是基于这种原理而设计的指标。

计算方法(以日为单位举例)

ATR的计算比较简单,首先我们要算出当前真实的波幅。这里不单单考虑当前的价格波动,同时也要考虑到前一个时间点收盘价和当前开盘价之间的价格缺口(由于比特币是24小时连续交易,这个缺口一般不明显)。而ATR则是真实波幅一段时间窗口(一般取14天)的简单移动平均。计算公式如下:

(1)     真实波幅(TR):
                TR = MAX(∣最高价-最低价∣,∣最高价-昨收∣,∣昨收-最低价∣)
(2)     真实波幅均值(ATR):
                ATR = TR的N日简单移动平均

使用方法

ATR利用一段时间真实波幅的平均值,来反映一段时间内价格的波动。ATR上升,说明市场环境越发不稳定;ATR下降,说明市场正在趋于稳定。所以,ATR的走势可以帮助我们判断当前市场的波动趋势。

同时,ATR本身的值,也是也可以做为参考,帮助我们制定突破策略。在我们提供的示例代码中,就是使用了ATR作为一个点位突破的指标。若当前价格高于之前收盘价一定倍数的ATR值时,全仓买入;当价格低于之前一定倍数的ATR值时,全仓卖出。这两个倍数的设置的越大,越不容易产生突破的信号。

有些成熟的交易系统,比如海龟交易系统,使用ATR来确定头寸规模,进行头寸管理,很有成效。利用ATR与波动性成正比的关系,来设置交易的止损位。ATR越小,则止损距应该越短;ATR越大,则止损距就相应的拉长。这样,可以防止在大幅震荡的行情中,由于止损距过小而被提前震出场;或是在平稳的行情中,由于止损距过大,而无法应对突然的暴跌。

回测

  • 参数设置如下:

时间段

2016-01-01至2016-10-10
回测频率(context.frequency) 1d
多头ATR倍数 0.2
空头ATR倍数 0.25
回看时间窗口 10(天)

参数中,多头和空头的倍数设置是不对称的。多头更小,所以更容易触发,产生买入信号;而空头相对更大一些,不容易产生卖出的信号。这种设置是在我们看多比特价格时,而采用的“宽进严出”的策略,不要因为一时的下跌而错过大幅的上涨。相反,如果看空,也可以将空头的倍数设置的更小一些,让卖出信号更容易触发,防止大跌造成损失。如果无法判断行情,或者判断行当前为震荡行情,则可以将两个倍数调成相等,空头和多头信号触发难易程度一样,在震荡中抓取每一个小幅波动的收益。

  • 代码如下:
# !/usr/bin/env python
# -*- coding: utf-8 -*-

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

# 策略名称:ATR策略
# 策略详细介绍:https://wequant.io/study/strategy.atr.html
# 关键词:真实波幅、价格突破。
# 方法:
# 1)利用真实波幅来构造上下轨;
# 2)价格突破上轨买入;
# 3)价格突破下轨卖出。

import numpy as np
import talib

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

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

    # 设定ATR的参数
    # ATR算法回看天数
    context.user_data.atr_period = 5
    # 当前价格与之前1天的价格相比较
    context.user_data.pre_period = 1
    # 多头ATR的倍数
    context.user_data.long_multi = 0.2
    # 空头ATR的倍数
    context.user_data.short_multi = 0.3

    # 至此initialize函数定义完毕。

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

    # 使用talib计算ATR
    try:
        # 获取最新的ATR值
        atr = talib.ATR(high, low, close, timeperiod=context.user_data.atr_period)[-1]
    except:
        context.log.error("计算ATR时出现错误...")
        return

    # 获取最新价格
    current_price = context.data.get_current_price(context.security)
    # 获取context.user_data.pre_period个bar前的价格
    prev_price = close[-(context.user_data.pre_period + 1)]
    # 计算上下轨
    upper = prev_price + context.user_data.long_multi * atr
    lower = prev_price - context.user_data.short_multi * atr

    context.log.info("当前价格=%s元, 上轨=%s元, 下轨=%s元" % (current_price, upper, lower))

    # 如果当前价格比之前价格低1个ATR,产生卖出信号
    if current_price < lower:
        context.log.info("价格超过了下轨,产生卖出信号")
        # 若持有仓位,则全仓卖出
        if context.account.huobi_cny_btc >= HUOBI_CNY_BTC_MIN_ORDER_QUANTITY:
            context.log.info("正在卖出 %s" % context.security)
            context.log.info("卖出数量为 %s" % context.account.huobi_cny_btc)
            context.order.sell(context.security, quantity=str(context.account.huobi_cny_btc))
        else:
            context.log.info("仓位不足,无法卖出")
    # 如果当前价格比之前价格高1个ATR,产生买入信号
    elif current_price > upper:
        context.log.info("价格超过了上轨,产生买入信号")
        # 若持有现金,则全仓买入
        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("现金不足,无法下单")
    else:
        context.log.info("无交易信号,进入下一根bar")
  • 回测结果如下:

回测结果比较理想,策略在基准上涨的时候大部分都能够跟上,而在下跌的时候,又能够比较及时的逃出,锁定收益,在6月份的大涨大跌中表现尤为明显。

总结

本策略使用ATR值设置突破信号,达到追涨杀跌的目的。这种策略在牛市、熊市、震荡市中均可以使用,但要注意参数的调整。

时间: 2024-11-03 21:41:22

WeQuant交易策略—ATR的相关文章

WeQuant交易策略—KDJ

KDJ随机指标策略 策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具. 随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日.9周等)内出现过的最高价.最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值.D值与J值,并绘成曲线图来研判股票走势.适合趋势分析.

WeQuant交易策略—NATR

策略名称:NATR策略关键词:规范真实波幅.价格突破. NATR,是对ATR指标进行了标准化.主要应用于了解价格的震荡幅度和节奏,在窄幅整理行情中用于寻找突破时机.本策略在当前价格高于之前价格一定倍数NATR时全仓买入,低于一定倍数NATR时全仓卖出.方法:1)利用规范化的真实波幅来构造上下轨:2)价格突破上轨买入:3)价格突破下轨卖出. 代码 # !/usr/bin/env python # -*- coding: utf-8 -*- # 策略代码总共分为三大部分,1)PARAMS变量 2)i

WeQuant交易策略—简单均线

简单双均线策略(Simple Moving Average) 策略介绍简单双均线策略,通过一短一长(一快一慢)两个回看时间窗口收盘价的简单移动平均绘制两条均线,利用均线的交叉来跟踪价格的趋势.这里说的简单是指在求平均值的时候采用的是算术平均数(就是求和再除以总数),有些更为复杂的求平均值得方法,如加权移动平均,指数加权移动平均等等.我们这个策略只使用最基本的算术平均.移动平均线是股票趋势策略中最常见技术手段. 计算方法(以日频率举例)N日移动平均(MA)的计算:MA(N) = 最近N天的收盘价之

WeQuant交易策略—5日均线

简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 代码 # 简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 # PARAMS用于设定程序参数,回测的起始时间.结束时间.滑点误差.初始资金和持仓. PARAMS = { "start_time": "2017-02-01 00:00:00", # 回测起始时间 "end_time": "2017-08-01 00

WeQuant交易策略—EMA指标

策略名称:EMA指标策略关键词:指数移动平均.双均线.动态止损.方法:1)用快慢两条指数移动平均线的交叉作为买入卖出信号:2)快线自下而上穿过慢线,买入:自上而下穿过慢线,卖出:3)持仓期间计算净值的回撤,当回撤大于预设值时,全仓卖出止损,等待下一次入场信号 # !/usr/bin/env python # -*- coding: utf-8 -*- # 策略代码总共分为三大部分,1)PARAMS变量 2)initialize函数 3)handle_data函数 # 请根据指示阅读.或者直接点击

“1,2,3”买入法——赢面65%的交易策略

此交易策略特征如下:    1."123"图形是指:价格突破近期的趋势线(股海藏经楼趋势跟踪系统:这里的趋势线可以用ATR通道上轨替代),然后回落,当它再次走向与原来趋势相反的方向时,就形成了123图形.    下图代表的是一个买入图形,图中在A点价格突破了前期的明显下降趋势,当价格上升至B点,然后又回落至低点C,并再次开始上升时,即为"123"买入图形.    2.从2到3的回落空间必须至少达到1至2点的0.382倍幅度以上(股海藏经楼趋势跟踪系统:回落到ATR通

智汇神–最专业的交易策略服务提供商fo

智汇神–最专业的交易策略服务提供商 为您提供最完美的智能交易解决方案   智汇神交易策略服务平台是什么?     智汇神交易策略平台是智汇神开发团队历经多年实战经验并结合世界最先进的交易技术和管理理念,最终研发出的一款真正为从事金融衍生品交易的个人及团队提供最全面的交易策略及管理工具的智能化服务平台.     智汇神交易策略平台适用于外汇.期货.指数等多个金融交易产品,无论您是个人投资者.机构投资者还是市场运营商,我们的策略平台都可以为您提供最及时的产品及服务,其中包括:智能交易系统.智能分析系

程序化交易策略开发:第1个策略

学习程序化交易策略开发是一个很简单的事,也就是学习1门简单脚本语言或甚至是一个插件使用那么简单.难的是开发出一个能赚钱的策略,但程序员这么多,也许你能通过程序化交易找到适合你的发展方向呢.下面通过几个简单步骤开发一个交易策略. 1.选择开发平台,国内的有开拓交易者(期货),国外的MiultiCharts(期货),还有MT4(外汇),这里以开拓交易者(简称TB)为例. 2.下载.注册与登录,按提示操作即可 3.进入后关闭默认图表后的界面 4.点击左侧的“超级图表”,默认的投资标的不对,需要更换,图

基于回归幅度的反转交易策略

基于回归幅度的反转交易策略 NO1:前言 河水并不需要计划自己的行进路线,却毫无例外的到达海洋.价格也同样如此,它总是沿着最小阻力线去运动,它总是怎么容易怎么来.如果上升的阻力比下跌的阻力小,价格就会上涨,反之亦然.通常一个大幅度的反转形态,意味着随后会有更大幅度的运动. 无论是上升趋势,还是下降趋势,在每一次重大的趋势运动之后,都将产生一定程度的回撤.回撤与原有价格幅度往往构成一定程度的百分比,就称之为百分比回撤. NO2:策略理论 价格反转是一种能量转换的结果,是一个艰难的过程,需要充分的时