Python으로 MACD 및 MACD Oscillator 구하기 편입니다.
MACD란 이동평균수렴확산지수 (Moving Average Convergence & Divergence)입니다.
Gerald Appel이 개발하였으며 이동평균선끼리의 차이를 통해 주가 흐름을 알아보는데 쓰이는 지표입니다.
Convergence은 모인다는 뜻이고 Divergence은 흩어진다는 뜻으로 단기/장기이동평균선이 멀어졌다가 다시 가까워지는 정도를 표시하는 지표입니다.
MACD, MACD Oscillator의 계산 방법으로부터 의미를 더 살펴 보겠습니다.
MACD : 12일 지수이동평균선 - 26일 지수이동평균선
MACD Signal = MACD의 9일 단순이동평균선
MACD Oscillator = MACD Signal 값을 막대로 표현한 보조지표
MACD란 12,26일을 기준으로 한 지수이동평균선의 차이입니다.
최근 12일간 평균주가가 26일간 평균주가를 상승돌파 하면 최근 흐름을 상승이라고 판단할 수 있습니다.
반대의 경우인 12일간 평균주가가 26일간 평균주가를 하락돌파한다면 최근 주가가 과거 대비 더 하락하고 있다고 판단할 수 있습니다. 이 차이에 따라 MACD 값은 음수가 될 수도 있고 양수가 될 수도 있습니다.
정리하면 MACD의 활용도, 의미는 이렇습니다.
(1) MACD가 증가하면 상승국면이라고 할 수 있습니다. 특히 0보다 작았다가 양수로 변할 때 추세가 전환됐다고 할 수 있습니다.
(2) MACD가 Signal을 상향돌파하면 매수, 하향돌파하면 매도 타이밍이라고 생각할 수 있습니다.
(상향돌파한다는 것은 최근 12일 주가가 상승흐름이 과거 26일 보다 빠르다는 것을 의미하기 때문입니다.물론 주식 시장에 절대적이란 없어서 돌파했다가 바로 고꾸라질 수도 있습니다.)
이를 Python으로 계산하기 전에 생각해봐야 할 것이있습니다.
바로 지수이동평균인데요. MACD는 12,26일간의 지수이동평균을 기준으로 합니다.
이전 포스팅에서 사용한 이동평균선은 단순 이동평균선입니다. 단순이동평균이란 평균값을 구하는 대상을 모두 같은 가중치로 보는 것입니다.
예를 들어 1,2,3일의 종가로 이동평균선을 구합니다. 계산식은 이렇습니다.
(1일 종가 + 2일 종가 + 3일 종가) / 3
여기서 4일 종가를 추가하면
(1일 종가 + 2일 종가 + 3일 종가 + 4일 종가) / 4
이렇게 계산하면 됩니다. 구하는 대상의 가중치가 차이가 없이 계산하기 때문에 평균을 구하는 항목이 추가되면 분자, 분모에 하나씩 추가해주면 됩니다.
그러면 지수이동평균은 최근 추가된 데이터의 가중치를 높이는 방식입니다.
exponential moving average (EMA), exponentially weighted moving average (EWMA)지수 이동 평균, 지수가중이동평균, 가중이동평균
sn+1=αxn+(1−α)sn
xn: 최신 정보sn: 과거 종합 정보α: 윤활계수 ( 0<α<1 )[1]
sn+1=αxn+(1−α)αxn−1+(1−α)2αxn−2+⋯+(1−α)n+1s0
→ 과거의 정보일수록 가중치가 점점 작아짐
-제타위키-
이에 대한 계산을 Python 코드를 통해 해보겠습니다.
import pandas_datareader.data as web
import datetime
start=datetime.datetime(2019, 1, 1)
end=datetime.datetime(2019, 11, 10)
stock_df = web.DataReader('035250.KS', "yahoo", start, end)
def calMACD(df, short=12, long=26, signal=9):
df['MACD'] = df['Close'].ewm( span = long , min_periods = long-1 , adjust=False).mean() - df['Close'].ewm( span = long , min_periods = long-1 , adjust=False).mean()
df['MACD_Signal'] = df['MACD'].ewm( span = signal, min_periods = signal-1, adjust=False).mean()
df['MACD_OSC'] = df['MACD'] - df['MACD_Signal']
return df
print(calMACD(stock_df))
위 코드에서 살펴볼 부분 이렇습니다.
(1) 지수이동평균을 구하기 위해 DataFrame의 ewm 함수를 사용했습니다
(2) ewm 함수 사용에 param으로 전달된 span은 기간입니다.
(3) ewm 함수 사용에 param으로 전달된 adjust은 default가 True지만 False와 비교하면 다른 의미를 가지고 있습니다.
default 설정인 adjust=True는 지수이동평균의 가중치 통해 초기값의 불균형을 조정해준다는 뜻이고
adjust=False은 그런 조정 없이 recursive하게 계산한다는 뜻이지만 이는
구하고자 하는 k번째 항이 무한하다는 설정이므로 MACD에서 사용하는 특정일(유한성)의 사용으로 다소 적절하지 않을 수도 있으나, 초기시점(beginning period)의 조정을 필요로 하지 않아서 adjust를 False라고 설정하였습니다.
(adjust=False는 항을 무한하다고 설정하여 y(t) 식을 간단히 하였기에 실제로 adjust=True와 비교하면 계산 속도가 더 빠르다는 것을 알 수 있습니다. 또한 계산한 값도 둘이 근소한 차이가 있습니다.)
같이 읽어보면 좋은 글
2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
2021.10.14 - [파이썬/주식] - [공지] 쉽게 따라 만드는 파이썬 주식 자동매매 시스템 출간
'파이썬 > 주식' 카테고리의 다른 글
Python, BeautifulSoup4으로 Naver Finance 정보 크롤링 네이버 기업실적 크롤링 (1) | 2019.11.24 |
---|---|
Python으로 종목코드(코스피/코스닥) 엑셀로 저장/읽기 (3) | 2019.11.17 |
Python으로 RSI(Relative Strength Index) 구하기 (8) | 2019.11.06 |
Python으로 볼린저밴드 Bollinger Bands 보조지표 계산 (2) | 2019.11.03 |
Python으로 캔들스틱 차트 Candlestick chart 그리기 (5) | 2019.11.02 |
댓글