Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI)

마지막 업데이트: 2022년 6월 15일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
상대강도지수(RSI)를 이용한 매매시점 분석 (출처: 방송대 경제학과, 재테크와 금융투자)

상대강도지수(RSI)

오늘은 요즘 많은 트레이더들이 유용하게 사용하는 RSI와 해당 지표의 한계점에 대해서 알려드리겠습니다. 또한 본 한계점을 극복하기 위해 저희 개발팀이 최근에 개발한 RSI 클라우드 지표에 대해서 소개해드리겠습니다.

RSI , Relative Strength Index (상대강도지수)는 1978년에 웰레스 월더라는, 저처럼 원래는 Engineer(공학자)였지만 기술적분석이라는 학문에 푹 빠져 이쪽 분야로 발을 돌린 한 학자에 의해 개발됐습니다. 해당 지수는 주가의 상승/하락 압력 간의 상대적인 강도를 보여주는 보조지표로 추세의 강도세를 백분율로 표기해줍니다.

본 공식에서 N은 RSI의 민감도를 조절하는 Parameter(설정값)로 보편적으로 Default(기본)값인 14, 조금 덜 민감한 값으로는 25가 사용됩니다. RSI의 단위는 %로 과매수 구간은 70~80%, 과매도 구간은 20~30%으로 사용됩니다. 즉 RSI가 70~80% 이상일 때 강세 혹은 과매수, 20~30%일 때 약세 혹은 과매도라고 판단할 수 있습니다.

하지만 아쉽게도 이 RSI도 크나큰 한계점이 존재합니다. 해당 지수가 산정될 때 사용하는 소스값은 Closed, 즉 캔들의 종가로, 고가와 저가가 지수에 반영되지 않습니다. 즉 캔들의 꼬리는 해당 지수에 고려되지 않는다는 점입니다. 요즘에 누가 캔들 종가만 보고, 혹은 라인차트로만 매매하나요? 이 미친 스캠무빙이 툭하면 나오는데 종가만 가지고 매매하면 골로가는 건 다들 아실 거라 생각합니다. 요즘처럼 고변동성의, 툭하면 길고 뾰족한 꼬리들이 난무하는 현대 금융 시장에 적용시키기엔 문제가 너무 많습니다.

게다가 요즘에 너무나도 많은 개인투자자들이 RSI 지표를 사용합니다. 모두가 같은 자리, 같은 기법, 혹은 같은 지표를 쓰면 어떻게 된다고 했죠? 제가 매번 강조 드렸듯이 3~5% 개미 생존률은 불변의 법칙입니다. 모두가 롱을 외치면 숏자리를 찾아야하고 모두가 숏을 외치면 롱자리를 찾는 소수의 개미들이 살아남는 이 고난이도 금융시장에 살아남기 위해서는 통찰력과 높은 안목을 지닌 투자자가 되어야한다고 제가 누누이 강조 드렸습니다.

이 문제를 해결하고자 최근 저희 팀은 캔들의 모든 가격들을 RSI지표에 반영시키기 위해, 그리고 종가를 기준이 아닌 다른 기준으로 다이버전스를 모색하는 매우 다양한 시도들을 해왔습니다.

수많은 연구, 실험 및 고찰 끝에 마침내 캔들의 모든 가격을 반영하는 RSI 지표를 만들고 말았습니다. 이름하여 RSI 클라우드! RSI를 하나의 라인이 아닌 범위로 표기를 함으로써 조금 더 보수적이고 정확하게 강도지수를 파악할 수 있게 되었습니다. 본 지표는 일목구름과 마찬가지로 RSI를 하나의 선이 아닌 구름대로 해석하시면 됩니다.

