이동평균에 대해 잘 모르겠다면, 비록, 차트 분석에 맞추어 설명하였지만 이 포스트를 참조하기 바란다.
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() 메소드와 결합하면 이동평균을 구할 수 있다.
이미 이 그림으로 모든 이해가 다되었겠지만, 글로써 다시 설명하자면~
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에서 필수적인 파라미터는 windows와 min_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)에서 지수 가중(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에 처음 등장했는데, 뭔지 모르겠다.
끝~
'파이썬 (투자분석용) > Pandas 및 python 일반' 카테고리의 다른 글
[python] 네이버금융 주요 재무정보 스크래핑 (0) | 2022.02.26 |
---|---|
[python] Pandas, 데이터프레임 비교하기(pandas.DataFrame.compare()) (0) | 2022.02.10 |
판다스 데이터프레임과 Lambda 함수의 이해와 사용법 (0) | 2022.02.04 |
[python] 한국증시(코스피, 코스닥) 주가정보 추출 feat. by 네이버금융 (0) | 2022.02.01 |
[python] 한국증시(코스피, 코스닥) 종목코드 받아오기 (0) | 2022.01.29 |
댓글