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通常与其他指标结合使用以增强可靠性: