Python实现Connors RSI(3,2,100)计算结果异常求助
问题排查与修正:Connors RSI计算错误
核心错误点
- PercentRank计算对象错误:Connors RSI的第三个成分是连涨连跌天数(streak)的100期百分位排名,你错误地使用了单日收益率(
one_day_return)来计算排名,完全偏离了指标定义。 - 百分位排名未缩放至0-100区间:你计算的
percent_rank是0-1的小数,而前两个RSI值是0-100的整数,三者直接相加会导致结果严重偏低。
修正后的代码
1. 修正PercentRank计算逻辑
将计算对象替换为streaks_numpy(连涨连跌天数),并将结果缩放至0-100区间:
# 定义回溯周期 lookback = 100 # 计算连涨连跌天数的百分位排名(0-100) def calculate_percent_rank(x): current = x[-1] # 统计小于当前值的数量 + 等于当前值数量的一半(标准百分位排名逻辑) count_less = np.sum(x < current) count_eq = np.sum(x == current) return (count_less + 0.5 * count_eq) / len(x) * 100 df['percent_rank'] = df['streaks_numpy'].rolling(window=lookback, min_periods=lookback).apply( calculate_percent_rank, raw=True )
2. 重新计算Connors RSI
现在三个成分都是0-100区间的值,直接按公式计算:
# 计算CRSI df['CRSI'] = (df['rsi(3)'] + df['streak_rsi'] + df['percent_rank']) / 3
额外验证点
- 你之前实现的
streaks_numpy逻辑正确:当收盘价相等时,streak重置为0,符合Connors RSI的定义。 - RSI函数中的
min_periods = periods参数设置合理,前periods-1天返回NaN,符合指标初始值的计算逻辑。
内容的提问来源于stack exchange,提问作者Simon B
相关产品推荐
相关产品推荐

