Python/파이썬과 주식, 코인
[Python] 이동평균 수렴 확산 지수(MACD)
컴닥
2025. 4. 27. 20:41
반응형
Python으로 알아보는 Technical Indicators
1. 이동평균선(Moving Average)
2. 볼린저 밴드(Bollinger Bands)
3. 상대강도지수(RSI, Relative Strength Index)
4. 이동평균 수렴 확산 지수(MACD)
Moving Average Convergence Divergence
(지수) 이동 평균선들의 수렴과 확산,
즉 (지수) 이평선들의 '모임'과 '퍼짐'을 지수화 한 것입니다.
지수 이동 평균에 대해서는
개념만 이해하면 될 것 같습니다.
지수 이동 평균(EMA, Exponential Moving Average)은
최근 데이터를 더 크게 반영하여
가격 변화를 나타내는 기술적 지표입니다.
저희가 알고 있는 이동 평균은
단순 이동 평균(SMA, Simple Moving Average)이라고
구분할 수 있습니다.
MACD는 3가지 기간을 사용합니다.
fast_period(12): 단기 지수이동평균(EMA) 기간
slow_period(26): 장기 지수이동평균(EMA) 기간
signal_period(9): 시그널 라인 기간
MACD 계산
MACD 라인 = 단기 EMA - 장기 EMA
시그널 라인 = MACD 라인의 EMA(9일)
히스토그램 = MACD 라인 - 시그널 라인
MACD 작동 원리
- 강세 신호: MACD 선이 신호선을 상향 돌파하면 상승 모멘텀을 나타내며 매수 기회로 간주.
- 약세 신호: MACD 선이 신호선을 하향 돌파하면 하락 모멘텀을 나타내며 매도 기회로 간주.
- 제로선 교차:
- MACD가 제로선을 상향 돌파하면 강세(가격 상승 가능성).
- MACD가 제로선을 하향 돌파하면 약세(가격 하락 가능성).
- MACD는 단기 (지수)이평선 - 장기 (지수) 이평선.
이평선에서 골든크로스는 단기 이평선이 장기이평선을 뚫고 올라가는 것을 의미.
이 때 MACD는 제로선을 뚫고 올라감.
- 히스토그램: 히스토그램이 커지면(양수/음수) 모멘텀이 강해지고, 작아지면 모멘텀이 약화되거나 추세 반전 가능성을 시사.
import pandas as pd
import requests
import matplotlib.pyplot as plt
url = "https://api.bithumb.com/v1/candles/days?market=KRW-BTC&count=200"
headers = {"accept": "application/json"}
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(response.status_code)
df = pd.DataFrame(response.json())
df["candle_date_time_kst"] = pd.to_datetime(df["candle_date_time_kst"])
df = df.sort_values(by="candle_date_time_kst").reset_index(drop=True)
fast_period = 12
slow_period = 26
signal_period = 9
# 단기 및 장기 지수이동평균(EMA) 계산
ema_fast = df["trade_price"].ewm(span=fast_period, adjust=False).mean()
ema_slow = df["trade_price"].ewm(span=slow_period, adjust=False).mean()
# MACD 라인 계산 (단기 EMA - 장기 EMA)
macd_line = ema_fast - ema_slow
# 시그널 라인 계산 (MACD의 EMA)
signal_line = macd_line.ewm(span=signal_period, adjust=False).mean()
# 히스토그램 계산 (MACD 라인 - 시그널 라인)
histogram = macd_line - signal_line
# 결과를 DataFrame으로 구성
macd_df = pd.DataFrame(
{"MACD": macd_line, "Signal": signal_line, "Histogram": histogram}
)
# 결과를 DataFrame으로 구성
df = pd.DataFrame({"Close": df["trade_price"]})
df = pd.concat([df, macd_df], axis=1)
# 그래프로 시각화
plt.figure(figsize=(12, 10))
# 가격 차트
plt.subplot(3, 1, 1)
plt.plot(df.index, df["Close"], label="Close Price")
plt.title("Price Chart")
plt.legend()
# MACD 차트
plt.subplot(3, 1, 2)
plt.plot(df.index, df["MACD"], label="MACD", color="blue")
plt.plot(df.index, df["Signal"], label="Signal", color="red")
plt.title("MACD (12, 26, 9)")
plt.legend()
# 히스토그램
plt.subplot(3, 1, 3)
plt.bar(df.index, df["Histogram"], label="Histogram", color="green", alpha=0.5)
plt.axhline(y=0, color="k", linestyle="-", alpha=0.3)
plt.title("MACD Histogram")
plt.legend()
plt.tight_layout()
plt.show()
반응형