"금융 파이썬 쿡북 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
# 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
- 금융 파이썬 쿡북, 에릭 르윈슨.