🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 聚宽 5 分钟级别 RSI 跌破 85 卖出策略实现指南

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

请高手看下RSI指标5分钟级别下跌卖出要怎么写

想实现前5分钟级别的RSI大于等于85,后5分钟级别的RSI的值跌破85,卖出,应该怎么写?下面是目前写的,不知道怎么改了。

具体的就是RSI用聚宽自带的函数,然后想实现日内分钟级别实时交易的时候,5分钟级别的RSI指标,某时刻前5分钟的RSI值小于85,而前前5分钟的值大于等于85,则卖出,别的都不需要

time_str = time.strftime("%Y-%m-%d", time.localtime())
#卖出
sell_list = set(context.portfolio.positions.keys())
for stock in sell_list:
RSI1 = RSI(stock, time_str, N1=6, unit = '5m')
RSI2 = RSI(stock, time_str, N1=6, unit = '5m')
if RSI2[stock] >= 85 and RSI1[stock] < 85:
#清空卖出
order_target_value(stock, 0)

解决方案

在 JoinQuant 聚宽平台上编写分钟级别的 RSI 策略,您目前的代码存在两个主要问题:

  1. 时间获取错误:在回测或模拟交易中,绝对不能使用 time.localtime(),这会获取物理服务器的当前时间,导致回测时间错乱或引入未来函数。必须使用 context.current_dt
  2. 指标计算方式:聚宽自带的 RSI 函数通常用于截面数据查询。对于分钟级别的历史连续状态对比(前一个5分钟和当前5分钟),最稳妥且高效的方法是使用 get_bars 获取历史 K 线数据,然后结合 talib 库来计算 RSI。

以下是为您修正并优化后的代码实现:

import talib
import numpy as np

def handle_data(context, data):
    # 获取当前持仓的股票列表
    sell_list = list(context.portfolio.positions.keys())
    
    for stock in sell_list:
        # 获取过去 15 个 5分钟 bar 的收盘价
        # RSI(6) 至少需要 7 个数据点,这里取 15 个以确保 talib 计算出有效值
        # include_now=True 表示包含当前正在运行的 5 分钟 bar
        bars = get_bars(stock, count=15, unit='5m', fields=['close'], include_now=True)
        close_prices = bars['close']
        
        # 使用 talib 计算 RSI,时间周期 N=6
        rsi_values = talib.RSI(close_prices, timeperiod=6)
        
        # 确保计算出了有效的 RSI 值(排除 NaN)
        if len(rsi_values) >= 2 and not np.isnan(rsi_values[-1]) and not np.isnan(rsi_values[-2]):
            rsi_current = rsi_values[-1] # 当前 5 分钟的 RSI
            rsi_prev = rsi_values[-2]    # 前一个 5 分钟的 RSI
            
            # 判断条件:前一个 >= 85 且 当前 < 85
            if rsi_prev >= 85 and rsi_current < 85:
                log.info(f"{stock} 5分钟RSI跌破85,执行清仓卖出。前值:{rsi_prev:.2f}, 当前值:{rsi_current:.2f}")
                order_target_value(stock, 0)

代码逻辑解析:

  1. get_bars 函数unit='5m' 指定获取 5 分钟级别的 K 线数据。count=15 获取过去 15 根 K 线,以保证 talib.RSI 有足够的数据进行平滑计算。
  2. talib.RSI:传入收盘价序列和周期 timeperiod=6,直接返回一个包含历史 RSI 值的 numpy 数组。
  3. 数组索引rsi_values[-1] 代表数组最后一个值(即当前 5 分钟的 RSI),rsi_values[-2] 代表倒数第二个值(即前一个 5 分钟的 RSI)。
  4. 条件判断:直接对比这两个值,满足条件即调用 order_target_value(stock, 0) 清空该股票的持仓。