RSRS(阻力支撑相对强度,Resistance Support Relative Strength)是一种基于阻力位与支撑位的技术指标,由光大证券在2017年提出。该指标通过分析最高价与最低价的关系,预测市场未来的涨跌趋势。由于其简单直观且具有较高的预测性,RSRS在股票、ETF、期货以及数字货币等领域被广泛使用,成为仅次于MACD的“网红指标”。
本文将详细介绍RSRS指标的原理、原始策略及其在商品期货中的应用改进,并探讨未来的策略优化方向。
RSRS指标的核心思想是通过最高价与最低价的关系来衡量市场的阻力与支撑强度。具体步骤如下:
斜率(\beta)即为当日的RSRS值,也被称为“RSRS斜率指标值”。
在原始研报中,RSRS斜率指标的交易策略如下:
该策略通过固定阈值判断市场趋势,简单易行,但存在一定的局限性。
为了适应商品期货市场的特点,我们对原始策略进行了以下改进:
注:该图像为棕榈油期货斜率分布展示,可观察均值并不是严格等于1,因此可使用动态阈值的方法设置交易信号。
改进后的策略规则如下: - 开多仓:如果斜率(\beta > \text{均值} + \text{标准差})。 - 平多仓:如果斜率(\beta < \text{均值})。 - 开空仓:如果斜率(\beta < \text{均值} - \text{标准差})。 - 平空仓:如果斜率(\beta > \text{均值})。
以下是添加了详细注释的策略代码,帮助理解每一部分的逻辑和功能:
from sklearn.linear_model import LinearRegression # 导入线性回归模型
import numpy as np # 导入NumPy库,用于数值计算
import pandas as pd # 导入Pandas库,用于数据处理
pretime = 0 # 全局变量,用于记录上一次处理的时间戳
def calculate_beta(df, window=18):
"""
计算斜率 beta 值
:param df: 包含最低价和最高价的DataFrame
:param window: 计算斜率时使用的数据点个数
:return: 斜率 beta 值
"""
if df.shape[0] < window: # 如果数据点不足,返回NaN
return np.nan
x = df['Low'].values # 获取最低价序列
y = df['High'].values # 获取最高价序列
beta = LinearRegression().fit(x.reshape(-1, 1), y).coef_[0] # 使用线性回归计算斜率
return beta
def main():
global pretime
# 获取初始账户权益
initEquity = _C(exchange.GetAccount)
initEquity = initEquity.Equity
def callBack_CTA(st):
"""
CTA策略回调函数
:param st: 策略状态对象,包含市场数据等信息
"""
global pretime
r = st["records"] # 获取市场数据记录
# 获取当前持仓信息
posInfo = exchange.GetPositions(st['symbol'])
# 检查是否有新数据
if r[-1].Time != pretime:
pretime = r[-1].Time # 更新处理时间戳
# 检查数据获取是否成功
if len(r) > 0:
# 创建一个空的DataFrame,并指定列名
newdf = pd.DataFrame(columns=['Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'OpenInterest'])
# 遍历记录r中的每一个元素,并将其作为新行添加到DataFrame中
for record in r:
new_row = {
'Time': _D(record['Time']/1000), # 转换时间戳为可读格式
'Open': record['Open'], # 开盘价
'High': record['High'], # 最高价
'Low': record['Low'], # 最低价
'Close': record['Close'], # 收盘价
'Volume': record['Volume'], # 成交量
'OpenInterest': record['OpenInterest'] # 未平仓量
}
# 使用 pd.concat() 替代 append(),将新行添加到DataFrame
newdf = pd.concat([newdf, pd.DataFrame([new_row])], ignore_index=True)
# 提取最低价和最高价数据
data = newdf[['Low', 'High']].tail(150)
N = 15 # 计算斜率时的数据点个数
# 计算滚动窗口内的斜率 beta 值
data['beta'] = [calculate_beta(df, window=N) for df in data.rolling(N)]
# 计算 beta 列的均值
beta_mean = data['beta'].mean()
# 计算 beta 列的标准差
beta_std = data['beta'].std()
# 获取最新的 beta 值
newbeta = data['beta'].iloc[-1]
# 开仓逻辑
if not posInfo: # 如果没有持仓
if newbeta > beta_mean + beta_std: # 如果 beta 大于均值加标准差,开多仓
return 1
if newbeta < beta_mean - beta_std: # 如果 beta 小于均值减标准差,开空仓
return -1
# 持仓逻辑
if posInfo: # 如果有持仓
curPos = posInfo[0] # 获取当前持仓信息
# 如果持有多仓且 beta 小于均值,平多仓
if (curPos.Type % 2 == 0 and (newbeta < beta_mean)):
Log('趋势信号减弱:平多#ff0000')
return -curPos['Amount']
# 如果持有空仓且 beta 大于均值,平空仓
if (curPos.Type % 2 == 1 and (newbeta > beta_mean)):
Log('趋势信号减弱:平空#0000ff')
return curPos['Amount']
# 计算当前账户权益和收益
curEquity = _C(exchange.GetAccount)
curEquity = curEquity.Equity
curprofit = curEquity - initEquity
LogProfit(curprofit, '&') # 记录收益
# 启动CTA策略
ret = ext.CTA("SA888", callBack_CTA)
calculate_beta
函数:
main
函数:
callBack_CTA
回调函数,用于处理市场数据和执行交易逻辑。callBack_CTA
函数:
交易逻辑:
收益记录:
RSRS指标通过分析最高价与最低价的关系,为市场趋势预测提供了一种简单而有效的方法。本文介绍了RSRS指标的原理、原始策略及其在商品期货中的应用改进,并提供了代码实现和未来优化方向。通过动态阈值和多空双向交易,改进后的策略能够更好地适应商品期货市场的特点,为投资者提供有力的决策支持。
实盘围观: