Python으로 코너즈(Connors) RSI 구현하기

코너즈(Connors) RSI는 Larry Connors가 개발한 지표로, 단기적인 가격 모멘텀을 평가하기 위해 표준 RSI를 확장한 버전입니다.
이 지표는 전통적인 3가지 요소(RSI, 연속 상승/하락 일수, ROC)를 결합하여 시장의 단기 과매수 및 과매도 상태를 정밀하게 분석합니다. 특히 단기 트레이딩 전략에서 진입 및 청산 신호를 더 세밀하게 포착하는 데 유용하며, 기본 RSI보다 더 빠르게 반응하는 특성이 있습니다. 보통 값이 90 이상이면 과매수, 10 이하이면 과매도로 해석되며, 단기 반전 매매 전략과 함께 활용됩니다.

import pandas as pd
import ccxt
import pinetopy as pp
import numpy as np

# Binance Futures, BTCUSDT, 1h
bnb = ccxt.binance({'options': { 'defaultType': 'future' }}) 
ohlcv = bnb.fetch_ohlcv(symbol="BTC/USDT", timeframe="1h", limit=500)
df = pd.DataFrame(ohlcv, columns=['time', 'open', 'high', 'low', 'close', 'volume'])
df['time'] = pp.kst(df['time'])

def updown(series):
    ud = np.zeros(len(series))
    if len(series) > 0:
        ud[0] = 0  # 초기값 설정
    for i in range(1, len(series)):
        prev = series.iat[i - 1]
        prev_ud = ud[i - 1] if not np.isnan(ud[i - 1]) else 0  # nz 기능 적용
        
        ud[i] = (
            0 if series.iat[i] == prev else
            1 if series.iat[i] > prev and prev_ud <= 0 else
            prev_ud + 1 if series.iat[i] > prev else
            -1 if prev_ud >= 0 else
            prev_ud - 1
        )
    return pd.Series(ud, index=series.index)

def percent_rank(series, length):
    return series.rolling(window=length).apply(lambda x: (np.sum(x < x[-1]) / (len(x) - 1) * 100) if len(x) > 1 else 0, raw=True).round()

# TradingView Default Settings
def main(df, lenrsi=3, lenupdown=2, lenroc=100):
    src = df['close']
    rsi = pp.rsi(src, lenrsi)
    updown_rsi = pp.rsi(updown(src), lenupdown)
    percentrank = percent_rank((100 * (src - src.shift(1)) / src.shift(1)), lenroc)
    df['crsi'] = ((rsi + updown_rsi + percentrank) / 3).round(2)
    
    return df

print(main(df))

트레이딩뷰 차트와 비교