brunch

파이썬으로 배우는 기술적 분석: 삼성전자 주가분석 2편

by 박정수

파이썬으로 배우는 기술적 분석: 삼성전자 주가분석 2편 (RSI/MACD)


RSI, MACD: 지금 주식시장이 과열인지 침체인지를 알려주는 온도계

우리가 몸이 아플 때 가장 먼저 하는 일은 체온을 재는 것이다. 36.5도라는 기준점에서 얼마나 벗어났는지를 통해, 우리는 몸의 상태가 정상인지, 혹은 열이 끓는 과열 상태인지, 아니면 저체온의 위험에 빠졌는지를 객관적인 숫자로 파악한다. 주식시장 역시 하나의 거대한 유기체와 같다. 투자자들의 탐욕과 공포가 뒤섞여 끊임없이 뜨거워지거나 차갑게 식기를 반복한다. 그렇다면 이 거대한 시장의 온도를 재는 체온계는 없을까?

데이터는 우리에게 RSI와 MACD라는 두 개의 정밀한 디지털 온도계를 선물했다. 이 두 지표는 지금 시장의 감정이 얼마나 뜨거운지, 그 열기가 어느 방향으로 향하고 있는지를 알려줌으로써, 우리가 감정의 휩쓸림이 아닌 데이터에 기반한 냉정한 판단을 내릴 수 있도록 돕는다.


RSI (Relative Strength Index), 시장의 과열을 측정하는 속도계

RSI, 우리말로는 ‘상대강도지수’라 불리는 이 지표는 ‘최근 일정 기간 동안 주가가 상승한 변화량과 하락한 변화량의 평균값’을 구해, 현재 주가의 상승 추세가 얼마나 강한지를 백분율로 나타낸 지표다. 개념은 다소 복잡하게 들리지만, 그 본질은 아주 단순하다. 바로 ‘현재 주가 상승의 속도가 얼마나 빠른가’를 측정하는 것이다.

자동차 계기판의 RPM 게이지를 떠올려보자. 평범한 도로에서는 2,000~3,000 RPM을 유지하며 안정적으로 달리지만, 가속 페달을 깊게 밟으면 RPM 게이지가 6,000, 7,000을 향해 치솟으며 엔진이 과열되기 시작한다. RSI가 바로 이 RPM 게이지와 같다.


통상적으로 RSI 수치는 0과 100 사이에서 움직인다. 개발자인 웰스 와일더는 이 수치가 70을 넘어서면 ‘과매수(Overbought)’, 즉 시장이 과열되었다고 판단하고, 30 아래로 떨어지면 ‘과매도(Oversold)’, 즉 시장이 지나치게 냉각되었다고 해석했다. RSI가 70을 넘어섰다는 것은 최근 하락한 날보다 상승한 날의 힘이 압도적으로 강했다는 의미다. 단기간에 너무 많은 투자자가 주식을 사들이며 가격이 급등했고, 이제는 차익 실현 매물이 나올 가능성이 커져 엔진이 식을 필요가 있다는 경고 신호다. 반대로 30 미만이라는 것은 주식을 사려는 사람보다 팔려는 사람의 공포가 시장을 지배하며 주가가 과도하게 하락했다는 의미로, 이제는 기술적 반등을 기대해볼 만한 ‘저체온’ 상태라는 신호로 읽을 수 있다.


하지만 명심해야 할 것이 있다. RSI가 70을 넘었다고 해서 무조건 매도하고, 30 아래로 떨어졌다고 해서 무조건 매수하는 것은 매우 위험한 단선적 접근법이다. 강력한 상승 추세를 타는 주식은 RSI가 70 이상인 과열권에 오랫동안 머무르며 계속해서 상승하기도 하고, 반대로 하락 추세에 빠진 주식은 30 미만에서 헤어나오지 못하고 지하실 아래 땅굴을 파기도 한다.


따라서 RSI를 더욱 정교하게 활용하기 위해서는 ‘다이버전스(Divergence)’라는 개념을 이해해야 한다. ‘하락 다이버전스’는 주가의 고점은 계속 높아지는데, RSI의 고점은 반대로 낮아지는 현상이다. 이는 겉으로는 주가가 오르는 것처럼 보이지만, 그 내부의 상승 에너지는 점점 약해지고 있다는 강력한 이상 신호다. 곧 추세가 전환될 수 있음을 암시하는 데이터의 속삭임인 것이다. ‘상승 다이버전스’는 그 반대로, 주가는 계속해서 신저점을 기록하며 하락하지만 RSI의 저점은 오히려 올라가는 현상으로, 하락의 힘이 바닥을 드러내고 있음을 알려주는 긍정적 신호다.


지난 편에서는 Yahoo Finance를 통해 데이터를 불러왔는데, 이번편은 한국증권거래소를 통한 데이터 다운로드 방법을 소개한다. 그리고 제가 만든 코드가 아니라 Python이 만들어 놓은 방대한 기술적 분석 지표 들을 이용해서 여러분에게 다양성과 편리성을 제공하려 한다.

