ATR指标原理

真实波幅(True Range)

传统波动率计算(最高价-最低价)忽略了跳空缺口。ATR通过 真实波幅(TR) 解决这个问题:

$$ TR_t = \max \begin{cases} H_t - L_t \ |H_t - C_{t-1}| \ |L_t - C_{t-1}| \end{cases} $$

其中:

  • $H_t$: 当前最高价
  • $L_t$: 当前最低价
  • $C_{t-1}$: 前一周期收盘价

物理意义: TR捕捉了三种波动来源:

  1. 日内波动 ($H_t - L_t$)

  2. 向上跳空 ($H_t - C_{t-1}$)

  3. 向下跳空 ($L_t - C_{t-1}$)

平均真实波幅(ATR)

对TR取指数移动平均(EMA):

$$ ATR_t = \frac{(N-1) \times ATR_{t-1} + TR_t}{N} $$

交互演示:ATR 参数的影响

为了更直观地理解 ATR,我制作了一个交互式工具。你可以拖动下面的滑块,改变周期 $N$,观察 ATR 曲线(下方蓝色区域)和基于 ATR 的通道(上方虚线)是如何变化的。

ATR 动态演示

Interactive Demo

💡拖动滑块观察:周期越大,ATR曲线越平滑,对价格波动的反应越迟钝(滞后性)。

参数N的选择:

  • N=14: Wilder原始推荐值
  • N=20: 适合日线级别
  • N=10-15: 适合分钟级别(期货日内)

ATR的性质:

  1. 无方向性: 只反映波动大小,不判断涨跌
  2. 滞后性: 基于历史数据,对突发事件反应慢
  3. 单位一致性: 与价格单位相同(元/手)

策略逻辑

核心思想

突破不看绝对值,看相对波动率

  • 假突破:价格突破0.1元,但ATR=0.2 → 突破幅度仅0.5倍ATR
  • 真突破:价格突破0.3元,且ATR=0.1 → 突破幅度达3倍ATR

交易信号

做多条件: $$ \begin{cases} P_t > \max(P_{t-N:t-1}) + k \times ATR_t \ V_t > 1.5 \times \overline{V}_{20} \end{cases} $$

做空条件: $$ \begin{cases} P_t < \min(P_{t-N:t-1}) - k \times ATR_t \ V_t > 1.5 \times \overline{V}_{20} \end{cases} $$

其中:

  • $P_t$: 当前价格
  • $k$: 突破倍数(1.5-3.0)
  • $V_t$: 当前成交量
  • $\overline{V}_{20}$: 20周期平均成交量

止损止盈

止损: $$ \text{StopLoss} = P_{\text{entry}} - m \times ATR_t $$

止盈: $$ \text{TakeProfit} = P_{\text{entry}} + r \times m \times ATR_t $$

其中:

  • $m$: 止损倍数(1.0-2.0)
  • $r$: 盈亏比(2.0-5.0)

伪代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class AtrBreakoutStrategy(CtaTemplate):
    # 参数
    atr_length = 20
    atr_multiplier = 2.0
    stop_loss_multiplier = 1.5
    take_profit_ratio = 3.0
    
    def on_bar(self, bar):
        # 计算ATR
        atr = self.calculate_atr(self.atr_length)
        
        # 计算突破位
        highest = max(self.high_array[-self.atr_length:])
        lowest = min(self.low_array[-self.atr_length:])
        
        # 突破信号
        breakout_threshold = atr * self.atr_multiplier
        
        if self.pos == 0:  # 无持仓
            if bar.close > highest + breakout_threshold:
                self.buy(bar.close, 1)
                self.entry_price = bar.close
                self.stop_loss = bar.close - atr * self.stop_loss_multiplier
                self.take_profit = bar.close + atr * self.stop_loss_multiplier * self.take_profit_ratio
                
            elif bar.close < lowest - breakout_threshold:
                self.short(bar.close, 1)
                self.entry_price = bar.close
                self.stop_loss = bar.close + atr * self.stop_loss_multiplier
                self.take_profit = bar.close - atr * self.stop_loss_multiplier * self.take_profit_ratio
        
        # 持仓管理
        elif self.pos > 0:  # 多头
            if bar.close <= self.stop_loss or bar.close >= self.take_profit:
                self.sell(bar.close, abs(self.pos))
                
        elif self.pos < 0:  # 空头
            if bar.close >= self.stop_loss or bar.close <= self.take_profit:
                self.cover(bar.close, abs(self.pos))

适用场景与失效案例

适用场景

