3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 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) 清空该股票的持仓。