ATR网格---ATR计算原理研究运用
文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途
最近这个市场一上一下的,网格做红利,外盘,宽基金,黄金还是非常不错的,我看了网格是一个不错的交易方式的,常见的网格是固定的,不同的标的波动率不一样,使用的固定的网格不合适全部标的,ATR是这个自动匹配波动率的非常不错的指标,我写了2个atr网格,后面给策略的运行原理图,今天先了解atr的计算,原理
周末qmt在维护不好测试代码,星期一策略一下看看结果,网格用来做黄金,宽基金,外盘,红利,银行是非常不错的选择,atr的计算
先看一下atr的运用原理ATR网格---ATR计算原理研究运用https://mp.weixin.qq.com/s/N7QANrYlZ-nXqX2VMbktMw
第一部分:ATR 的核心概念与计算
1. 核心概念
ATR的“真实波幅”考虑了一个时间段内的最高价、最低价以及前一个交易日的收盘价,以捕捉可能出现的“跳空缺口”带来的波动。因此,它比简单的“最高价-最低价”范围更能真实地反映市场的波动性。
2. 详细计算步骤
ATR的计算分为两步:先计算真实波幅(TR),再对TR进行移动平均(通常是14期)。
步骤一:计算当前K线的真实波幅(True Range, TR)
TR是以下三个值的最大值:
-
当前K线的最高价 - 当前K线的最低价
(High_t - Low_t
) -
当前K线的最高价 - 前一根K线的收盘价(的绝对值)
(| High_t - Close_{t-1} |
) -
当前K线的最低价 - 前一根K线的收盘价(的绝对值)
(| Low_t - Close_{t-1} |
)
公式为:
TR_t = MAX( High_t - Low_t, | High_t - Close_{t-1} |, | Low_t - Close_{t-1} | )
步骤二:计算ATR
对TR进行平滑处理,通常使用14作为周期(N)。威尔德在他的书中推荐使用14周期的移动平均,这个参数至今仍被广泛使用。计算方式有两种:
-
经典方法(Wilder的平滑法):这是威尔德最初提出的方法,也是一种指数移动平均的变体。
-
第一个ATR值:
ATR_14 = (前14个TR的总和) / 14
-
后续ATR值:
当前ATR = [ (前一个ATR * 13) + 当前TR ] / 14
-
-
简单移动平均(SMA)法:现在很多交易软件也提供直接用SMA计算ATR的选项。
-
ATR = SMA(TR, N)
(即过去N根K线的TR值的简单算术平均)
-
重要提示:绝大多数现代交易平台(如TradingView, MetaTrader, Thinkorswim等)都会自动完成这些计算,你只需要在图表上添加ATR指标并设置周期即可,无需手动计算。
3. 如何解读ATR值
-
ATR值本身没有意义,其数值代表的是价格的平均波动范围。例如,一只股票的ATR是1.5,意味着平均每天波动1.5元。
-
ATR值越高,代表波动性越大,市场情绪越激烈(无论是贪婪还是恐惧)。通常在发布重要新闻、财报或市场出现恐慌/狂热时,ATR会急剧上升。
-
ATR值越低,代表波动性越小,市场处于盘整或犹豫不决的状态。
-
ATR值的比较:
-
纵向比较:将当前的ATR值与自身历史值进行比较。例如,当前ATR是2.0,而过去一个月的平均ATR是1.0,说明现在波动性是过去的两倍。
-
横向比较:比较不同资产的ATR值。例如,一只科技股的ATR是3.0,而一只公用事业股的ATR是0.5,说明科技股的波动性远大于公用事业股。
-
第二部分:ATR 的实际运用
ATR不预测方向,但它是风险管理和策略优化的强大工具。
1. 动态设置止损(最常用、最核心的用法)
这是ATR最经典和最有价值的应用。基于固定点数或金额的止损无法适应市场波动性的变化。ATR止损是动态的,能根据市场波动自动调整止损幅度。
-
方法:
-
做多止损:
入场价格 - (X * ATR值)
-
做空止损:
入场价格 + (X * ATR值)
-
-
参数X:通常是一个倍数,常见的有1.5、2、2.5或3。这个倍数取决于你的交易策略和风险承受能力。
-
例如,你在100元入场做多,当前14周期ATR是2.5。你使用2倍ATR作为止损距离,那么你的止损位就是
100 - (2 * 2.5) = 95
元。
-
优点:
-
避免被噪音震出局:在波动大的市场中,止损会放宽,避免被正常的市场“噪音”触发止损。
-
锁定利润:在趋势行情中,ATR值会增大,你的跟踪止损幅度也会相应变大,可以更好地让利润奔跑。
-
适应性:自动适应不同波动性的股票、期货、外汇等不同资产。
2. 动态设置止盈目标
同理,你也可以用ATR来设定合理的目标位。
-
方法:
-
做多目标:
入场价格 + (X * ATR值)
-
做空目标:
入场价格 - (X * ATR值)
-
-
这里的X倍数可以与止损倍数相同,也可以不同,取决于你的风险回报比策略。例如,你可能会设置一个3倍ATR的止盈和一个1.5倍ATR的止损,以达到2:1的风险回报比。
3. 作为仓位管理(资金管理)的关键输入
ATR是波动性调整仓位的核心。你的仓位大小应该与市场的波动性成反比。
-
原理:波动性越大(ATR越高),单笔交易潜在的风险就越大,因此你应该持有更小的头寸以控制风险。
-
方法(Van Tharp的方法):
-
确定你愿意为单笔交易承担的最大风险(比如账户总额的1%)。
-
计算你基于ATR的止损距离(比如
2 * ATR
)。 -
头寸大小 = (账户总资金 * 1%风险) / (止损距离 * 每点价值)
-
-
例子:账户有10万元,单笔风险1%(即1000元)。你交易某股票,ATR为2元,使用2倍ATR止损,即止损距离为4元。你最多可以买入:
1000 / 4 = 250
股。这样,无论市场波动多大,你的最大亏损都被锁定在1000元。
4. 识别市场波动性变化和趋势强度
-
ATR上升:表明波动性在增加,通常发生在现有趋势加速或反转之初。趋势强劲时,ATR保持高位或继续上升。
-
ATR下降:表明波动性在收缩,市场进入盘整或犹豫期,这通常是爆发前的宁静,预示着可能即将出现一波大的行情(突破)。结合布林带收缩等指标一起观察,效果更好。
-
趋势确认:在上升趋势中,价格不断创新高,如果同时ATR也同步上升,说明买盘力量强劲,趋势健康。如果价格创新高但ATR下降(顶背离),则可能暗示趋势动力不足,是潜在的反转警告。下降趋势中同理。
ATR是一个专注于衡量波动性的工具,它在风险管理(动态止损、仓位管理)方面的价值远大于其作为信号发生器的作用。
一个典型的交易工作流可能是:
-
用趋势指标或价格行为确定交易方向(做多/做空)。
-
查看当前ATR值,评估市场波动性。
-
根据ATR值和个人风险偏好(如2倍ATR)设置科学的止损位。
-
根据止损距离和账户风险承受度(如1%),计算合理的买入头寸。
-
在持仓过程中,根据最新的ATR值动态调整止损位(跟踪止损),并管理仓位。
计算的代码,先安装西蒙斯数据库,读取不同标的的数据教程
量化研究--推出强大西蒙斯金融量化交易数据库2https://mp.weixin.qq.com/s?__biz=MzI5NTE5NTExMw==&mid=2247495257&idx=1&sn=47f47a51a2fa6b664d905d8566746eb1&scene=21#wechat_redirect
比如计算半导体etf
ATR计算输出***************
股票:512480 目前:ATR0.06157142857142856 对应涨跌幅:4.484444906877536
匹配还是非常不错的
比如计算宽基金561930沪深300ETF
输出的结果
ATR计算输出***************
股票:561930 目前:ATR0.026428571428571485 对应涨跌幅:1.801538611354566
计算源代码
'''
ATR计算研究
作者:西蒙斯量化
微信:xg_quant
'''
from xms_quant_trader_data.xms_quant_trader_data import xms_quant_trader_data
import pandas as pd
import numpy as np
#读取西蒙斯数据库数据
#教程https://gitee.com/li-xingguo11111/xms_quant_trader_data
api=xms_quant_trader_data(url='http://14.103.193.242',port='8080',password='test')
def ABS(S): '''返回N的绝对值''' return np.abs(S)
def REF(S, N=1): ''' 对序列整体下移动N,返回序列(shift后会产生NAN) '''return pd.Series(S).shift(N).values
def MA(S,N): '''求序列的N日简单移动平均值,返回序列 ''' return pd.Series(S).rolling(N).mean().values
def MAX(S1,S2): '''序列max'''return np.maximum(S1,S2)
def ATR(CLOSE,HIGH,LOW,N=14):'''真实波幅输出MTR:(最高价-最低价)和1日前的收盘价-最高价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值输出真实波幅:MTR的N日简单移动平均'''MTR=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW))ATR=MA(MTR,N)return MTR,ATR
#读取etf数据
stock='561930'
start_date='20250101'
end_date='20500101'
df=api.get_ETF_daily_hist_data(stock=stock,start_date=start_date,end_date=end_date)
print(df)
CLOSE=df['close']
HIGH=df['high']
LOW=df['low']
N=14
mtr,atr=ATR(CLOSE=CLOSE,HIGH=HIGH,LOW=LOW,N=N)
last_atr=atr[-1]
close=CLOSE.tolist()[-1]
zdf=(last_atr/close)*100
print("ATR计算输出***************")
print('股票:{} 目前:ATR{} 对应涨跌幅:{}'.format(stock,last_atr,zdf))