시계열 데이터 분석 : 지수 이동평균 (EMA)

시계열 데이터 분석 : 지수 이동평균 (EMA)

이번 포스팅에서는 시계열 데이터 분석에서 많이 사용되는 지수 이동평균(EMA)에 대해 알아보겠습니다. 지수이동평균은 지난 포스팅의 단순 이동평균(SMA) 보다 최근의 데이터에 가중치를 두는 이동평균입니다. 파이썬 판다스에서 제공하는 ewm() 함수 활용법에 주목해 주시기 바랍니다.


글의 순서

시계열 데이터 분석 : 이동평균선 (moving average line)
시계열 데이터 분석 : 지수이동평균 (EMA, Exponential Moving Averages)
판다스에서 지수이동평균 EMA 구하는 방법
파이썬 코드 : 지수 이동평균


시계열 데이터 분석 : 이동평균선 (moving average line)

이동평균선은 짧은 시간 동안에 발생한 극심한 가격 변동을 보다 긴 시간에서의 변화로 바꿔주는 역할을 합니다. 그래서 추세를 확인할 수 있습니다. 10일 이동평균선은 과거 10일 동안의 종가를 평균내서 표시하는 방법입니다. 10일간의 종가를 다 더한 후, 10으로 나누는 그 평균인데, 이처럼 각 종가를 똑같은 비중으로 더한 후 나눈 것을 단순이동평균이라고 합니다.

참고로 아래에 나타낸 지난 두 번의 포스팅에서 이동평균선과, 이동평균선을 이용한 백테스팅 결과를 살펴본 적이 있습니다.

파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선,
파이썬 바이낸스 비트코인 투자 백테스팅 : 이동평균선 매매 기법,

이동평균선은 크게 3가지 정도로 나눌 수 있습니다. 각각 단순 이동평균 SMA(simple moving average), 지수 이동평균 EMA(exponetial moving average), 가중 이동평균 WMA(weighted moving average)입니다. 이 중 이번 포스팅에서는 지수이동평균 EMA를 구해보겠습니다.



시계열 데이터 분석 : 지수이동평균 (EMA, Exponential Moving Averages)

지수이동평균은 최근의 데이터에 가중치를 부여해서 평균을 구하는 방식입니다. 그래서 최근의 가격 변동을 잘 반영해줍니다. 또한 오래된 지수이동평균 데이터가 천천히 사라지므로, 이동평균이 급격하게 변화되지 않습니다.

만약 아래와 같이 5일 동안의 종가를 수집했다면, 지수 이동평균 EMA를 다음과 같이 구할 수 있습니다. 가장 최근 데이터에 가중치를 0.5로 부여한다고 가정해 보겠습니다.

prices = [10, 15, 13, 17, 12]

1일차 EMA : 10
2일차 EMA : 15×0.5 + 10×(1-0.5) = 12.5
3일차 EMA : 13×0.5 + 13×(1-0.5) = 12.75
4일차 EMA : 17×0.5 + 13×(1-0.5) = 14.875
5일차 EMA : 12×0.5 + 15.4×(1-0.5) = 13.4375

이를 식 하나로 만들어보면 다음과 같습니다.

EMA(i) = k * price(i) + (1-k) * EMA(i-1)

단순이동평균의 경우, 3일치 종가를 더하고 3으로 나눈 것이니까, 평균에서 오늘 종가가 차지하는 비중은 1/3이 됩니다. 이를 소수로 바꾸면 0.333333이니까, k = 0.333333인 것과 마찬가지입니다. 지수이동평균에서 k=0.5이라고 한다면, 최근 종가에 큰 가중치가 부여된 것입니다.


판다스에서 지수 이동평균 EMA 구하는 방법

파이썬 판다스 패키지는 지수이동평균을 구할 수 있는 함수인 ewm()을 제공합니다. 참고자료 1에서처럼 ewm()에 넘겨주는 파라미터는 여러 가지가 있지만, 가장 중요한 것은 가중치이니까, 가중치와 관계된 파라미터만 살펴보겠습니다.

(1) ewm() 함수의 가중치 ; alpha

위의 식에서 k에 해당하는 값이 ewm() 함수에서는 alpha입니다. alpha를 평활계수(smooth factor)라고 부릅니다. alpha가 커질수록 최근 가격에 더 큰 가중치를 부여하게 됩니다.

(2) ewm() 함수의 가중치 ; span, adjust=False

단순이동평균선에서 5일선, 15일선처럼 정한 기간은 직관적입니다. 이 기간을 다른 말로는 시간간격의 개수를 의미합니다. 일봉을 기준으로하면 5일 이동평균에서 시간간격의 개수는 5개가 됩니다. 이와 같이 1시간 봉을 기준으로한다면 5시간 이동평균선에서 시간간격의 개수는 5개입니다.

단순이동평균에서처럼 지수이동평균에서도 시간간격의 개수를 정할 수 있습니다. ewm() 함수에서 이 시간간격에 해당하는 파라미터가 span입니다. span을 넘겨주면, 이로부터 ewm() 함수는 가중치 alpha를 아래와 같이 계산합니다. 만약 span=3이라고 입력했다면, alpha는 0.5가 됩니다.

alpha = 2/(span + 1)

(3) ewm() 함수의 가중치 ; span

ewm() 함수의 파라미터를 넘겨줄 때, span과 adjust = False를 함께 넘겨주면, ewm() 함수는 span으로부터 평활계수 alpha를 구한 후 지수이동평균을 구합니다. 그러니까 지수 이동평균을 구하는 아래 식이 그대로 적용됩니다.

EMA(i) = k * price(i) + (1-k) * EMA(i-1)

그런데, adjust = False를 생략하면, 지수 이동평균을 구할 때, 전체 구간에서의 모든 종가들이 포함됩니다. 물론 오래된 종가일수록 현재 지수 이동평균에 미치는 영향이 적어지지만 말입니다.


파이썬 코드 : 지수 이동평균

지금까지 알아봤던 이동평균을 서로 비교할 수 있도록 파이썬 실습코드를 구성하였습니다. 주석부분과 print문을 보시면서, 각 이동평균을 비교해보시기 바랍니다. 코드 내의 주요 변수는 다음과 같습니다.

▶sma3 : 3일 단순 이동평균
▶ema_alpha_adj_False : 지수이동 평균, alpha, adjust=False 입력
▶ema_alpha : 지수이동 평균, alpha 입력
▶ema3_span_adj_False : 3일 지수 이동평균, span, adjust=False 입력
▶ema3_span : 3일 지수 이동평균, span 입력




마치며 …

이번 포스팅에서는 시계열 데이터 분석에서 많이 사용되는 지수 이동평균에 대해 알아보았습니다. pandas의 ewm().mean() 함수로 지수 이동평균을 쉽게 구할 수 있었는데, 최근 데이터에 얼마만큼의 가중치를 부여할지를 결정하는 파라미터인 alpha와 span의 활용법을 기억해 주시기 바랍니다.

 

 

함께 참고하면 더 좋은 글 :
1. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
2. 파이썬 바이낸스 API로 차트 분석. 판다스 스토캐스틱
3. 파이썬 바이낸스 API로 차트 분석. 판다스 RSI (상대강도지수)
4. 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
5. 파이썬 바이낸스 API로 차트 분석. 비트코인 가격 일간 변동률
6. 파이썬 바이낸스 API로 시계열 데이터 분석. 최대 낙폭 (MDD)
6. 바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
7. 바이낸스 API, 판다스로 시계열 데이터 분석. 현금흐름지수 MFI
8. 파이썬 프로그래밍 시작


참고자료

pandas.DataFrame.ewm

Leave a Comment