이동평균 수렴확산 (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()
'AI 에이전트 > 트레이딩' 카테고리의 다른 글
| 카카오톡 메시지 자동 전송 시스템 만들기 (0) | 2025.07.24 |
|---|---|
| 허깅페이스 트랜스포머를 이용한 뉴스 감성 분석 (0) | 2025.07.09 |
| 기술적 지표: 스토캐스틱 (Stochastic) (0) | 2025.07.07 |
| 기술적 지표: 상대강도지수 (RSI, Relative Strength Index) (0) | 2025.07.04 |
| Llama3.2가 알려주는 주식 매매 결정 (0) | 2025.02.15 |
댓글