본문 바로가기
Python

[Python] finterstellar를 사용하여 RSI로 주식 매매 시그널 만들기

by llHoYall 2021. 12. 9.

이번 포스팅에서는 finterstellar module을 사용하여 주가 정보를 얻고, RSI를 사용한 투자 전략을 적용하여 투자 성과를 분석해보겠습니다.

finterstellar module 설치

pip를 사용하여 간단히 설치할 수 있습니다.

$ pip install finterstellar

import finterstellar

사용을 위해 간단히 fs로 가져와 보겠습니다.

import finterstellar as fs

주가 정보 가져오기

다음의 메소드로 쉽게 가져올 수 있습니다.

get_price(종목 코드, 시작일, 종료일)

실제로, 엔비디아의 올해 주가 정보를 가져와 보겠습니다.

df = fs.get_price('NVDA', start_date='2021-01-01', end_date='2021-11-30')

차트 그리기

finterstellar module은 차트를 그릴 수 있는 메소드를 내장하고 있습니다.

별도의 모듈이 필요하지 않아서 편합니다. ^^

draw_chart(데이터, 좌측 y축에 표시할 값, 우측 y축에 표시할 값, 로그 여부=False)

실제로 그려보겠습니다.

fs.draw_chart(df, left='NVDA')

훌륭합니다. 개인적으로 몇 주 없어서 아쉽긴 하지만 수익률은 정말 좋은 효자주~!!

RSI (Relative Strength Index)

상대강도지수란 일정 기간동안의 상승폭과 하락폭에대한 상대비율을 시장의 과매수 혹은 과매도로 표현한 지표입니다.

즉, 현재의 시장이 강한 매수세인지 강한 매도세인지를 비율로 확인할 수 있습니다.

기본적으로 14일간의 데이터를 사용합니다.

 

주가의 변동폭을 사용하는 RSI는 이동평균선을 사용하는 MACD, 평균 주가를 사용하는 Stochastic과 함께 대표적인 보조지표입니다.

수식에 의해 RSI는 0~100 사이의 값을 갖습니다.

14일간 매일 상승한다면 100, 매일 하락한다면 0이 되는것이죠.

보통 70을 과열, 30을 침체로 봅니다.

 

finterstellar는 이또한 간단하게 사용할 수 있어요.

rsi(데이터, 기간)

그럼 엔비디아에 적용을 해봐야겠죠?

fs.rsi(df, w=14)
fs.draw_chart(df, left='NVDA', right='rsi')

분석자료로 활용하실 수 있겠죠? ㅎㅎ

백테스팅

이제 이 데이터를 활용하여 실제로 매매 전략을 세워서 투자를 해볼까요?

indicator_to_signal(데이터, 지표, 매수 기준값, 매도 기준값)

finterstellar에서 제공하는 위의 메소드를 사용하면 간단하게 매매 시그널이 만들어 집니다.

 

다음으로 실제 매매를 확인해봐야겠죠?

position(데이터)

이 메소드는 위에서 만든 매매 시그널대로 매수/매도 position을 계산해 줍니다.

 

fs.indicator_to_signal(df, factor='rsi', buy=40, sell=70)
fs.position(df)
fs.draw_chart(df, left='position_chart', right='rsi')

우리의 전략을 사용하니 3번의 매매가 발생했네요.

확실히 장기 상승추세에 있을때는 RSI만 활용해서는 높은 수익을 내기 힘든 거 같아요.

 

이제, 수익률을 계산해봐야겠죠?

evaluate(데이터, 매매 비용)

실제 데이터를 넣어보겠습니다. 제가 이용하는 증권사의 경우 수수료가 0.25% 이더라고요.

fs.evaluate(df, cost=.0025)
fs.draw_chart(df, left='NVDA', right='acc_rtn_dp')

재밌죠? 실제 주가에 의해 보유기간동안 영향을 받고 있습니다. ㅎㅎ

투자 성과분석

마지막으로 투자 성과를 분석해 봅시다.

performance(데이터, 무위험이자율)

무위험이자율이란 위험이 없는 순수한 투자의 기대수익률을 의미하며, 정기 예금, 국채 등의 이자율에 해당합니다.

투자 성과 측정 지표 중 하나인 샤프 비율을 구하기 위해 입력을 합니다.

무위험 이자율을 1%로 하여 코드를 돌려보겠습니다.

fs.performance(df, rf_rate=.01)

가볍게 살펴보겠습니다.

CAGR (Compound Annual Growth Rate)

연평균 수익률을 말하며, 누적 수익률을 연평균으로 환산하여 구할 수 있습니다.

Accumulated Return

전체 기간동안의 누적수익률 입니다.

확실히 효자종목답게 어마어마한 수익률을 보여주네요.

Average Return

건별 수익률의 평균값 입니다.

Benchmark Return

해당 기간 동안 매매를 하지 않고 보유를 했다고 가정했을 때의 수익률 입니다.

엔비디아의 경우 올해는 올해 시작할 때 사서 갖고만 있었어도 수익률이 엄청납니다.

상대적으로 RSI를 사용한 전략이 수익률이 떨어지네요.

Number of Trades

해당 기간동안 발생한 총 매매 횟수입니다.

Number of Win

전략이 성공한 횟수 입니다.

Hit Ratio

전략이 성공한 비율입니다.

쭈욱 상승하던 종목이라 대충 전략 짜도 100% 성공을 했을 거 같네요. ㅋㅋㅋ

Investment Period

총 투자 기간입니다.

Sharp Ratio

샤프 비율은 위험 대비 수익이 얼마인지를 표시하는 지표입니다.

MDD (Maximum Draw Down)

최대 낙폭입니다. 다시 말해, 투자기간 중 입을 수 있는 최대 손실을 의미합니다.

Benchmark MDD

주식을 계속 들고있었을 경우의 최대 손실을 말합니다.

 

우리 전략을 평가해보면 그냥 들고있던 것보다 못한 수익률을 보여줬지만, 기간 내 낙폭이 적어 좀 더 안전한 방법이었다... 할 수 있겠네요.

맺음말

이번 포스팅에서는 finterstellar를 사용하여 주가 정보를 얻고 내장 메소드들을 사용하는 방법에 대해 가볍게 살펴보았습니다.

또, RSI를 활용한 투자 전략을 세워 적용해보고, 과거의 데이터에 적용해 투자 성과를 분석해 보기도 하였습니다.

RSI는 보통 평균회귀 기법으로 평가되고 박스권 횡보를 보이는 종목에 더 적합하다는 평가를 받습니다.

실제 투자시에는 당연히 지표 하나만 사용하는 사람은 없겠지만, 참고 지표 중 하나로 잘 활용해 보시기 바랍니다.

'Python' 카테고리의 다른 글

[Python] Getting Started with Kaggle  (0) 2021.12.11
[Python] finterstellar를 사용하여 MACD로 주식 매매 시그널 만들기  (0) 2021.12.10
[Python] Singleton Pattern  (0) 2021.11.02
[Python] String  (0) 2021.10.31
[Python] Testing  (0) 2021.10.30

댓글