이번에는 Python으로 RSI(Relative Strength Index)을 계산해보겠습니다.
먼저 RSI의 의미를 간단히 알아보면 아래와 같이 정의할 수 있습니다.
RSI
(Relative Strength Index)는 주식, 선물, 옵션 등의 기술적 분석에 사용되는 보조지표이다. RSI는 가격의 상승압력과 하락압력 간의 상대적인 강도를 나타낸다. 1978년 미국의 월레스 와일더(J. Welles Wilder Jr.)가 개발했다.
-출처:위키백과-
요약해 말하면 일정기간 동안 가격 상승폭과 하락폭 중 어느 쪽이 더 높냐를 나타내는 것으로 0에 가까울 수록 하락 강도가 강하다는 뜻이고 반대의 경우는 상승 강도가 강하다는 뜻입니다.
이런 의미를 가진 RSI 계산 방법은 이렇습니다.
- 가격이 전일 가격보다 상승한 날의 상승분은 U(up) 값이라고 하고,
- 가격이 전일 가격보다 하락한 날의 하락분은 D(down) 값이라고 한다.
- U값과 D값의 평균값을 구하여 그것을 각각 AU(average ups)와 AD(average downs)라 한다.
- AU를 AD값으로 나눈 것을 RS(relative strength) 값이라고 한다. RS 값이 크다는 것은 일정 기간 하락한 폭보다 상승한 폭이 크다는 것을 의미한다.
- 다음 계산에 의하여 RSI 값을 구한다.
즉 요약하면,
U = 전일 주가가 비교 대상 주가 보다 상승했을 때 상승폭
D = 전일 주가가 비교 대상 주가 보다 하락했을 때 하락폭
AU = 일정 기간동안 U의 평균
AD = 일정 기간동안 D의 평균
RS = AU / AD
RSI = AU / (AU+AD) * 100
RSI 시그널 = RSI의 이동평균선
여기서 AU, AD 계산에서 사용하는 기간은 RSI 개발자인 Welles Wilder의 말을 따라 14일로 설정하여 계산하겠습니다.
또 RSI 시그널이라함은 RSI의 이동평균선으로 9일 이동편균선을 이용 사용하겠습니다.
RSI의 사용처는 과매수, 과매도를 파악하는데 있지만 개발된지 오래된 지표로 현대 주식시장에 적용시켜 곧이 곧대로 믿기에는 무리가 있어 Failure Swing, Divergence 와 같은 보조 장치를 활용해야 한다고 합니다. 이에 대한 자세한 내용은
http://www.ssfutures.com/download/pdf/index/RSI.pd에 있습니다.
마지막으로 위에 적어둔 계산 공식을 이용하여 강원랜드의 2019-10-01 ~ 2019-11-6 동안에
RSI를 구하는 파이썬 코드를 첨부합니다.
import numpy as np
import pandas as pd
import pandas_datareader.data as web
import datetime
start=datetime.datetime(2019, 10, 1)
end=datetime.datetime(2019, 11, 6)
stock_ds = web.DataReader('035250.KS', "yahoo", start, end)
date_index = stock_ds.index.astype('str')
def calcRSI(df, period):
U = np.where(df.diff(1)['Close'] > 0, df.diff(1)['Close'], 0) #df.diff를 통해 (기준일 종가 - 기준일 전일 종가)를 계산하여 0보다 크면 증가분을 감소했으면 0을 넣어줌
D = np.where(df.diff(1)['Close'] < 0, df.diff(1)['Close'] *(-1), 0) #df.diff를 통해 (기준일 종가 - 기준일 전일 종가)를 계산하여 0보다 작으면 감소분을 증가했으면 0을 넣어줌
AU = pd.DataFrame(U, index=date_index).rolling(window=period).mean() #AU, period=14일 동안의 U의 평균
AD = pd.DataFrame(D, index=date_index).rolling(window=period).mean() #AD, period=14일 동안의 D의 평균
RSI = AU / (AD+AU) * 100 #0부터 1로 표현되는 RSI에 100을 곱함
return RSI
stock_ds.insert(len(stock_ds.columns), "RSI", calcRSI(stock_ds,14)) #web.DataReader를 통해 받았던 원래 DataFrame에 'RSI'열을 추가
stock_ds.insert(len(stock_ds.columns), "RSI signal", stock_ds['RSI'].rolling(window=9).mean()) #RSI signal(RSI 이동평균)을 구해서 추가함
print(stock_ds) #print로 잘 들어갔는지 출력
아래는 RSI를 이용한 트레이딩 전략 백테스팅 결과입니다!
2019/12/08 - [Python/Stock] - Python, Backtrader로 전략검증, RSI 이용한 매매 전략 백테스팅(BackTesting)
같이 읽어보면 좋은 글
2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
'파이썬 > 주식' 카테고리의 다른 글
Python으로 종목코드(코스피/코스닥) 엑셀로 저장/읽기 (3) | 2019.11.17 |
---|---|
Python으로 보조지표 MACD 구하기 MACD Oscillator 구하기 (0) | 2019.11.10 |
Python으로 볼린저밴드 Bollinger Bands 보조지표 계산 (2) | 2019.11.03 |
Python으로 캔들스틱 차트 Candlestick chart 그리기 (5) | 2019.11.02 |
Python으로 주가 이동평균선 그리기 (0) | 2019.10.29 |
댓글