본문 바로가기
파이썬/주식

Python으로 보조지표 MACD 구하기 MACD Oscillator 구하기

by 행복론자 2019. 11. 10.

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와 비교하면 계산 속도가 더 빠르다는 것을 알 수 있습니다. 또한 계산한 값도 둘이 근소한 차이가 있습니다.)

 

 

 

출처 : https://pandas.pydata.org/pandas-docs/stable/user_guide/computation.html#exponentially-weighted-windows

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

2021.10.14 - [파이썬/주식] - [공지] 쉽게 따라 만드는 파이썬 주식 자동매매 시스템 출간

 

[공지] 쉽게 따라 만드는 파이썬 주식 자동매매 시스템 출간

2021년 10월 14일, 길벗 출판사에서 '쉽게 따라 만드는 파이썬 주식 자동매매 시스템'이 출간되었습니다. 기존 판매하던 전자책 '주식매매프로그램, 쉽게 따라 만드는 노하우와 소스를 드립니다.'

jsp-dev.tistory.com

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글