본문 바로가기

주식 분석

기술적 분석 (2) - MACD

 이번에 소개드릴 지표는 MACD 입니다. 

 

 MACD는 이동평균선 다음으로 인기가 많은 지표입니다. [MACD는 보통 지수 이동평균선을 이용하여 계산하므로, 이하 지평선은 지수 이동평균선을 의미합니다.]

 이평선이 서로 멀어지고(확산) 가까워지는(수렴) 것을 반복하는 성질을 이용, 나타내는 지표라고 할 수 있습니다. 즉 이평선 간의 차이를 보기 쉽게 나타내는 지표 입니다.

 

 MACD를 사용할 때 보통 3가지의 값들을 계산 합니다.

1) MACD : 단기 이평선 값(보통 12일) - 장기 이평선 값(보통 26일)

2) MACD Signal : MACD값의 (보통 9일) 이평선.

3) MACD Histogram : MACD - MACD Signal

 

삼성전자 차트(영웅문)

 위 그림에서 보면, 위쪽은 주식 가격, 아래가 MACD 입니다. MACD Oscillator 12, 26, 9는 각각 MACD와 MACD Signal에서 사용하는 날짜의 값입니다. 주황색 선은 MACD, 보라색 선은 시그널 입니다. 그리고 Histogram은 양수일때 주황색, 음수일때는 파란색으로 표시되어 있네요.

 

 MACD의 값을 보면, 단기 이평선값과 장기 이평선 값의 차이 입니다. 주식이 상승하고 있다면 단기 이평선 값이 장기 이평선 값보다 크므로, MACD는 양수값을 가질 것 입니다. 이러한 MACD 값의 이평선인 Signal 값이 MACD와 교차를 하게 되면 꽤나 유용한 정보를 가질 것 같죠?

 그래서 보통 MACD 값을 활용하는 방법은 MACD와 MACD Signal 값의 차이인 MACD Histogram을 보는 겁니다. 

 


 Python으로 구현하기 위해 먼저 데이터를 불러옵니다. Plotly를 이용해 시각화 할거라, plotly도 import 합니다.

.
import pandas as pd
import numpy as np
import plotly.graph_objects as go

path_dir = './data'
data = np.loadtxt(path_dir + '/' + '000660_from_2010.csv', delimiter = ',')
data = pd.DataFrame(data)
data.columns = ['Open', 'High', "Low", "Close", "Volumn", "Adj"]

다음은 MACD를 구하는 함수 입니다.

.
def cal_ema_macd(data, n_fast=12, n_slow=26, n_signal=9) : 
    data["EMAFast"] = data["Close"].ewm(span=n_fast).mean()
    data["EMASlow"] = data["Close"].ewm(span=n_slow).mean()
    data["MACD"] = data["EMAFast"] - data["EMASlow"]
    data["MACDSignal"] = data["MACD"].ewm(span=n_signal).mean()
    data["MACDDiff"] = data["MACD"] - data["MACDSignal"]
    
    return data
    
data = cal_ema_macd(data)

지난번 글에서 사용했던 SK 하이닉스 일봉 데이터 입니다.

.
fig = go.Figure()

fig.add_trace(go.Scatter(x=data.index, y=data["Close"],
                        mode='lines',
                        name="Close"))
fig.update_layout(title='Close',
                   xaxis_title='days',
                   yaxis_title='StockValue')

fig.show()

다음은 MACD 시각화 입니다.

.
fig = go.Figure()

fig.add_trace(go.Scatter(x=data.index, y=data["MACD"],
                        mode='lines',
                        name="MACD"))
fig.add_trace(go.Scatter(x=data.index, y=data["MACDSignal"],
                        mode='lines',
                        name="MACDSignal"))
fig.add_trace(go.Bar(x=data.index, y=data["MACDDiff"],
                    name="MACD DIff",
                     width=2.5,
                    marker_color='Black'))
fig.add_trace(go.Scatter(x=data.index, y=np.zeros(len(data.index)),name='0',
                        line = dict(color='gray', width=2, dash='dot')))

fig.update_layout(title='MACD 16 26 9',
                   xaxis_title='days',
                   yaxis_title='MACD')

fig.show()

위의 그래프는 2200 거래일 동안의 데이터라 보기가 쉽지 않습니다. 그래서 일부분을 캡쳐해왔습니다.

위 그림을 보시면 MACD와 MACD Signal은 line chart로, MACD DIff(MACD histogram)는 bar chart로 그렸습니다. 위의 MACD와 원래 주가를 같이 겹쳐서 그리면 좀더 보기 쉬울텐데 쉽지가 않더라구요. 위 부분에 해당하는 주가는 이렇습니다.

 

여러 plot으로 그려보고, 실제로 값들을 확인해보면 주식시장이 상승세 일때 MACD Diff의 값은 양수고, 주식시장이 하락세 일때 MACD Diff의 값은 음수가 됩니다. 그래서 MACD가 골든크로스 되었을때 주식을 사면 되는것인가? 하는 문제는 이평선과 마찬가지로 아닙니다. 이평선의 또다른 측면을 보여주는 지표로써, MACD도 후행 지표이기 때문입니다.

 또한 주식시장이 횡보하고 있을때, 골든 크로스나 데드 크로스가 자주 나타나게 되고, 의미가 없는 신호가 될 수 있습니다. 

 

 모델링의 측면에서는 이평선과 비슷하게 사용할 수 있을듯 합니다. 이평선 처럼 주가에 추가적인 정보를 담을 수 있고, 골든 크로스나 데드 크로스 등의 신호는 MACD Diff 값을 이용해서 알려줄 수 있겠네요.