카테고리 없음

RSI 상대강조지수 계산 및 롱/숏 전략 테스트

needmorecaffeine 2023. 1. 30. 17:05

"금융 파이썬 쿡북 Ch2. 파이썬에서의 기술적 분석 "의 내용을 기반으로 작성하였습니다. (실습 깃헙)

 


1. RSI란?

 

 RSI (relative strength index)란 자산의 종가를 사용해 매도 / 매수 조건을 식별하는 지표이다.

가장 일반적으로 RSI는 14일 기간을 사용해 계산되면 0부터 100까지의 규모(oscilator)로 측정된다.

거래자는 일반적으로 과매도(RSI < 30) 시 매수하고, 과매수(RSI >= 70) 시 매도한다.

80-20과 같은 보다 극단적인 고/저레벨은 덜 사용되며 동시에 더 강한 모멘텀을 사용하는 것을 의미한다.

 


2. 기본 전략

 이 글에서 구현할 단순 거래 전략은 다음과 같다.

  • 롱이나 숏 포지션을 취할 수 있다.
  • RSI를 계산하고자 14일 기간을 사용한다.
  • RSI가 하한 임계치(30)을 위쪽으로 교차 >> 롱 포지션 입력
  • RSI가 중간 레벨(50)보다 커짐 >> 롱 포지션 엑싯
  • RSI가 상한 임계치(70)을 아래쪽으로 교차 >> 숏 포지션 입력
  • RSI가 중간 레벨(50)보다 작아짐 >> 숏 포지션 엑싯
  • 한번에 하나의 포지션만 오픈할 수 있음

 


 

3. 구현

기본적인 내용은 이전 backtrader 백테스트에서 설명하였고 이번 글에서는 추가, 변경된 부분만 확인한다. (환경 세팅도 동일)

https://needmorecaffeine.tistory.com/21

 

단순이동평균(SMA)를 기반으로 전략 백테스팅

"금융 파이썬 쿡북 Ch2. 파이썬에서의 기술적 분석 "의 내용을 기반으로 작성하였습니다. (실습 깃헙) 1. 백테스팅이란? 과거데이터를 활용해 자신의 알고리즘, 투자전략 원칙을 검증하는 과정하

needmorecaffeine.tistory.com

 

# create a Stratey
class RsiSignalStrategy(bt.SignalStrategy):
    params = dict(rsi_periods=14, rsi_upper=70, 
                  rsi_lower=30, rsi_mid=50)

    def __init__(self):
        
        # add RSI indicator
        rsi = bt.indicators.RSI(period=self.p.rsi_periods,
                                upperband=self.p.rsi_upper,
                                lowerband=self.p.rsi_lower)

        # add RSI from TA-lib just for reference 
        #bt.talib.RSI(self.data, plotname='TA_RSI')
    
        # long condition (with exit)
        ## CrossUp = 첫번째 가격이 각각 상위 또는 하위 RSI 임계치를 초과한 경우 1을 반환
        rsi_signal_long = bt.ind.CrossUp(rsi, self.p.rsi_lower, plot=False)
        self.signal_add(bt.SIGNAL_LONG, rsi_signal_long)
        ## exit을 위해 음수값으로 설정
        self.signal_add(bt.SIGNAL_LONGEXIT, -(rsi > self.p.rsi_mid))

        # short condition (with exit)
        ## 숏 포지션을 위해 음수 추가
        rsi_signal_short = -bt.ind.CrossDown(rsi, self.p.rsi_upper, plot=False)
        self.signal_add(bt.SIGNAL_SHORT, rsi_signal_short)
        self.signal_add(bt.SIGNAL_SHORTEXIT, rsi < self.p.rsi_mid)
data = bt.feeds.PandasData(dataname=yf.download('META', '2018-01-01', '2018-12-31'))

cerebro = bt.Cerebro(stdstats = False) 

cerebro.addstrategy(RsiSignalStrategy)
cerebro.adddata(data)
cerebro.broker.setcash(10000.0)
cerebro.broker.setcommission(commission=0.001)
cerebro.addobserver(bt.observers.BuySell)
cerebro.addobserver(bt.observers.Value)

cerebro.run()

%matplotlib inline

configure_plotly_browser_state()
init_notebook_mode(connected=True)

# 진짜 해결하기 드럽게 힘드네,,, java 코드 지원 안되는 오류 아래 두 라인으로 해결
plt.rcParams['figure.figsize'] = [15, 12]
plt.rcParams.update({'font.size': 12}) 

# 결과 도면 표시
cerebro.plot(iplot = False, volume = False)

 

 그래프는 삼각형을 쌍으로 살펴보면 된다.

첫번째는 초록색 윗방향 삼각형이 등장하는데 포지션이 오픈되는 것이다.

다음 삼각형에서 바로 빨간색 아랫방향 삼각형 (이전 삼각형과 반대 색상 및 방향)이 등장하는데 이는 포지션을 클로즈하는 것을 의미한다.

 

 또한 차트 아래의 RSI와 포지션의 오픈과 클로즈를 매칭시킬 수 있다.

 

 그리고 같은 색상의 삼각형이 연속되어서 등장할 수 있는데 RSI 차트에서 포지션을 오픈하는 선 주위에서 변동하며 여러번 교차하기 때문이다. 하지만 포지션은 해당 연속 세트에서 첫번째 인스턴스에서만 열린다.

 


(해당 게시물 학습을 위한 임의적 설정이므로, 수익을 대변하지 않습니다.)

 

Ref

  • 금융 파이썬 쿡북, 에릭 르윈슨.