다수의 라인(라인들의 범주를 구름으로 표기함)으로 구성된 이 지표는 고려하는 모든 선들이 과매수/과매도 구역에 진입해야 과열로 간주함으로써 더 보수적으로 확실한 과열 상황들을 포착할 수 있습니다. 그리고 해당 지표에 평행 채널 및 추세선들이 기가 막히게 잘 들어맞습니다. 주가에 추세선/채널 작도하는 것처럼 활용하시면 됩니다. 이탈 방향 나올 때, 그리고 심지어 이탈 이후 리테스트도 나옵니다.

또한 다이버전스 역시 종가가 아닌 캔들의 평균값을 사용하여 시그널이 나오게끔 했습니다. 때문에 중간중간에 긴 꼬리들 혹은 말도 안되는 무빙이나 노이즈들로 발생되는 주가 <->지표 다이버전스의 괴리감을 최소화시켰습니다. 이 또한 자동으로 다이버전스를 잡도록 로직을 짰으니 상승/하락세의 과열이 점차 해소되기 시작할 때, 즉 변곡 잡으실 때 매우 유용하게 사용하실 수 있습니다.

물론 당연한 말이지만 이 지표 하나만 가지고 매매를 하면 안되겠죠? 본인만의 여러 기법 및 지표들의 튼튼한 조합을 구성할 때 하나의 기준으로써 참고를 해야합니다.

아래는 비트코인이 아닌 선물과 주식 차트입니다. 해당 차트들은 예전 차트도 아닌 최근 차트입니다. 이와 같이 종목/상품과 타임프레임을 불문하고 다 잘 맞습니다.

상대강도지수(RSI)

이번 글은 python을 이용하여 매매에 있어서 참고할 수 있는 보조지표를 구현해보겠습니다. 보조지표대로 매매를 해서 부자가 되면 좋겠습니다만 절대 만능이 아닙니다. 매매를 하다 보면 절대 마법공식이라는 것이 존재하지 않기 때문입니다. 하지만 의사결정하는데 있어 참고 정도만 하는 데에는 도움이 될 수 있습니다. 많이 지표들 중 가장 직관적으로 활용하기 좋은 RSI(Relative Strength Index)를 소개하고 비슷한 지표인 MFI(Money Flow Index)와 CCI(Commodity Channel Index)를 다루어보도록 하겠습니다. 지표에 대한 정말 디테일한 개념은 Reference만 남기도록 하고, 여기 글에서는 Dataframe을 부르고 나서 사용자함수로 어떻게 구현하는지 보여드릴 예정입니다.

데이터 부르기

사용할 데이터는 아래 글에서의 코드를 참고하려고 합니다.

15분 데이터 최근 20봉을 조회하면 다음과 같습니다.

위의 Dataframe의 close(종가)가격과 차트 상에서 8월 27일 17시 종가 가격이 같음을 알 수 있습니다.

RSI 공식 (Disnat)

RSI(Relative Strength Index) 개념 및 정의는 이 글을 참고하면 됩니다. 일반적으로 70이 넘으면 과매수 구간이고, 30 아래를 밑돌면 매도 국면이라고 익히 알려져 있습니다.

아래와 같이 코드를 구현합니다.

보통 기간(period)은 14일을 기준으로 두고 계산하기 때문에 14일을 기준으로 계산하면 아래와 같습니다.

붉은색 동그라미 값과 위의 Dataframe에서의 8월 27일 rsi 값과 같음을 알 수 있습니다.

RSI는 가격에만 초점을 맞추지만 여기에 거래량까지 반영한 모멘텀 지표로는 MFI(Money Flow Index)가 있습니다. 개념글로는 이 글을 참고 하면 됩니다. 20 아래에 하락국면, 80 이상이면 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 상승국면으로 이야길 하곤 합니다. 구현하는 코드는 아래와 같습니다.

CCI(Commodity Channel Index)는 주가와 이동평균의 차이를 측정하는 보조지표로써 이격을 바탕으로 과매수와 과매도를 판단합니다. CCI가 높다는 것은 이동평균의 주가보다 현재 주가가 높다는 뜻입니다. 이동평균을 바탕으로 계산하기 때문에 RSI, MFI보다 더욱 쉽게 계산을 할 수 있습니다. 개념에 대한 글은 이 글을 참고하면 될 것 같습니다. 구현하는 코드는 아래와 같습니다. 기간은 14일 대신 9일을 기본 값으로 설정하여 사용했습니다.

