2. 투자지표를 활용한 매매 시점 모니터링 - RSI, RMI
투자지표(RSI, RMI) 파이썬 구현 및 자동매매 알고리즘 구현
우선 파이썬으로 주가 데이터를 수집하고, RSI, RMI를 산출해 조회를 할 수 있어야 한다.
지난 글에서 변동성 돌파 전략에 사용했던 코드와 동일하다.
import pandas as pd
import numpy as np
import datetime
import time
import FinanceDataReader as fdr
import copy
import matplotlib.pyplot as plt
필요한 패키지를 Import해준다.
price_data = fdr.DataReader("005930","2020-01-01")
price_data.head()
fdr 패키지를 이용해 삼성전자의 주가를 조회한다. 삼성전자의 종목코드를 입력하고, 시작 날짜를 입력하면 조회할 수 있다.
컬럼은 차례로 시가, 고가, 저가, 종가, 거래량, 변화량이다.
나는 이중 종가를 이용해 RSI, RMI를 계산하고자 한다.
우선 종가를 이용한 plot을 보자.
plt.figure(figsize=(15,7))
plt.title("삼성전자")
price_data.Close.plot()
plt.ylabel("Price")
plt.show()
그래프를 보니 삼성전자가 단기간에 급등한 것이 보인다. (저때 팔고 나왔더라면..)
삼성전자의 종가를 이용해 RSI, RMI를 계산해보자.
def rsi(ohlc: pd.DataFrame,y_label, period: int = 14):
delta = ohlc[y_label].diff()
ups, downs = delta.copy(), delta.copy()
ups[ups < 0] = 0
downs[downs > 0] = 0
AU = ups.ewm(com = period-1, min_periods = period).mean()
AD = downs.abs().ewm(com = period-1, min_periods = period).mean()
RS = AU/AD
return pd.Series(100 - (100/(1 + RS)), name = "RSI")
def rmi(ohlc: pd.DataFrame,y_label, period: int = 14):
delta = ohlc[y_label].diff(periods = 5)
ups, downs = delta.copy(), delta.copy()
ups[ups < 0] = 0
downs[downs > 0] = 0
AU = ups.ewm(com = period-1, min_periods = period).mean()
AD = downs.abs().ewm(com = period-1, min_periods = period).mean()
RM = AU/AD
return pd.Series(100 - (100/(1 + RM)), name = "RMI")
위의 함수가 RSI를 계산하는 함수, 아래가 RMI를 계산하는 함수이다.
※ 한 가지 참고할 사항이 있다. 위의 식대로 계산하는 RSI는 네이버과 동일하고 KB증권 기준과는 다르다. 각 증권사 별 계산식이 다르다고하니 참고 바란다.
RSI_df = rsi(price_data, "Close",14)
RMI_df = rmi(price_data, "Close",14)
price_data["RSI"] = RSI_df
price_data["RMI"] = RMI_df
수집된 삼성전자의 데이터에 종가인 Close를 입력하고 기간 14일로 설정하면 지표값이 계산이 된다.
RSI 기준 14일 기준이기 때문에 최초 수집된 일자의 15일째 되는 날부터 값이 생성이 된다.
plt.figure(figsize=(15,7))
plt.title("삼성전자")
plt.plot(price_data['RSI'], label='RSI',color = "tab:green",alpha = 0.5)
plt.plot(price_data['RMI'], label='RMI',color = "tab:orange",alpha = 0.5)
plt.legend(loc = "best")
plt.show()
계산된 RSI, RMI 지표이다.
20년부터 약 3년간의 지표값을 나타냈기 때문에 변동이 심해 보인다.
각각의 지표를 주가와 같이 확인해보자
price_data["lower"] = 30
price_data["upper"] = 70
fig, ax1 = plt.subplots(figsize = (15,7))
ax1.set_ylabel('Price')
ax1.plot(price_data["Close"],color = "red",alpha = 1, zorder=3)
ax2 = ax1.twinx()
ax2.plot(price_data["RSI"],color = "green",alpha = 0.5)
ax2.plot(price_data["lower"] ,color = "tab:blue",alpha = 0.3)
ax2.plot(price_data["upper"],color = "tab:red",alpha = 0.3)
plt.legend(["RSI"],loc = 'best')
plt.title("삼성전자")
plt.show()
RSI의 매매 기준이 되는 값인 30과 70에 대해 기준선을 같이 표시했다.
한 번씩 매수선과 매도선을 넘는 것이 보인다. 코로나가 터졌을 시점인 20년 3월 경에는 RSI값이 20 이하로 떨어져 매수 신호가 나타나고 있고, 주가가 최고에 달했을땐 RSI값이 90에 근접해 아주 강하게 매도 신호를 보내고 있는 것을 볼 수 있다.
물론 RSI가 후행지표의 성격을 가지고 있지만, 이렇게 보면 참고할 가치가 매우 높아 보인다.
최고점을 찍은 후에는 약 8개월 간 RSI값이 30과 70 사이에서 머무는 것을 볼 수 있다. 그 후에 매수신호만 간간이 나오는 데, 여기서 RSI의 한계를 보여준다. 주가가 한없이 추락하게 될 경우 계속해서 매수 신호가 나오기 때문에 본의 아니게 물타기가 되는 양상으로 간다. 따라서 다른 지표와 같이 보거나 종목 분석이 필요하다는 이유이다.
다음으로 RMI를 확인해보자.
fig, ax1 = plt.subplots(figsize = (15,7))
ax1.set_ylabel('Price')
ax1.plot(price_data["Close"],color = "red",alpha = 1, zorder=3)
ax2 = ax1.twinx()
ax2.plot(price_data["RMI"],color = "orange",alpha = 0.5)
ax2.plot(price_data["lower"] ,color = "tab:blue",alpha = 0.3)
ax2.plot(price_data["upper"],color = "tab:red",alpha = 0.3)
plt.legend(["RMI"],loc = 'best')
plt.title("삼성전자")
plt.show()
RMI의 경우 전날 가격 기준이 아닌 5일 전 가격과 비교하기 때문에 변동 폭이 더 크지만, 진동이 적다.
RSI와 RMI를 같이 비교해보자.
fig, ax1 = plt.subplots(figsize = (15,7))
ax1.set_ylabel('Price')
ax1.plot(price_data["Close"],color = "red",alpha = 1, zorder=3)
ax2 = ax1.twinx()
ax2.plot(price_data["RSI"],color = "green",alpha = 0.5)
ax2.plot(price_data["RMI"],color = "orange",alpha = 0.5)
ax2.plot(price_data["lower"] ,color = "tab:blue",alpha = 0.3)
ax2.plot(price_data["upper"],color = "tab:red",alpha = 0.3)
plt.legend(["RSI","RMI"],loc = 'best')
plt.title("삼성전자")
plt.show()
초록색 선이 RSI, 주황색 선이 RMI이다.
RSI로는 매수 신호가 나타나지 않지만, RMI에는 매수 신호가 나타나는 구간이 여럿 보인다. 그 반대인 매도 신도도 마찬가지이다. 이 경우에는 단기적인 매매로 활용 가능할 듯싶다.
RMI는 급변하는 주가에 대한 대응하기 좋고, 매매 시그널 포착된다. 하지만, 여전히 하락장에서는 매수신호가 지속적으로 나는 것을 볼 수 있다.
여기까지 파이썬으로 RSI와 RMI를 구현하고 삼성전자를 대상으로 간단하게 지표 분석을 해보았다.
RSI지표도 매매시점에 대한 참고 지표로 활용이 가능하다 판단이 되어 자동 매매로 활용했을 땐 얼마나 수익성을 낼 수 있는지 테스트해보고자 한다. 또한, 전략을 바꿔가면서(매매 기준 값 변경) 접근했을 때 수익성이 어떻게 달라지는 지도 확인하면서 투자 전략을 세우고자 한다.