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值设置突破信号,达到追涨杀跌的目的。这种策略在牛市、熊市、震荡市中均可以使用,但要注意参数的调整。
WeQuant交易策略—ATR的更多相关文章
- WeQuant交易策略—网格交易
网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...
- WeQuant交易策略—NATR
策略名称:NATR策略关键词:规范真实波幅.价格突破. NATR,是对ATR指标进行了标准化.主要应用于了解价格的震荡幅度和节奏,在窄幅整理行情中用于寻找突破时机.本策略在当前价格高于之前价格一定倍数 ...
- WeQuant交易策略—Dual Thrust
Dual Thrust策略 策略介绍 Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一. Dual ...
- WeQuant交易策略—RSI
RSI指标策略 策略介绍 RSI(相对强弱指标),是通过一段时期内的平均收盘上涨和下跌数,计算价格上涨所产生的波动占整个波动的百分比,来分析市场买卖盘的意向和实力. 计算公式(以日为单位举例) RSI ...
- WeQuant交易策略—BOLL
BOLL(布林线指标)策略 简介 BOLL(布林线)指标是技术分析的常用工具之一,由美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标.一般而言,价格的运动总是围 ...
- WeQuant交易策略—KDJ
KDJ随机指标策略策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具.随机指标KDJ ...
- WeQuant交易策略—MACD
MACD(指数平滑异同平均线)策略简介MACD指标应该是大家最常见的技术指标,在很多股票.比特币的软件中都是默认显示的.MACD是从双指数移动平均线发展而来的.意义和双移动平均线基本相同,即由快.慢均 ...
- WeQuant交易策略—简单均线
简单双均线策略(Simple Moving Average) 策略介绍简单双均线策略,通过一短一长(一快一慢)两个回看时间窗口收盘价的简单移动平均绘制两条均线,利用均线的交叉来跟踪价格的趋势.这里说的 ...
- WeQuant交易策略—EMV
EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一 ...
随机推荐
- java用户界面窗口
java用户界面窗口 窗口框 代码如下: package Day08; import java.awt.Color;import java.awt.FlowLayout;import java.awt ...
- co 模块
1.co 模块,它基于 ES6 的 generator 和 yield ,让我们能用同步的形式编写异步代码. 2.co 模块是能让我们以同步的形式编写异步代码的 nodejs 模块 3.学习网络地址: ...
- 【JAVASCRIPT】ECMAScrip (转)
部分ECMAScript术语 ECMAScript Sun(现在的Oracle)公司持有着"Java"和"JavaScript"的商标.这就让微软不得不把自己的 ...
- JS浏览器对象:window对象、History、Location对象、Screen对象
一.JS浏览器对象-window 1.window对象 window对象是BOM的核心,window对象指当前的浏览器窗口 所有JavaScript全局对象.函数以及变量均自动成为window对象的成 ...
- javascript中typeof和instanceof用法的总结
今天在看相应的javascript书籍时,遇到了typeof和instanceof的问题,一直不太懂,特地查资料总结如下: JavaScript 中 typeof 和 instanceof 常用来判断 ...
- Final 关键字
1.涵义 最一般的意思就是声明 "这个东西不能改变".之所以要禁止改变,可能是考虑到两方面的因素:设计或效率. final 关键字可以用来修饰变量.方法和类,修饰变量表示变量不能被 ...
- python pygame--倒计时
import pygame,sys,time,datetime class decTime(object): #将秒转化为时分秒 def __init__(self,totalTime): self. ...
- vue指令v-on示例解析
绑定事件监听器.事件类型由参数指定.表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略. 1.事件 .click .mouseover .keyup ...... 2.修饰符 .sto ...
- 搭建hadoop、hdfs环境--ubuntu
最近在学习hadoop相关知识,就在本机上安装了hadoop,遇到了一些坑,也学到了不少.仅此记录我的安装过程,及可能遇到的问题.供参考.交流沟通见页末. 软件准备 > 虚拟机(VMware) ...
- 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛
"波导杯"安徽科技学院第七届程序设计大赛 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time: 2016-0 ...