问题描述
我看不少方法里面都用到了RSI_judge_qujian这个方法
请问这个方法源码是怎么实现的呢?
现在克隆策略里面调用这个方法不能运行了
解决方案
您好!在聚宽(JoinQuant)平台上克隆策略时,如果遇到提示找不到 RSI_judge_qujian 方法,通常是因为这个方法并不是聚宽官方的内置 API,而是某位量化作者自己编写的自定义函数(Custom Function)。
当您克隆策略时,如果原作者将这个函数写在了个人的私有库文件(如 mylib.py)中,或者在克隆过程中遗漏了该函数的定义部分,就会导致代码运行时报错 NameError: name 'RSI_judge_qujian' is not defined。
1. RSI_judge_qujian 的作用解析
从函数命名 RSI_judge_qujian(RSI 判断区间)可以看出,这个函数的主要作用是:
- 计算标的股票的 RSI(相对强弱指数)值。
- 判断当前的 RSI 值处于哪个区间(例如:超买区、超卖区、震荡区)。
在量化交易中,通常的 RSI 区间划分如下:
- RSI > 70:超买区间(Overbought),暗示资产可能被高估,有回调风险,通常作为卖出信号。
- RSI < 30:超卖区间(Oversold),暗示资产可能被低估,有反弹可能,通常作为买入信号。
- 30 <= RSI <= 70:正常震荡区间。
2. RSI_judge_qujian 的完整源码实现
为了让您的策略能够重新运行,您可以将以下源码直接复制并粘贴到您策略代码的空白处(通常放在 initialize 函数的上方或下方)。
这里我们借助 Python 著名的技术分析库 talib 来实现:
import talib
import numpy as np
from jqdata import *
def RSI_judge_qujian(security, timeperiod=14):
"""
计算指定标的的 RSI 值,并判断其所处的区间。
:param security: 标的代码,如 '000001.XSHE'
:param timeperiod: RSI 的计算周期,默认通常为 14 天
:return: 返回一个元组 (rsi_value, status)
status 包含: 'OVERSOLD' (超卖), 'OVERBOUGHT' (超买), 'NORMAL' (正常), 'UNKNOWN' (数据不足)
"""
# 为了计算 timeperiod 天的 RSI,我们需要 timeperiod + 1 天的数据
# 考虑到 talib 计算 RSI 需要一定的预热数据(通常建议多取一些,比如 timeperiod * 2)
data_length = timeperiod * 2
# 获取历史收盘价数据
close_data = attribute_history(security, data_length, '1d', ['close'], df=False)
close_prices = close_data['close']
# 如果获取的数据不足,返回 UNKNOWN
if len(close_prices) < timeperiod + 1:
return np.nan, 'UNKNOWN'
# 使用 talib 计算 RSI
rsi_values = talib.RSI(close_prices, timeperiod=timeperiod)
# 获取最新一个交易日的 RSI 值
current_rsi = rsi_values[-1]
# 判断区间
if np.isnan(current_rsi):
return current_rsi, 'UNKNOWN'
elif current_rsi >= 70:
return current_rsi, 'OVERBOUGHT' # 超买,可能需要卖出
elif current_rsi <= 30:
return current_rsi, 'OVERSOLD' # 超卖,可能需要买入
else:
return current_rsi, 'NORMAL' # 正常震荡区间
3. 如何在策略中调用该方法?
将上述代码加入您的策略后,您可以在 handle_data 或自定义的定时运行函数中这样调用它:
def handle_data(context, data):
security = '000001.XSHE'
# 调用我们刚刚实现的 RSI_judge_qujian 函数
rsi_val, rsi_status = RSI_judge_qujian(security, timeperiod=14)
# 打印日志查看结果
log.info(f"标的: {security}, 当前RSI: {rsi_val:.2f}, 状态: {rsi_status}")
# 根据区间状态执行交易逻辑
if rsi_status == 'OVERSOLD' and context.portfolio.available_cash > 0:
log.info("RSI进入超卖区,执行买入")
order_value(security, context.portfolio.available_cash)
elif rsi_status == 'OVERBOUGHT' and context.portfolio.positions[security].closeable_amount > 0:
log.info("RSI进入超买区,执行卖出")
order_target(security, 0)
总结
原策略报错是因为缺少了这个自定义的辅助函数。您只需要将上述 RSI_judge_qujian 的实现代码补充到您的策略文件中,策略就可以恢复正常运行了。您可以根据原策略的具体逻辑,适当微调超买超卖的阈值(如把 70/30 改为 80/20)。