주식,가상화폐 보조지표 (파이썬 소스)

[보조지표 3] RSI with 파이썬

NAKYUP 2021. 1. 31. 11:01

 

 

스토캐스틱과 함께 대표적인 모멘텀 지표로 알려져 있는 RSI(Relative Strength Index)을 살펴보겠습니다. RSI는 현재 가격의 상승 압력과 하락 압력 간의 상대적인 강도를 나타내는 기술적 지표입니다.

RSI는 1978년 Welles Wilder라는 사람이 가격의 상승과 하락 추세에서 상승 폭과 하락 폭을 계산하여 그 강도를 백분율로 계산해 현재 가격의 상태를 평가하고자 만든 기술적 지표입니다. 

스토캐스틱과 마찬가지로 ‘과매수’와 ‘과매도’ 상태를 판단하기 용이한 보조지표로써 일정 기간 동안 가격의 전일 대비 상승 분 또는 하락 분의 평균 값을 구하여 상승 분 평균이 크면 과매수, 하락 분 평균이 크면 과매도 상태로 판단합니다.

 

RSI 공식

RSI = (n일 동안의 종가 상승 분 평균(AU))/(n일 동안의 종가 상승 분 평균(AU)+ n일 동안의 종가 하락 분 평균(AD)) × 100

 

U(up): n일 동안의 종가 상승 분

D(down): n일 동안의 종가 하락 분

AU(average ups): U값의 평균

DU(average downs): D값의 평균

 

n값의 기본값은 14일입니다. Welles Wilder이 사용할 것을 권유한 값이며, 이외에도 9일, 15일, 25, 28일 등을 많이 사용합니다.

파이썬으로 RSI 지표를 구현해보고, 그래프로 출력해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 상승, 하락분을 알기위해 현재 종가에서 전일 종가를 빼서 데이터프레임에 추가하겠습니다.
RSI_n=14
df["등락"]=[df.loc[i,"종가"]-df.loc[i-1,"종가"if i>0 else 0 for i in range(len(df))] 
# i가 0일때는 전일값이 없어서 제외함, i는 데이터프레임의 index값
 
# U(up): n일 동안의 종가 상승 분
df["RSI_U"]=df["등락"].apply(lambda x: x if x>0 else 0)
 
# D(down): n일 동안의 종가 하락 분 --> 음수를 양수로 바꿔줌
df["RSI_D"]=df["등락"].apply(lambda x: x * (-1if x<0 else 0)
 
# AU(average ups): U값의 평균
df["RSI_AU"]=df["RSI_U"].rolling(RSI_n).mean()
 
# DU(average downs): D값의 평균
df["RSI_AD"]=df["RSI_D"].rolling(RSI_n).mean()
 
df["RSI"= df.apply(lambda x:x["RSI_AU"]/(x["RSI_AU"]+ x["RSI_AD"]) * 100,1)
 
#df[["등락","RSI_U","RSI_D","RSI_AU","RSI_AD","RSI"]].fillna(0, inplace=True)
 
# RSI값이 30 이하일 때 매수, 80 이상일 때 매도하도록 설정해보겠습니다. 
# 좀 더 최적화된 값은 다음 시간에 찾아보께요.
df["RSI_sign"]=df["RSI"].apply(lambda x: "매수" if x<20 else ("매도" if x>80 else "대기"))
 
df[['RSI']].plot.line(subplots=False, figsize=(15,5))
cs

 

 

 
반응형