请高手看下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 策略,您目前的代码存在两个主要问题:
- 时间获取错误:在回测或模拟交易中,绝对不能使用
time.localtime(),这会获取物理服务器的当前时间,导致回测时间错乱或引入未来函数。必须使用context.current_dt。 - 指标计算方式:聚宽自带的
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)
代码逻辑解析:
get_bars函数:unit='5m'指定获取 5 分钟级别的 K 线数据。count=15获取过去 15 根 K 线,以保证talib.RSI有足够的数据进行平滑计算。talib.RSI:传入收盘价序列和周期timeperiod=6,直接返回一个包含历史 RSI 值的 numpy 数组。- 数组索引:
rsi_values[-1]代表数组最后一个值(即当前 5 分钟的 RSI),rsi_values[-2]代表倒数第二个值(即前一个 5 分钟的 RSI)。 - 条件判断:直接对比这两个值,满足条件即调用
order_target_value(stock, 0)清空该股票的持仓。