본문 바로가기
AI 에이전트/트레이딩

기술적 지표: 이동평균 수렴확산 (MACD)

by 깊은대학 2025. 7. 6.

이동평균 수렴확산 (MACD, Moving Average Convergence Divergence)는 기술적 분석에서 RSI와 함께 가장 널리 활용되는 지표로, 단기 및 장기 이동평균선 간의 차이를 분석하여 시장의 추세 전환 시점과 모멘텀의 강도를 평가한다.

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

      1. MACD 선 (MACD Line)
      2. 신호선 (Signal Line): MACD의 이동평균
      3. MACD 히스토그램 (MACD Histogram): 두 선 간의 차이

MACD 선은 다음 수식으로 계산한다.

 

\[ MACD= \mbox{단기간의 이동평균} - \mbox{장기간의 이동평균} \]

 

일반적으로 단기간으로 12일, 장기간으로 26일을 사용하며 지수 이동평균(ema, exponential moving average)을 이용하여 평균값을 계산한다.

신호선은 다음과 같이 계산한다.

 

\[ Signal= \mbox{일정기간 동안 } MACD \mbox{의 이동평균} \]

 

일반적으로 일정 기간으로 9일을 사용하며 마찬가지로 지수 이동평균(ema)을 이용하여 평균값을 계산한다.

히스토그램은 다음과 같이 계산한다.

 

\[ Histogram=MACD-Signal \]

 

MACD를 간단히 해석하면, 단기 이동평균선이 장기 이동평균선보다 빠르게 상승하면 상승 추세로, 반대로 하락하면 하락 추세로 판단할 수 있다. 이러한 원리를 바탕으로 MACD를 활용한 대표적인 매매 전략은 다음과 같다.

1. 골든크로스/데드크로스 전략

  • MACD선이 신호선을 상향 돌파 (골든크로스): 매수 신호
  • MACD선이 신호선을 하향 돌파 (데드크로스): 매도 신호

2. 히스토그램 전략

  • 히스토그램 증가: 모멘텀 증가로 해석
  • 히스토그램 감소: 모멘텀 약화로 해석

3. 다이버전스 전략

  • 가격은 고점을 높이는데, MACD는 낮아짐 (하락 다이버전스): 하락 신호
  • 가격은 저점을 낮추는데, MACD는 높아짐 (상승 다이버전스): 반등 신호

다음은 1번 매매 전략을 이용하여 테슬라 주식을 거래했을 때 매수, 매도 시점을 마커를 주가에 표시한 것이다. 일봉 데이터를 사용했다.

 

 

파란색 마커가 매도 신호, 빨간색 마커가 매수 신호이다.

 

다음은 위 MACD를 이용한 매매전략을 구현한 파이썬 코드다.

 

 

 


import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# 데이터 다운로드
df = yf.download("TSLA", start="2024-01-01", end="2025-07-06")

# MACD 계산
df['EMA12'] = df['Close'].ewm(span=12, adjust=False).mean()
df['EMA26'] = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = df['EMA12'] - df['EMA26']
df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
df['Hist'] = df['MACD'] - df['Signal']

# 매수/매도 시점 조건
df['Prev MACD'] = df['MACD'].shift(1)
df['Prev Signal'] = df['Signal'].shift(1)

# 골든크로스 조건: MACD가 Signal을 아래에서 위로 돌파
buy_signals = (df['MACD'] > df['Signal']) & (df['Prev MACD'] <= df['Prev Signal'])

# 데드크로스 조건: MACD가 Signal을 위에서 아래로 하락 돌파
sell_signals = (df['MACD'] < df['Signal']) & (df['Prev MACD'] >= df['Prev Signal'])

# 매수/매도 시점의 날짜와 종가
buy_dates = df.index[buy_signals]
sell_dates = df.index[sell_signals]
buy_prices = df['Close'][buy_signals]
sell_prices = df['Close'][sell_signals]

# 시각화
plt.figure(figsize=(14, 10))

# 서브플롯 1: 종가 + 매수/매도 마커
plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], label='TSLA Close', color='black')
plt.scatter(buy_dates, buy_prices, marker='^', color='red', label='Buy Signal (MACD)', s=100)
plt.scatter(sell_dates, sell_prices, marker='v', color='blue', label='Sell Signal (MACD)', s=100)
plt.title('Tesla (TSLA) Price with MACD Buy/Sell Markers')
plt.ylabel('Price ($)')
plt.grid(True)
plt.legend()

# 서브플롯 2: MACD + Signal + Histogram
plt.subplot(2, 1, 2)
plt.plot(df.index, df['MACD'], label='MACD Line', color='blue')
plt.plot(df.index, df['Signal'], label='Signal Line', color='orange')
plt.bar(df.index.values, df['Hist'].values, label='MACD Histogram', color='gray', width=1.0)
plt.title('MACD Indicator')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

 

댓글