资源加载中... loading...

网红指标RSRS在商品期货中的应用

Author: ianzeng123, Created: 2025-01-03 17:17:48, Updated: 2025-01-06 11:12:04

网红指标RSRS在商品期货中的应用

RSRS(阻力支撑相对强度,Resistance Support Relative Strength)是一种基于阻力位与支撑位的技术指标,由光大证券在2017年提出。该指标通过分析最高价与最低价的关系,预测市场未来的涨跌趋势。由于其简单直观且具有较高的预测性,RSRS在股票、ETF、期货以及数字货币等领域被广泛使用,成为仅次于MACD的“网红指标”。

本文将详细介绍RSRS指标的原理、原始策略及其在商品期货中的应用改进,并探讨未来的策略优化方向。

RSRS指标的原理

RSRS指标的核心思想是通过最高价与最低价的关系来衡量市场的阻力与支撑强度。具体步骤如下: 网红指标RSRS在商品期货中的应用

  1. 获取价格序列:选取N日的最高价和最低价序列。
  2. 线性回归:对最高价和最低价序列进行最小二乘法(OLS)线性回归,得到回归方程: [ \text{最高价} = \alpha + \beta \times \text{最低价} ] 其中,斜率(\beta)表示最高价相对最低价的变化程度。
  3. 斜率的意义
    • 当(\beta)较大时,支撑强度大于阻力强度,市场上涨空间较大。
    • 当(\beta)较小时,阻力强度大于支撑强度,市场可能见顶回落。

斜率(\beta)即为当日的RSRS值,也被称为“RSRS斜率指标值”。

原始交易策略

在原始研报中,RSRS斜率指标的交易策略如下:

  1. 计算RSRS斜率:基于N日最高价和最低价序列计算斜率(\beta)。
  2. 交易规则
    • 如果斜率(\beta > 1),则买入持有。
    • 如果斜率(\beta < 0.8),则卖出平仓。

该策略通过固定阈值判断市场趋势,简单易行,但存在一定的局限性。

策略改进

为了适应商品期货市场的特点,我们对原始策略进行了以下改进:

网红指标RSRS在商品期货中的应用

:该图像为棕榈油期货斜率分布展示,可观察均值并不是严格等于1,因此可使用动态阈值的方法设置交易信号。

  1. 动态阈值:使用均值加减一个标准差作为动态阈值,替代固定的(\beta)值。
  2. 多空双向交易:支持开多仓和开空仓,并根据斜率变化动态调整仓位。
  3. 平仓逻辑:在持有多仓或空仓时,根据斜率均值判断趋势是否减弱,及时平仓。

改进后的策略规则如下: - 开多仓:如果斜率(\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)

代码逻辑详解

  1. calculate_beta 函数

    • 输入:包含最低价和最高价的DataFrame。
    • 功能:使用线性回归计算最低价和最高价之间的斜率 beta 值。
    • 输出:斜率 beta 值。
  2. main 函数

    • 初始化账户权益。
    • 定义 callBack_CTA 回调函数,用于处理市场数据和执行交易逻辑。
  3. callBack_CTA 函数

    • 获取市场数据记录和当前持仓信息。
    • 检查是否有新数据,如果有则更新数据并计算斜率 beta 值。
    • 根据斜率 beta 值与均值、标准差的关系,执行开仓或平仓操作。
    • 记录当前账户权益和收益。
  4. 交易逻辑

    • 开多仓:如果 beta 大于均值加标准差。
    • 开空仓:如果 beta 小于均值减标准差。
    • 平多仓:如果持有多仓且 beta 小于均值。
    • 平空仓:如果持有空仓且 beta 大于均值。
  5. 收益记录

    • 计算当前账户权益与初始权益的差值,记录收益。

网红指标RSRS在商品期货中的应用

未来策略方向

  1. 斜率标准化:对斜率进行更多标准化处理,提高指标的稳定性。
  2. 止损机制:添加硬止损或移动止损,防止极端行情下的亏损。
  3. 多品种交易:针对多个品种进行交易,降低单一品种的风险,实现风险对冲。

总结

RSRS指标通过分析最高价与最低价的关系,为市场趋势预测提供了一种简单而有效的方法。本文介绍了RSRS指标的原理、原始策略及其在商品期货中的应用改进,并提供了代码实现和未来优化方向。通过动态阈值和多空双向交易,改进后的策略能够更好地适应商品期货市场的特点,为投资者提供有力的决策支持。

实盘围观:

https://www.youquant.com/robot/474283


更多内容