https://technical-analysis-library-in-python.readthedocs.io/en/latest/


먼저 필요한 Library를 설치한다.

pip install ta


그리고 pykrw는 한국의 주시시장과 특화되어 있는 방대한 자료를 제공하고 있으니 연구자들이나 학생들이 접근하기 쉬운 가중 좋은 데이터소스같다.

이미 좋은 소개자료들도 많다.

https://wikidocs.net/226894

https://unfinishedgod.netlify.app/2023/07/03/python-pykrk-part-1/


역시 다음과 같이 Library를 설치한다

pip install pykrx # pykrx 설치


좋은 예제를 구할 수 있다.

https://antsinvest.tistory.com/32

https://github.com/bukosabino/ta

https://technical-analysis-library-in-python.readthedocs.io/en/latest/ta.html#ta.volatility.BollingerBands


지난편의 이동 평균

import talib

from pykrx import stock

df = stock.get_market_ohlcv('20220720', '20240310', '005930')

df['SMA10'] = talib.SMA(df['종가'],10)

print(df)


오늘의 RSI

import talib

from pykrx import stock

df = stock.get_market_ohlcv('20220720', '20240310', '005930')

df['SMA10'] = talib.RSI(df['종가'],14)

print(df)


#또는 RSI 계산 공식

RSI = 100 - (100 / (1 + RS)) 여기서 RS = (n일간 상승폭 평균) / (n일간 하락폭 평균)

일반적으로 14일을 기준으로 계산합니다.


def calculate_rsi(data, period=14):

delta = data.diff() # 상승분과 하락분 분리

gain = delta.where(delta > 0, 0)

loss = -delta.where(delta < 0, 0)

# 평균 계산 (첫 번째는 단순평균, 이후는 지수이동평균)

avg_gain = gain.rolling(window=period).mean()

avg_loss = loss.rolling(window=period).mean()

# RS와 RSI 계산

rs = avg_gain / avg_loss

rsi = 100 - (100 / (1 + rs))

return rsi


RSI 해석

RSI > 70: 과매수 구간 - 주가가 과열되어 조정 가능성

RSI < 30: 과매도 구간 - 주가가 과도하게 하락하여 반등 가능성

RSI 50: 중립 구간

다이버전스: 주가는 상승하는데 RSI는 하락하면 추세 전환 신호

RSI가 70을 넘으면 단기적으로 매도 압력이 강해질 수 있고, 30 이하면 매수 기회로 볼 수 있습니다. 하지만 강한 상승장에서는 RSI가 오랫동안 70 이상에 머물 수 있으므로 다른 지표와 함께 판단해야 합니다.


MACD (Moving Average Convergence Divergence), 추세의 방향과 힘을 읽는 나침반

RSI가 시장의 ‘온도’와 ‘속도’를 측정하는 지표라면, MACD는 시장의 ‘방향’과 그 ‘힘의 크기’를 알려주는 나침반이자 기압계와 같다. ‘이동평균선 수렴·확산 지수’라는 이름처럼, MACD의 본질은 성격이 다른 두 이동평균선(단기 이평선과 장기 이평선)의 관계를 통해 추세의 변화를 포착하는 데 있다.

MACD는 크게 세 가지 요소로 구성된다.

MACD 선: 단기지수이동평균(보통 12일)에서 장기 지수이동평균(보통 26일)을 뺀 값이다. 단기 투자자들의 평균 매수 단가가 장기 투자자들의 평균 매수 단가보다 얼마나 위에 있는지를 보여준다. 이 선이 0선 위에 있다면 단기 추세가 장기 추세보다 강한 상승 국면임을, 0선 아래에 있다면 하락 국면임을 의미한다.

시그널선(Signal Line): MACD 선을 다시 9일 지수이동평균으로 계산한 값이다. 즉, MACD 선의 평균값으로, MACD 선의 움직임보다 한 박자 늦게 움직인다. 이 시그널 선은 MACD 선의 추세를 판단하는 기준선 역할을 한다.

MACD 히스토그램(Histogram): MACD 선에서 시그널 선을 뺀 값이다. 두 선의 간격, 즉 추세의 힘이 얼마나 강한지를 막대그래프로 보여준다. 히스토그램 막대가 0선을 기준으로 위로 솟아오를수록 상승 에너지가 강해지고 있음을, 아래로 깊어질수록 하락 에너지가 강해지고 있음을 직관적으로 보여준다.


MACD를 활용하는 가장 기본적인 방법은 ‘골든 크로스’와 ‘데드 크로스’를 확인하는 것이다. MACD 선이 시그널 선을 아래에서 위로 뚫고 올라가는 ‘골든 크로스’는 단기 상승 에너지가 평균적인 흐름을 이겨내기 시작했다는 의미로, 강력한 매수 신호로 해석된다. 반대로 MACD 선이 시그널 선을 위에서 아래로 뚫고 내려가는 ‘데드 크로스’는 상승 동력이 쇠퇴하고 있다는 의미로, 매도 신호로 받아들여진다.

