본문 바로가기
파이썬/주식

Python으로 RSI(Relative Strength Index) 구하기

by 행복론자 2019. 11. 6.

이번에는 Python으로 RSI(Relative Strength Index)을 계산해보겠습니다. 

먼저 RSI의 의미를 간단히 알아보면 아래와 같이 정의할 수 있습니다. 

RSI
(Relative Strength Index)는 주식, 선물, 옵션 등의 기술적 분석에 사용되는 보조지표이다. RSI는 가격의 상승압력과 하락압력 간의 상대적인 강도를 나타낸다. 1978년 미국의 월레스 와일더(J. Welles Wilder Jr.)가 개발했다.

-출처:위키백과-

 

요약해 말하면 일정기간 동안 가격 상승폭과 하락폭 중 어느 쪽이 더 높냐를 나타내는 것으로 0에 가까울 수록 하락 강도가 강하다는 뜻이고 반대의 경우는 상승 강도가 강하다는 뜻입니다.

 

이런 의미를 가진 RSI 계산 방법은 이렇습니다.

  1. 가격이 전일 가격보다 상승한 날의 상승분은 U(up) 값이라고 하고,
  2. 가격이 전일 가격보다 하락한 날의 하락분은 D(down) 값이라고 한다.
  3. U값과 D값의 평균값을 구하여 그것을 각각 AU(average ups)와 AD(average downs)라 한다.
  4. AU를 AD값으로 나눈 것을 RS(relative strength) 값이라고 한다. RS 값이 크다는 것은 일정 기간 하락한 폭보다 상승한 폭이 크다는 것을 의미한다.
  5. 다음 계산에 의하여 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)

 

Python, Backtrader로 전략검증, RSI 이용한 매매 전략 백테스팅(BackTesting)

Backtesting 백테스팅(Backtesting)이란 과거 데이터를 바탕으로 개발된 알고리즘을 검증하는 것을 의미합니다. 이를 쉽게 할 수 있도록 해주는 Zipline, TA-lib, Backtrader 라이브러리가 있습니다. 이번 포스

jsp-dev.tistory.com


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글