마무리 & Reference

모든 보조지표들은 참고만 하는 것이 좋지, 한계가 반드시 존재하며 잘못된 시그널일 수 있음을 반드시 유의하셔야 합니다. 또한 코드는 구글링 하면서 직접 구현해도 좋고, 다른 사람들이 짜놓은 것을 활용하는 것이 좋습니다. 또한 설치가 까다롭지만 약 200개의 Indicator들을 활용할 수 있는 Ta-Lib라는 Library도 있는데 참고하시면 될 것 같습니다.

참고한 자료들은 다음과 같습니다.

04 RSI | NANUM TRADING

RSI를 이용한 매매 Welles Wilder는 RSI가 70%를 웃돌면 초과매수 국면으로, 30%를 밑돌면 초과매도 국면으로 규정하였습니다. 따라서 RSI가 70%를 넘어서면 매도, 30% 밑으로 떨어지면 매수 포지션을 취하

[제태크와 금융투자] ⑫-5 증권분석 - 기술적 분석: 상대강도지수/투자심리도/이격도/필터기법

상대강도지수(RSI)를 이용한 매매시점 분석 (출처: 방송대 경제학과, 재테크와 금융투자)

상대강도지수, Beginner Guide to the Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) RSI Indicator (Youtube : Trading 212)

2. 투자심리도 (Psychological level)

투자심리도란 : 일정기간을 대상으로 주식의 인기, 즉 과열 및 침체의 정도를 파악하는 지표

투자심리도 = Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) $(N일간의 전일대비 상승일수)/N × 100$(%)

투자심리도를 이용한 매매기법

  • 투자심리도 > 75% → 매도시점
  • 투자심리도 < 25% → 매입시점
  • 대용기법 : 투자심리도가 75% 이상에서 그 이하로 내려가는 시점을 매도시점으로, 25% 이하에서 그 이상으로 올라가는 시점을 매입시점으로 선정

투자심리도를 이용한 매매시점 분석 (출처: 방송대 경제학과, 재테크와 금융투자)

투자심리도 - 지지와 저항, Beginners Guide To SUPPORT & RESISTANCE (Youtube : The Trading Channel)

3. 이격도 (Disparity Index)

당일의 주가 수준과 이동평균선 간의 간격을 의미하는 것으로서, 당일의 주가를 이동 평균 주가로 나눈 비율

이격도 = 주가 ÷ 이동평균 × 100