市场状态表现原因
趋势初期✅✅✅波动率扩大,真突破概率高
政策驱动✅✅方向明确,趋势持续
窄幅震荡❌❌假突破频繁,止损密集
极端行情⚠️ATR滞后,止损过宽

失效案例1: 震荡市

时间: 2024-10-0110-10
行情: 国庆后观望,价格在100.5
101.0窄幅震荡

问题:

  • 价格频繁触及突破位(100.7 + 0.15×2 = 101.0)
  • 突破后迅速回落,触发止损
  • 10天内6次止损,累计亏损3%

改进:

  • 增加成交量过滤: $V_t > 1.5 \times \overline{V}_{20}$
  • 震荡识别: 当$ATR_t < 0.8 \times \overline{ATR}_{50}$时暂停策略

失效案例2: 极端事件

时间: 2024-09-20 (美联储降息)
行情: 国债价格跳空高开2%,ATR从0.15飙升至0.40

问题:

  • 止损位 = 入场价 - 0.15×1.5 = 入场价 - 0.225
  • 但开盘即亏损2%,远超止损预期
  • ATR计算基于历史,对突发事件滞后

改进:

  • 添加固定百分比止损: $\max(\text{ATR止损}, 2%\text{本金})$
  • 重大事件前降低仓位或暂停交易

策略优化方向

1. 多时间周期确认

1
2
3
4
5
6
# 5分钟突破 + 15分钟趋势一致
atr_5m = calculate_atr(bars_5m, 20)
atr_15m = calculate_atr(bars_15m, 20)

if breakout_5m and trend_15m_aligned:
    enter_position()

2. 动态ATR倍数

$$ k_t = k_0 \times \left( \frac{ATR_t}{\overline{ATR}_{50}} \right)^{-0.5} $$

逻辑: 波动率高时减小倍数(更敏感),波动率低时增大倍数(避免假突破)

3. 分批建仓

1
2
3
4
5
if breakout:
    buy(size=0.5)  # 首次建仓50%
    
if price_pullback_not_break_entry:
    buy(size=0.5)  # 回踩确认后加仓50%

实盘部署要点

滑点控制

回测假设 vs 实盘现实:

时段回测滑点实盘滑点
日内0.0050.01-0.015
开盘/收盘0.0050.02-0.03
重大新闻0.0050.05+

对策:

  • 限价单替代市价单
  • 避开流动性差的时段
  • 大单拆分执行

保证金监控

国债期货保证金比例:

  • 正常: 2%
  • 极端行情: 5% (临时上调)

风险公式: $$ \text{保证金占用} = \text{合约乘数} \times \text{价格} \times \text{保证金比例} \times \text{手数} $$

实例:

1
2
3
4
5
6
TL2512: 10,000元/点
价格: 101.5
保证金比例: 2%
持仓: 5手

保证金 = 10,000 × 101.5 × 0.02 × 5 = 101,500元

对策:

  • 保证金占用率不超过50%
  • 极端行情时主动减仓
  • 实时监控可用资金

心理因素

常见陷阱:

  1. 连续止损后不敢开仓 → 错过真突破
  2. 浮盈时提前止盈 → 错失大趋势
  3. 浮亏时死扛 → 小亏变大亏

对策:

  • 严格执行信号,不主观判断
  • 记录每笔交易心理状态
  • 设置强制休息规则(连续3次止损暂停1天)

ATR的其他应用

仓位管理

波动率反比加仓: $$ \text{Size} = \frac{k \times \text{Capital}}{ATR_t \times \text{Multiplier}} $$

逻辑: ATR大时减仓(风险高),ATR小时加仓(风险低)

动态止盈 (Chandelier Exit)

$$ \text{StopLoss}{\text{long}} = \max(H{t-N:t}) - 3 \times ATR_t $$

特点: 止盈位随价格上涨而上移,保护利润

市场状态识别

$$ \text{Regime} = \begin{cases} \text{趋势} & \text{if } ATR_t > 1.2 \times \overline{ATR}{50} \ \text{震荡} & \text{if } ATR_t < 0.8 \times \overline{ATR}{50} \end{cases} $$


总结

优势

  • 自适应波动率,避免固定点位止损
  • 适合趋势行情,尤其是国债期货
  • 实现简单,易于回测和优化

局限

  • 震荡市表现差,需配合市场状态过滤
  • ATR滞后,对突发事件反应慢
  • 参数敏感,需针对品种优化

适用品种

  • ✅ 国债期货 (TL/T/TS): 趋势稳定
  • ✅ 股指期货 (IF/IC/IH): 波动率高
  • ⚠️ 商品期货: 需调整参数

下一篇: 《布林带均值回归策略:统计套利的数学基础》