Loading [MathJax]/jax/output/CommonHTML/jax.js

[Python]Moving Average & Disparity - 1. 종류

2021. 7. 27. 23:03Python/Visualization

  주식 시장에 관심을 두거나 주식 시장에서 매매 경험을 해 본 사람이라면 이동평균선이격도에 대해 들어보았을 것이다. 차트를 분석하는 사람들이라면 거의 빼놓지 않고 보는 지표이다. 필자는 차티스트가 아니지만 실제로 주식 매매에 참고하는 지표 중 하나이다. 실제로는 단순히 이동평균을 이용하지 않고 현재의 주가가 이동평균과 얼마나 떨어져 있는가, 즉 이격도를 초점으로 둔다.

1. 이동평균(Moving Average; MA)의  종류

 이동평균에도 다양한 종류가 있는데, 세 가지만 알아보겠다. '단순 이동평균', '가중 이동평균', '지수가중 이동평균'이다.

 

1. 단순 이동평균(Simple Moving Average; SMA)

 단순 이동평균은 데이터의 시점과 상관없이 산술평균을 취한 것이다. t0 시점에서 변수 XW일 단순 이동평균은 다음과 같이 정의된다.

SMAt0,W=1Wt0t=t0W+1Xt

 이렇게 보면 식은 상당히 복잡하지만 그냥 일반적으로 말하는 평균과 다를 바 없다. 일반화하여 쓰려다 보니 복잡해졌을 뿐이다. 여기서 W는 'Rolling Window'에서 따왔다.

 

2. 가중 이동평균(Weighted Moving Average; WMA)

 가중 이동평균은 단순 이동평균과 달리 데이터가 현재와 가까울수록 중요하므로 가중치를 더 할당하는 방식이다. t0시점에서 변수 XW일 가중 이동평균은 다음과 같이 정의된다.

WMAt0,W=t0t=t0W+1wtXt, where wt=W(t0)tΣWi=1i 단순 이동평균보다 더 복잡하다. 그렇지만 여전히 단순하다. 주의할 점은 W는 전과 같이 window를 나타내지만, wt는 가중치를 나타낸다. 이번에는 예를 들어보자. 현재 시점을 t라고 할 때, t시점, 1일 전, ..., 4일 전까지의 데이터를 [5, 3, 2, 1, 4]라고 했을 때의 5일 가중 이동평균은 다음과 같이 계산된다.

WMAt,5=515×5+415×3+315×2+215×1+115×4

 각 항의 첫 번째 값(분수)은 시간 가중치를 나타낸다. 총 5일치 데이터이므로 분모에는 1부터 5까지의 합인 15가, 분자에는 가까운 순서대로 큰 값을 부여한다. 각 항의 두 번째 값은 실제 데이터를 나타낸다. 

 단순 이동평균과 가중 이동평균의 차이점은 이름에서 알 수 있듯이 가중치에 차이가 있다. 단순 이동평균은 모든 값에 동일한 가중치를 부여한다. 즉 window에 포함된 모든 데이터는 동일하게 중요하다고 가정하는 셈이다. 반면, 가중 이동평균의 가중치는 현재 시점에서 가까운 값에 더 큰 가중치를 부여한다. 즉, 더 중요하다고 가정하는 셈이다. 데이터에 따라 어떠한 이동평균을 사용하여야 하는지는 생각해 보아야할 문제이다.

 

3. 지수가중 이동평균(Exponential-Weighted Moving Average; EMA)

 지수가중 이동평균 역시 가중 이동평균의 한 종류이다. 이름에서 알 수 있듯, 가중치를 설정하는 방식이 다소 차이가 있다. 그렇지만 여전히 식만 복잡할 뿐이다. 당황하지 말자. 

St={X1t=1αXt+(1α)St1t>1, where α(0,1)

이전의 두 가지 방식과 확연히 다르다. 하나하나 뜯어보자.

 

1) 우선 Stt시점에서의 EMA값을 나타낸다. 

2) Xtt시점에서 데이터의 값(ex: 주가)을 나타낸다.

3) α는 시간이 지남에 따라 가중치가 감소하는 정도(*the degree of weighting decrease)를 나타내는 값이며,  0과 1 사이의 값을 갖는다.

 

t시점에서의 EMA 값은 t시점에서의 주가 Xtα를 곱한 값과 t1시점의 EMA St1(1α)를 곱한 값을 더하여 구한다. 이 때, 핵심은 α의 설정이다. α가 클수록 과거 값에 대한 가중치가 감소하기 때문이다.

 

cf. Repeated Substitution

St=αXt+(1α)St1=αXt+(1α){αXt1+(1α)St2}=αXt+(1α)[αXt1+(1α){αXt2+(1α)St3}]

의 과정을 반복하면 다음과 같다.

St=α[Xt+(1α)Xt1+(1α)2Xt2++(1α)kXtk]+(1α)k+1Xt(k+1)

 

 해석하자면, t기의 값에는 α를 곱하고, t기 이전의 모든 값에는 (1α)를 떨어진 만큼 거듭제곱하여 더하여 주는 것이다. 즉, t시점에서 멀수록 (1α)만큼이 곱해지므로 더 많이 감소한다. 이 때 α가 클수록 더 급격하게 감소한다. 별 거 아니다! 오히려 이전의 방법들보다 간단하기도 하다!

 

이제 질문이 하나 떠올라야 한다.

 

"그럼 α는 어떻게 구하는데?"

 

"쓰는 사람 마음임." 

 

"그래도 일반적으로 사용하는 방법은 있을 거 아냐?"

 

" 2W+1."

 

예를 들어, 20일 지수가중 이동평균이라면 α=121이 된다. 이 값은 다소 자의적이지만 가장 일반적으로 사용되곤 한다.

 

 다음 글은 지금까지 서술한 이동평균 세 가지를 Python으로 구현하는 방법과 시각화하는 방법에 대해 서술하겠다..!

 

'Python > Visualization' 카테고리의 다른 글