이격도를 이용한 매매기법

  • 이격도 계산시 사용된 이동평균선의 유형과 주식 가격의 추세에 따라 달리 적용
  • 단기 이동평균선을 사용하는 경우
    • 상승추세 : 98% 이하 → 매수신호 / 106% 이상 → 매도신호
    • 하락추세 : 92% 이하 → 매수신호 / 102% 이상 → 매도신호
    • 상승추세 : 98% 이하 → 매수신호 / 110% 이상 → 매도신호
    • 하락추세 : 88% 이하 → 매수신호 / 104% 이상 → 매도신호

    ※ 실제 주식 투자에서 이격도는 주식 종목에 따라 사용상 차이가 있으므로 종목 별로 매매 시점을 위한 이격도 수준을 찾는 것이 중요함

    이격도를 이용한 매매시점 분석 (출처: 방송대 경제학과, 재테크와 금융투자)

    이격도, Technical Analysis : Disparity Index (Youtube : Options A to Z - Facebook Trading Group)

    4. 필터기법 (Filter rule)

    주식 가격이 일정 기간 동안 최저 가격에서 일정 비율 이상으로 상승하면 매입하고, 반대로 최고가격에서 일정비율 이하로 하락하면 자동적으로 매도하는 투자기법

    필터(filter) : 주식의 매입과 매도를 결정하는 일정한 비율의 상승폭 혹은 하락폭 (금액 혹은 비율로 표현)

    • 필터기법은 투자자의 입장에서는 분석이 용이하고 투자 시점을 간단히 포착 가능할 수 있음
    • 필터의 크기를 결정하는 데 있어서 객관적인 기준이 없고 주관적인 경험에 의존할 수밖에 없다는 단점

    필터기법에 의한 매매시점 분석 (출처: 방송대 경제학과, 재테크와 금융투자)

    필터기법, Using Trend Filters to Filter Out Low-Probability Trading Signals (Youtube: Darwinex)

    기타의 기술적 분석에서 빈번하게 사용되는 지표에는 상대강도지수, 투자심리도, 이격도, 필터기법이 등이 있다. 이 중 이격도는 당일의 주가수준과 이동평균선 사이의 간격을 의미하며, 당일의 주가를 이동평균 주가로 나눈 비율로 측정된다. 주가수준과 이동평균선간의 간격이 어느 정도 떨이지면 주가는 그 간격을 줄이려는 경향이 있으므로, 이를 투자에 이용하려는 기법이다.

    Dipsy 의 백과사전

    이번시간에는 현재 추세의 강도를 토대로 언제 주가 추세가 전환될 것인가를 예측하는데 유용한 지표인 RSI( 상대강도지수 相對强度指數 , Relative Strength Index ) 에 대하여 알아보는 시간을 가져보도록 하겠습니다 .

    RSI 는 미국의 월레스 와일더 (J. Welles Wilder Jr.) 에 의해 개발된 주식 , 선물 , 옵션 등의 기술적 분석에 사용되는 보조지표로서 , 시장가격 변동폭 중에서 시장가격의 상승폭이 어느 정도인지를 분석하는 것으로 주가가 상승 추세일 경우 얼마나 강한 상승세인지 , 하락 추세라면 얼마나 강한 하락세인지를 나타내는 지표입니다 . RSI 는 추세의 강도를 객관적 수치로 표현하는 분석방법으로서 두 지수의 상대적인 역학관계를 설명하기보단 특정 종목의 내재된 움직임의 강도를 분석하여 향 후 움직임을 예측하는 방법입니다 . 최근에는 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 비트코인등의 가상화폐의 움직임을 분석하는데도 사용하는 투자자가 많습니다.


    가격의 추세전환을 포착하고자 하는 기술적 분석에 있어서 가장 어려운 것은 언제 추세가 전환되는가를 정확히 예측하는 것입니다 . 즉 현재의 추세강도를 객관적으로 나타내는 지표가 있다면 과도한 상승 추세시 매입을 자제할 수 있을 뿐 아니라 , 오히려 매도에 나설 수 있고 반면 과도한 하락 추세시 매도를 자제하고 도리어 매수에 나설 수 있는 등 매우 유용하게 사용될 수 있을 것입니다 . 바로 이러한 문제를 해결하기 위해서 RSI 에서는 현재 추세의 강도와 전환을 백분율로 나타내 표현을 하고 있습니다 . 유사한 지표로는 스토캐스틱 이 있는데 RSI 그래프의 형태는 fast stochastic 과 비슷하게 나옵니다 .

    RSI 지표의 계산은 차트에서 자동으로 해주지만 계산식을 보면 원리를 이해하는 데 도움이 되므로 계산식을 알아보도록 하겠습니다 .

    RS = [N 일간의 상승폭의 평균 (AU) / N 일간의 하락폭의 평균 (AD)]

    주어진 기간의 모든 날의 주가에 대해서 가격이 전일 가격보다 상승한 날의 상승분은 U(up) 값이라고 하고 , 가격이 전일 가격보다 하락한 날의 하락분은 D(down) 값이라고 합니다 . 그리고 U 값과 D 값의 평균값을 구하여 그것을 각각 AU(average ups) 와 AD(average downs) 라 부릅니다 .

    이때 AU 를 AD 값으로 나눈 것을 RS(relative strength) 값이라고 하는데 . RS 값이 크다는 것은 일정 기간 하락한 폭보다 상승한 폭이 크다는 것을 의미하게 됩니다 .

    이를 토대로 RSI 값을 아래와 같이 구할 수 있습니다 .

    RSI = 100 X [ RS/(1+RS)] = 100 X [ AU/(AU+AD)] = 100 – [100/(1+RS)]

    RSI 는 값을 구할 때 사용자가 기간을 설정할 수가 있습니다 . 이 기간 값을 짧게 사용할 수록 민감하게 움직이고 기간이 길수록 둔하게 움직이는데 , 월레스 와일더는 기본적으로 14 일 RSI 를 사용하라고 이야기하고 있습니다 . 그렇지만 9 일 , 25 일 RSI 도 일반적으로 사용되는 수치입니다 .

    일반적으로 14 일을 기준으로 할 때 RSI 의 값이 70 을 상회하면 과열 ( overbought ) 로 주가가 곧 하락한다고 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 판단하고 , 30 을 하회하면 침체 ( oversold ) 로 곧 상승할 것으로 판단하고 있습니다 . 9 일을 기준으로 하면 오실레이터 의 진동이 민감 해지므로 , 이 기준을 75 와 25 에 두어 사용하기도 합니다 .

    그리고 RSI 그래프는 이동평균선을 함께 나타내는 것이 보통입니다 . 이동평균선을 며칠선으로 할 것인가 역시 매개변수로 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 주어지며 , RSI 를 15 일에 대하여 구하고 5 일 이동평균선을 함께 표시하는 경우 그래프에 (15, 5) 라고 표시해주는 것이 일반적입니다 .

    이렇게 구한 RSI 는 아래와 같은 기준을 가지고 분석 및 투자에 활용할 수 있습니다 .

    RSI 값이 70 이상일 때는 과열국면으로 분석하고 RSI 값이 30 이하일 때는 침체국면으로 봅니다 . 따라서 RSI 가 70% 를 넘어서면 매도 포지션을 , 30% 밑으로 떨어지면 매수 포지션을 취하면 되는데 , 이 경우 대부분의 Oscillator 형 지표가 그렇듯 초과매수 , 초과매도 국면에서 오래 머물며 추세가 연장되는 경우가 많아 이러한 전략만으로는 이익을 내기 힘들다는 맹점이 있습니다 .

    따라서 이 기법을 보완하기 위한 전략으로 RSI 가 70% 를 넘어선 후 머물러 있다가 다시 70% 를 깨고 내려오면 매도를 , RSI 가 30% 밑으로 내려가 머물러 있다가 다시 30% 이상으로 올라오면 매수하는 방식으로 보완할 수 있습니다 .

    RSI 가 50% 를 상향 돌파하면 매수 , RSI 가 50% 를 하향 돌파하면 매도 포지션을 취하는 것으로 위의 “1) 과열과 침체 ” 방법을 보완하는 의미로 분할 매도 및 매수를 하는 방법으로 매매할 수 있습니다 .

    RSI 값은 흔히 Head & Shoulders 형이나 Triangles 형이 애매 모호한 상태일 때 다른 지표보다 RSI 값으로 분석하면 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 정확도가 높아져서 사용하기에 유용합니다 .

    4) Failure Swing

    지지나 저항의 돌파를 확인하는 형태로 RSI 값이 이전의 고점을 돌파하지 못하고 하락하거나 이전 저점 아래로 떨어지지 않고 상승하는 것을 말합니다 . 특히 RSI 값이 30 이하에서 Failure Swing 이 나타나거나 70 이상에서 Failure Swing 이 나타나면 주가의 추세전환이 임박했다는 신호로 인식합니다 .
    RSI 의 응용에서는 Failure Swing 이라는 것을 이용하는 기법이 자주 사용되는데 , 여기에는 두가지 종류가 있습니다 .

    Top Failure Swing 은 RSI 가 70% 이상에서 고점을 형성한 뒤 고점을 돌파하지 못하고 하락하는 것으로 직전 고점 형성 이후의 최저점을 하향 돌파하는 시점에서 매도를 하는 것이며 , Bottom Failure Swing 은 RSI 가 30% 이하에서 저점을 형성한 뒤 이 저점보다 더 떨어지지 않고 상승 반전되는 것으로 매수시점은 직전 저점 형성 이후의 최고점을 상향 돌파하는 시점에서 행하는 것입니다 .

    지지구간과 저항구간에서는 가격 그 자체보다 RSI 추세가 보다 더 확실한 신호일 수 있습니다 .

    6) 다이버전스 (Divergence)

    다이버전스란 가격은 상승하여 신고가를 갱신하였지만 RSI 지표는 전 고점을 갱신하지 못하는 현상으로 , 이는 추세가 약화됨을 의미합니다 . 그렇기 때문에 다이버전스는 항상 Failure Swing 을 동반하게 됩니다 .

    다이버전스는 RSI 이외에도 오실레이터 계열의 투자지표에서는 항상 존재하는 개념이지만 다른 지표에 비해서 RSI 의 다이버전스가 속임수가 적기 때문에 강력한 매매신호로 받아들여지고 있습니다 . 특히 파라메터를 장기간으로 준 RSI 는 다이버전스 판단에 매우 유용하니 매매에 적극 활용하시기 바랍니다 .Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI)

    이 때 주의하실 점은 , 다이버전스는 바닥과 천정을 찾아내는데 매우 유용하지만 , 다이버전스를 이용한 매매에 있어서 가장 중요한 것은 다이버전스를 미리 예측해서는 안되고 반드시 다이버전스를 확인한 후 매매해야 한다는 점입니다 .

    RSI 는 상승추세나 하락추세시 과매수와 과매도 신호를 모두 사용하는 것보다는 한가지 신호만 고려하는 것이 좋습니다 . 즉 , 상승추세에서는 과매수권 진입이 자주 나타나므로 과매도권 진입시만 매도시점으로 활용하고 , 하락추세에서는 과매도권 진입이 자주 나타나므로 과매수권 진입시만 매수시점으로 활용하는 것입니다 .

    1) 장점
    RSI 의 값은 가격의 변화보다 선행하여 완성된다는 점이 큰 장점입니다 . 그리고 과거 일정 기간의 평균치를 이용하므로 단기추세보다는 지수나 종목의 일봉상 큰 흐름을 읽어내는데 유용하게 사용 되는데 , 특히 박스권 장세에서 등락을 반복하는 상황에서는 매우 큰 효율을 보여주며 상승 추세중 지수의 고점 ( 변곡점 ) 이 도래함을 판단하는데 에도 비교적 유용하며 잘 맞습니다 . 그리고 기간 중에 일시적으로 비정상적인 움직임을 보이더라도 전체적인 분석에는 큰 영향을 미치지 못합니다 .

    RSI 는 천정과 Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) 바닥을 찾기 쉽다는 장점이 있는 반면 , 천정과 바닥이 제대로 형성되지 않는 시장에서는 유용하지 못합니다 . 또한 가격이 소폭의 등락만을 거듭하며 횡보하는 상황에서는 RSI 는 50% 를 중심으로 소폭의 등락만을 거듭하게 되므로 투자 지표로 활용하기가 곤란해집니다 . 그리고 강한 추세가 잡힌 경우에는 추세를 유지하며 과매수나 과매도를 지속하는 경우도 있으니 RSI 만으로 판단하고 매수나 매도에 들어가는 것은 위험하기 때문에 보조 지표로서만 참조하고 분할 매매로 대응을 하는 것이 바람직 하겠습니다 .


0 개 댓글

답장을 남겨주세요