본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

[Pandas] rolling과 ewm으로 이동평균 구하기

by amAToRoi 2022. 2. 8.
반응형

 

 

 

Pandas의 rolling 및 ewm 메소드로 차트 분석에서도 사용되는 이동평균을 구해보자.
이동평균에 대해 잘 모르겠다면, 비록, 차트 분석에 맞추어 설명하였지만 이 포스트를 참조하기 바란다.

0. Data 준비하기

import pandas as pd
raw = [10,20,30,40,50,60,70,80,90,10]
df = pd.DataFrame(raw, columns=['B'])

>>> df
    B
0  10
1  20
2  30
3  40
4  50
5  60
6  70
7  80
8  90
9  10

 

1. 무작정 이동평균 추가해보기

  •  SMA  : 단순이동평균, simple moving average
  •  EMA  : 지수이동평균, exponential (weighted) moving average
# SMA: 단순이동평균(5일) 추가하기
df['SMA'] = df['value'].rolling(window=5).mean()

# EMA: 지수이동평균(5일) 추가하기
df['EMA'] = df['value'].ewm(span=5, min_periods=5).mean()

>>> df
   value   SMA        EMA
0     10   NaN        NaN
1     20   NaN        NaN
2     30   NaN        NaN
3     40   NaN        NaN
4     50  30.0  37.582938
5     60  40.0  45.774436
6     70  50.0  54.351627
7     80  60.0  63.248216
8     90  70.0  72.403630
9     10  62.0  51.235330

 

2. rolling 메소드 이해하기

시간 또는 데이터의 순서에 따라 옮겨가며(rolling), 전체 그룹의 하위집단(window 이내)에 대해서만 계산하기 위한 메소드이다. mean() 메소드와 결합하면 이동평균을 구할 수 있다.

롤링 메소드와 평균의 결합

이미 이 그림으로 모든 이해가 다되었겠지만, 글로써 다시 설명하자면~

value = [10, 20, 30, 40, 50, 60, 70, 80, 90, 10] 은 전체 데이터 그룹(집단)

SMA 의 30.0 은  value 중 빨간색으로 표시된 데이터( [10, 20, 30, 40, 50, 60, 70, 80, 90, 10] )만 바라보며 평균값을 구한 결과이다. 40.0 은 value 중 데이터범위를 1 칸 이동하여( [10, 20, 30, 40, 50, 60, 70, 80, 90, 10] ) 평균값을 구한 결과이다. 이처럼 데이터범위를 1 칸 씩 이동(rolling)하기 때문에 rolling으로 명명된 메소드이다. 

파라미터

메소드를 정확하게 사용하기 위해서는 제공되는 다양한 파라미터를 사용해야하지만, rolling에서 필수적인 파라미터는 windowsmin_periods 이며, 사용하지도 않는 파라미터를 미리 숙지해둘 필요는 없다고 생각한다. 필요하다면, 공식 문서를 찾아 읽어보도록하자. 여기서는 의미만 간단히 설명한다.

  • windows : 사용을 위한 필수값으로 데이터의 개수(int) 또는 offset(시간, string 형식)을 입력하여야 한다. 위의 예에서는 5 개로 규정했다.
    offset은 datetime 형식의 인덱스를 가진 dataframe과 함께 사용됨
  • min_periods : 값을 표시하는 최소 구성원의 수 또는 기간(offset 사용하는 경우)을 의미한다. 상기 'SMA'에서 처음 4개의 데이터가 NaN으로 표시된 이유가 바로 이것이다. 
    별도로 규정하지 않는다면, windows 값과 동일한 값으로 규정된다.
  • center : index를 중앙값의 index로 잡을지, 최 우측값의 index로 잡을지 정할 수 있다.
  • win_type : 집단의 구성원은 기본적으로 동일한 비중이며, 이의 변경이 가능하다.
  • on : 집단(window)을 이동(rolling)하는 기준의 기본은 데이터프레임의 index이지만, 다른 컬럼으로 지정할 수 있다.
  • axis : window 설정 및 이동 방향을 가로 또는 세로로 바꿀 수 있다.
  • method : 1.4.0에 처음 등장했는데, 뭔지 모르겠다.

 

3. ewm 메소드 이해하기

pandas 1.4.0 버전 기준으로는 지수이동평균 만을 구하는데 활용되는 메소드인 듯 하다.

판다스(pandas)에서 지수 가중(EW, exponentially weighted) 계산을 위한 메소드이다. mean() 메소드와 결합하여 지수가중평균을 구할 수 있으며, 파라미터는 다양하지만 2가지만 이해하면 사용하는데 무리가 없다.

 1. 지수이동평균은 다음의 공식으로 이루어지며, 변수는 하나($\alpha$) 이다. 

$$ \begin{align*} & EMA_{첫날} = 첫날종가 \\&EMA_{오늘} = 오늘종가 * \alpha + EMA_{어제}*(1-\alpha) \\& \alpha = 2/(1+N) \end{align*} $$
$\alpha$는 N으로 이루어진 수식이며, N은 N일 평균의 N을 의미한다.

 2. 실제 계산 대상이 몇개되지 않으면( = 무한급수로 수렴됨을 가정할 수 없을 때) 에는 adjust 수식을 사용하는 것이 좋다. 

위 수식은 N이 매우 크다는 가정에 유효하지만, N이 작으면 다음과 같은 수식으로 계산되어야 한다.

$$EMA_{오늘} = \frac{오늘종가+(1+\alpha)전날종가+(1+\alpha)^{2}전전날종가+\cdots +(1+\alpha)^{N}첫날종가}{1+(1+\alpha)+(1+\alpha)^{2}+ \cdots +\alpha)^{N}}$$

파라미터

메소드를 정확하게 사용하기 위해서는 제공되는 다양한 파라미터를 사용해야하지만, ewm에서 필수적인 파라미터는 alpha min_periods 이며, rolling과 똑.같.이. 사용하지도 않는 파라미터를 미리 숙지해둘 필요는 없다고 생각한다. 필요하다면, 공식 문서를 찾아 읽어보도록하자. 여기서는 의미만 간단히 설명한다.

  • alpha : 수식의 $\alpha$와 같은 값이다. 단, alpha 대신 다른 파라미터(com, span, halflife)로 이를 대신할 수 있다.
    • span : 위 수식의 N에 해당된다. 따라서, 차트용으로는 N을 사용하는 것이 가장 편하다.
    • com : center of mass 의 약어로 alpha를 정의한다.
    • halflife : 반감기(절반으로 감소하는데 걸리는 시간)으로 alpha를 정의한다. $\alpha = 1- exp(-ln(2)/반감기)$ 지수이동평균의 의미를 해석하는데는 반감기가 가장 편하지 않을까?
  • min_periods : rolling의 그것과 동일하게 표시하기 위한 최소값으로, 최소값들이 충족되지 않으면 NaN으로 표시한다.
  • adjust : 기본값이 True, 즉, 수정수식을 사용하겠다는 것이기 때문에 건드릴 이유는 없다. 속도 이슈가 있고, 충분히 N이 큰 값으로 EWM을 사용한다면 고민하는 것이 좋겠다.
  • ignore_na : 집단 중 NaN값의 처리 방식을 결정한다.
  • axis : rolling의 그것과 동일하다. 방향!
  • method : 1.4.0에 처음 등장했는데, 뭔지 모르겠다.

 

끝~

반응형

댓글