RSI策略

RSI(相对强弱指标)策略是基于技术分析中的RSI指标进行交易决策的方法。RSI由J. Welles Wilder Jr.于1978年提出,是最常用的超买超卖指标之一。

RSI指标原理

RSI测量一段时间内价格上涨和下跌的相对强度,其数值范围在0-100之间。

计算公式

RSI = 100 - (100 / (1 + RS))

其中:

  • RS = 平均上涨幅度 / 平均下跌幅度
  • 平均上涨/下跌幅度通常采用指数移动平均(EMA)或简单移动平均(SMA)计算

Python计算实现

import pandas as pd
import numpy as np
 
def calculate_rsi(prices, period=14):
    # 计算价格变化
    delta = prices.diff()
    
    # 分离上涨和下跌
    gain = delta.clip(lower=0)
    loss = -delta.clip(upper=0)
    
    # 计算平均上涨和下跌
    avg_gain = gain.rolling(window=period).mean()
    avg_loss = loss.rolling(window=period).mean()
    
    # 计算相对强度
    rs = avg_gain / avg_loss
    
    # 计算RSI
    rsi = 100 - (100 / (1 + rs))
    
    return rsi

基本交易策略

传统超买超卖策略

最常见的RSI应用是通过固定阈值判断超买超卖状态:

  • RSI > 70: 超买区域,可能反转下跌,考虑卖出信号
  • RSI < 30: 超卖区域,可能反转上涨,考虑买入信号
def rsi_signals(rsi, overbought=70, oversold=30):
    signals = pd.Series(0, index=rsi.index)
    signals[rsi < oversold] = 1    # 买入信号
    signals[rsi > overbought] = -1  # 卖出信号
    return signals

RSI背离策略

当价格与RSI指标走势不一致时,可能预示着趋势即将反转:

  • 价格创新高但RSI未创新高:看跌背离
  • 价格创新低但RSI未创新低:看涨背离
def rsi_divergence(prices, rsi, window=20):
    # 寻找局部高点和低点
    price_highs = prices.rolling(window, center=True).apply(
        lambda x: (x.iloc[window//2] == max(x)), raw=True
    )
    
    rsi_highs = rsi.rolling(window, center=True).apply(
        lambda x: (x.iloc[window//2] == max(x)), raw=True
    )
    
    # 寻找背离
    bearish_divergence = (price_highs == 1) & (
        prices > prices.shift(window)) & (rsi < rsi.shift(window))
    
    # 类似地可以计算看涨背离
    # ...
    
    return bearish_divergence

RSI趋势线策略

在RSI图表上绘制趋势线,当RSI突破趋势线时产生交易信号。这种方法比传统固定阈值更灵活。

高级策略优化

动态阈值设置

基于市场状态动态调整超买超卖阈值:

def dynamic_rsi_thresholds(prices, rsi, volatility_window=20):
    # 计算波动率
    volatility = prices.pct_change().rolling(volatility_window).std()
    
    # 根据波动率调整阈值
    overbought = 70 + volatility * 100  # 高波动时提高阈值
    oversold = 30 - volatility * 100    # 高波动时降低阈值
    
    # 限制在合理范围内
    overbought = overbought.clip(upper=85)
    oversold = oversold.clip(lower=15)
    
    return overbought, oversold

RSI与均线结合

将RSI与均线结合使用,增强信号可靠性:

  • 只在上升趋势中(价格>MA)考虑RSI超卖信号
  • 只在下降趋势中(价格<MA)考虑RSI超买信号
def rsi_with_ma(prices, rsi, ma_period=50, overbought=70, oversold=30):
    # 计算均线
    ma = prices.rolling(ma_period).mean()
    
    # 生成信号
    signals = pd.Series(0, index=rsi.index)
    
    # 上升趋势中的超卖买入
    buy_signal = (prices > ma) & (rsi < oversold)
    signals[buy_signal] = 1
    
    # 下降趋势中的超买卖出
    sell_signal = (prices < ma) & (rsi > overbought)
    signals[sell_signal] = -1
    
    return signals

RSI交叉策略

监控RSI与其自身均线的交叉,或两个不同周期RSI的交叉:

def rsi_crossover(rsi, fast_period=5, slow_period=14):
    # 计算RSI的移动平均
    rsi_ma = rsi.rolling(slow_period).mean()
    
    # 生成交叉信号
    signals = pd.Series(0, index=rsi.index)
    
    # RSI上穿其均线为买入信号
    buy_signal = (rsi > rsi_ma) & (rsi.shift(1) < rsi_ma.shift(1))
    signals[buy_signal] = 1
    
    # RSI下穿其均线为卖出信号
    sell_signal = (rsi < rsi_ma) & (rsi.shift(1) > rsi_ma.shift(1))
    signals[sell_signal] = -1
    
    return signals

策略回测与评估

以下是评估RSI策略表现的方法:

1. 单日收益分析

分析每次信号产生后的短期收益:

def analyze_signal_returns(prices, signals):
    # 计算信号后的收益率
    next_day_return = prices.pct_change().shift(-1)
    signal_returns = next_day_return[signals != 0]
    
    # 按信号类型分组分析
    buy_returns = next_day_return[signals == 1]
    sell_returns = -next_day_return[signals == -1]  # 卖出信号取负收益
    
    return {
        'all_signals_mean': signal_returns.mean(),
        'buy_signals_mean': buy_returns.mean(),
        'sell_signals_mean': sell_returns.mean(),
        'buy_win_rate': (buy_returns > 0).mean(),
        'sell_win_rate': (sell_returns > 0).mean()
    }

2. 策略累计收益曲线

计算策略在整个回测期间的累计收益:

def calculate_strategy_returns(prices, signals):
    # 生成仓位序列(假设信号产生后持有直到下一信号)
    positions = signals.replace(0, np.nan).ffill().fillna(0)
    
    # 计算每日收益
    daily_returns = prices.pct_change() * positions.shift(1)
    
    # 计算累计收益
    cumulative_returns = (1 + daily_returns).cumprod()
    
    return daily_returns, cumulative_returns

实际应用注意事项

参数敏感性

RSI策略性能对参数选择较为敏感,关键参数包括:

  • RSI周期:较短周期(如9或7)更敏感,较长周期(如14或21)更稳定
  • 超买超卖阈值:市场不同阶段可能需要不同阈值
  • 持仓周期:RSI信号通常适合短期交易

市场适应性

RSI策略在不同市场状态下表现不同:

  • 震荡市场:传统超买超卖策略表现较好
  • 趋势市场:可能产生频繁错误信号,需要结合趋势过滤
  • 高波动率市场:需调整更极端的阈值

与其他指标结合

RSI通常与其他指标结合使用以增强可靠性: