源码文件:vnpy_ctastrategy.strategies.atr_rsi_strategy

1. 策略概述

AtrRsiStrategy 是一个结合了 波动率 (ATR)动量 (RSI) 的趋势突破策略。 它的核心思想是:只有在市场波动率足够大(ATR 处于高位)时,才去交易 RSI 的突破信号。这是一种典型的“过滤器”思想,旨在减少 RSI 在低波动震荡市中的假突破磨损。

  • 基类CtaTemplate
  • 核心指标:ATR (Average True Range), RSI (Relative Strength Index)
  • 风控机制:百分比移动止损 (Trailing Stop)

2. 核心参数与变量

参数名默认值含义
atr_length22计算 ATR 的窗口周期
atr_ma_length10计算 ATR 均线的窗口周期
rsi_length5计算 RSI 的窗口周期(非常灵敏)
rsi_entry16RSI 入场阈值偏移量 (50 ± 16)
trailing_percent0.8移动止损百分比 (0.8%)

3. 策略逻辑详解

3.1 过滤器:ATR 波动率判断

策略首先计算 ATR 值及其移动平均线 (MA)。

1
2
3
atr_array = am.atr(self.atr_length, array=True)
self.atr_value = atr_array[-1]
self.atr_ma = atr_array[-self.atr_ma_length:].mean()

入场前提self.atr_value > self.atr_ma

解释:当前波动率 > 过去一段时间的平均波动率。说明市场开始活跃,可能即将走出趋势。

3.2 信号触发:RSI 突破

在满足 ATR 过滤器的前提下,检查 RSI:

  • 做多条件rsi_value > (50 + rsi_entry) (即 > 66)
  • 做空条件rsi_value < (50 - rsi_entry) (即 < 34)
1
2
3
4
5
if self.atr_value > self.atr_ma:
    if self.rsi_value > self.rsi_buy:
        self.buy(bar.close_price + 5, self.fixed_size)
    elif self.rsi_value < self.rsi_sell:
        self.short(bar.close_price - 5, self.fixed_size)

注意:这里使用了超价下单 (+5 / -5) 来保证成交,类似于市价单的效果。

3.3 出场与风控:移动止损 (Trailing Stop)

策略没有固定的止盈点,而是完全依赖移动止损来保护利润并让利润奔跑。

  • 多单持有中: 记录持仓期间的最高价 intra_trade_high。 止损线 = intra_trade_high * (1 - 0.8%)

    1
    2
    3
    
    self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
    long_stop = self.intra_trade_high * (1 - self.trailing_percent / 100)
    self.sell(long_stop, abs(self.pos), stop=True)
    
  • 空单持有中: 记录持仓期间的最低价 intra_trade_low。 止损线 = intra_trade_low * (1 + 0.8%)

    1
    2
    3
    
    self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
    short_stop = self.intra_trade_low * (1 + self.trailing_percent / 100)
    self.cover(short_stop, abs(self.pos), stop=True)
    

4. 总结

AtrRsiStrategy 展示了两个重要的量化交易概念:

  1. 多因子共振:单纯用 RSI 容易在震荡市亏损,加上 ATR 波动率过滤后,只在市场活跃时交易,提高了胜率。
  2. 移动止损:不预测目标价位,而是跟随趋势,直到趋势反转触及止损线离场。这是趋势策略最标准的出场方式。