특히 MACD 히스토그램의 움직임을 주시하는 것은 추세의 전환을 한발 앞서 예측하는 데 큰 도움이 된다. 상승 추세 중에 히스토그램 막대의 길이가 점점 짧아진다는 것은, 비록 MACD 선이 시그널 선 위에 있더라도 두 선의 간격이 좁아지며 상승 에너지가 약해지고 있음을 의미한다. 곧 데드 크로스가 나타날 수 있다는 사전 경고인 셈이다.


def calculate_macd(data, fast=12, slow=26, signal=9):

# 지수이동평균(EMA) 계산

ema_fast = data.ewm(span=fast, adjust=False).mean()

ema_slow = data.ewm(span=slow, adjust=False).mean()

# MACD 라인

macd_line = ema_fast - ema_slow

# 시그널 라인

signal_line = macd_line.ewm(span=signal, adjust=False).mean()

# 히스토그램

histogram = macd_line - signal_line

return macd_line, signal_line, histogram


MACD 해석 방법

골든크로스: MACD 라인이 시그널 라인을 상향 돌파 → 매수 신호

데드크로스: MACD 라인이 시그널 라인을 하향 돌파 → 매도 신호

제로선 돌파: MACD가 0선을 상향 돌파하면 상승 추세, 하향 돌파하면 하락 추세

다이버전스: 강세 다이버전스: 주가는 하락하는데 MACD는 상승 → 반등 신호 약세 다이버전스: 주가는 상승하는데 MACD는 하락 → 조정 신호

히스토그램의 크기: 클수록 추세가 강함

MACD는 특히 중장기 추세를 파악하는 데 유용하며, 단기 매매보다는 스윙 트레이딩이나 중장기 투자에 적합합니다.


온도계와 나침반을 함께 사용하는 법

RSI와 MACD는 각각 시장의 다른 측면을 보여주지만, 이 둘을 함께 사용하면 시장의 상태를 훨씬 더 입체적으로 분석할 수 있다. 예를 들어, RSI가 30 미만인 과매도 구간에 진입하고, 주가는 신저점을 기록하지만 RSI의 저점은 높아지는 ‘상승 다이버전스’가 관찰된다고 가정해보자. 여기에 더해, MACD 선이 시그널 선을 상향 돌파하는 ‘골든 크로스’가 임박했거나, 0선 아래에 있던 히스토그램 막대의 길이가 점점 짧아지며 하락 에너지가 소진되고 있음이 확인된다면, 이는 매우 신뢰도 높은 추세 전환의 신호가 될 수 있다.


데이터는 결코 미래를 예언하지 않는다. RSI와 MACD 역시 마찬가지다. 이 지표들은 과거의 가격 데이터를 가공하여 현재 시장의 상태를 진단하는 후행성 지표일 뿐이다. 하지만 이 객관적인 온도계와 나침반을 통해 우리는 시장 참여자들의 집단 심리가 과열로 치닫고 있는지, 아니면 공포에 질려 침체에 빠져있는지를 가늠할 수 있다. 그리고 그 데이터의 안내에 따라 모두가 탐욕에 취해있을 때 한 걸음 물러서고, 모두가 공포에 떨고 있을 때 용기를 낼 수 있는 최소한의 근거를 마련할 수 있다. 그것이 바로 우리가 이 두 개의 숫자에게 꾸준히 길을 물어야 하는 이유다.



실전 투자 팁

여러 지표 종합 판단: 한 가지 지표만 보지 말고 여러 지표를 종합적으로 판단하세요.

기본적 분석 병행: 기술적 분석과 함께 기업의 재무제표, 업종 전망 등 기본적 분석을 병행하세요.

리스크 관리: 손절매 라인을 정하고 철저히 지키세요.

백테스팅: 전략을 실제 돈으로 시도하기 전에 과거 데이터로 충분히 검증하세요.

감정 통제: 기술적 지표는 객관적 판단을 돕는 도구입니다. 욕심과 공포를 통제하세요.


그리고 오늘 현재의 RSI (70이상의 과매수 상태), 3개의 이동 평균 (장기적Golden Cross상태) 그리고

MACD (장기적 상승세입이다)

삼성전자3개.png

이 그래프의 목적은 결코 투자를 권유하는 것이아 니고, 현재의 시장 상황을 분석할 뿐입니다. 내일의 주가는 내일의 시장상황이 결정을 하기 때문이죠.


저는 일일이 그림을 그리고 코딩하고, 짜증이 많은데, 제가 짜증이 날수록, 여러분에게는 더 쉽고, 재미있고, 진지한 결과를 드리고 있다고 자위를 합니다. 그리고 각각의 글들이 완성되면, 하프-마라톤을 완주 한 기분이 됩니다. 다음글은 3편 다른 유용한 기술적 지표편으로 이어집니다.

keyword
이전 13화파이썬으로 배우는 기술적 분석: 삼성전자 주가분석 1편