본문 바로가기

투자(기술적분석)/용어

이동평균(Moving Average)의 계산방법 및 의미

이전에 포스팅에서, RSI수치를 구할 때 이동평균(Moving average)를 이용한다고 하였는데요,

이번에는 이것에 대해 더 자세히 알아보려고 합니다.

 

primestory.tistory.com/8

 

RSI(Relative Strength Index) 계산방법

RSI는 30이하/70이상 일 때, 시장이 과매도/과매수인지를 판별함으로서 투자에 활용할 수 있는 유용한 지표입니다. 이번에 다룰 내용은 이것의 구체적인 계산방법입니다. 1. 데이터 추출 시간순서

primestory.tistory.com

 

이동평균(moving average)이란, 말 그대로 어떤 것이 방향성을 가지고 움직일 때, 이동하면서 구해지는 평균을 뜻합니다. 즉, 동적으로 변화하는 것에는 어디든 이동평균을 적용할 수 있습니다. 주가데이터 또한, 1차원적인 방향성을 가지고 이동하기 때문에 이동평균을 적용할 수 있습니다. 

 

1. 단순이동평균(simple moving average, SMA)

 

맨 오른쪽이 최신 데이터인 주가 데이터가 있다고 가정합니다.

 

U = [4, 1, 1, 2, 4, 11, 0, 0, 4, 2, 8]

 

먼저, 단순이동평균은 몇일을 기준으로 할 것인지 정해주어야 합니다.

우리는 m일의 평균을 구한다고 가정해봅시다. (window의 크기를 결정한다고도 합니다.)

 

구하는 방식은 다음과 같습니다.

 

n번째 데이터의 단순이동평균 = n번째 데이터를 포함한 왼쪽  m개의 데이터의 산술평균

 

이해를 돕기 위해, m=6이라고 가정해보겠습니다.

 

n = 1일 경우, '1번째 데이터의 이동평균 = 1번째 데이터를 포함하여 왼쪽의 6개의 데이터의 산술평균' 이 되겠군요.

 

그런데, 1번째 데이터를 포함하여 왼쪽에 6개 데이터가 있나요? 존재하지 않습니다. 이런 경우, 평균을 구할 수가 없습니다.

 

따라서, 값 11에 해당하는 6번째 데이터부터 구할 수가 있을 것입니다.

 

n = 6일 경우, (4+1+1+2+4+11)/6 = 3.833

n = 7일 경우, (1+1+2+4+11+0)/6 = 3.167

...

n = k일 경우, ....

...

 

사실 매번 m = 6개를 더해줄 필요 없이, (이전의 이동평균)+ (들어온 가장 최신의 값 - 나간 가장 오래된 값)/m 을 해주면 될 것입니다. 

 

이렇게 해서 이동평균을 구하게 될 경우, 각 데이터의 이동평균은 아래와 같이 구해집니다.

NaN(Not a number)은 연산이 불가능하다는 의미입니다.

 

simple moving average = [NaN, NaN, NaN, NaN, NaN, 3.833, 3.167, 3, 3.5, 3.5, 4.5]

 

눈치채셨겠지만, 이러한 moving average는 window의 크기,  m의 값에 큰 영향을 받습니다. 왜냐하면, m의 크기에 따라 몇개의 이전 데이터로 계산할지가 결정되기 때문입니다. window크기보다 더 이전의 데이터는 이동평균에 영향을 미치지 못한다는 단점이 있습니다. 이런 이유로 여러 다른 이동평균이 사용됩니다.

 

2. 누적이동평균(Cumulative moving average, CMA)

 

누적이동평균은, simple moving average와 같이 산술평균을 구하는 것은 동일하나, window (m값)을 정해놓지 않습니다.

따라서, 모든 데이터를 고려하고 싶을 때 사용합니다.

이것은, 새로운값이 들어올때마다 전체 평균을 새롭게 구하는 것과 동일합니다. 다시 이전의 데이터를 가져와 보겠습니다.

 

U = [4, 1, 1, 2, 4, 11, 0, 0, 4, 2, 8]

 

구하는 방식은 다음과 같습니다.

 

n번째 데이터의 누적이동평균 = n번째 데이터를 포함한, 이전 모든 데이터의 평균

 

n = 1일 경우, 1번째 데이터를 포함한, 이전 모든 데이터의 평균이므로 그냥 4가 되겠군요.

n = 2일 경우, 2번째 데이터를 포함한, 이전 모든 데이터의 평균이므로, (4+1)/2

n = 3일 경우, 3번째 데이터를 포함한, 이전 모든 데이터의 평균이므로, (4+1+1)/3

....

마지막 데이터의 누적이동평균은 결국 전체 데이터의 평균이 될 것임을 알 수 있습니다.

 

계산은 n+1번째 이동평균 = (n번째 누적이동평균*n + 새로 들어온 값)/(n+1) 을 이용하면 

매번 모든 것을 더하지 않고 계산 할 수 있음을 확인할 수 있습니다.

 

cululative moving average = [4, 2.5, 2, ...] 

 

이러한 결과는 이전의 모든 데이터를 포함하게 되므로, simple moving average과 다르게 이전의 모든 데이터의 영향을 받게 됩니다. 하지만, 우리는 최신의 데이터가 훨씬 현재의 상황을 더 잘 반영해 준다고 생각하기 때문에, 최신의 데이터가 더 큰 영향력을 발휘하기를 원합니다. 따라서, 또 다른 방식을 이용하게 됩니다.

 

3. (선형)가중이동평균(weighted moving average, WMA)

 

가중이동평균은, 데이터의 위치에 따라 서로 다른 가중치를 부여한 후 이동평균을 계산하게 됩니다.

simple moving average와 동일하게 몇일을 기준으로 구할 것인지 window의 크기 m을 지정해 주어야 합니다.   

 

구하는 방식은 다음과 같습니다. 

 

A = dot product( [m, m-1, m-2, ... , 1],  [n번째 데이터, n-1번째 데이터, ... , n-m+1번째 데이터] )

B = m + (m-1) + ... +1

 

n번째 데이터의 선형가중이동평균 = A / B

 

이러한 방식을 선형가중이동평균이라고 합니다. 왜냐하면, 오래된 데이터로 갈 수록 곱해지는 값이 선형적으로 감소하기 때문입니다. 이 또한, 수학적으로 식을 변형하면, 매번 전체를 계산하지 않고 구할 수 있습니다.

 

참고) 왜 이것이 평균의 의미를 갖는지 궁금해 하실 수도 있습니다. 지금은 곱해지는 값이 선형적으로 감소하지만, 이것이 선형적이지 않고 상수함수의 형태라고 생각해보겠습니다. 그렇다면, 아래와 같은 식의 꼴일 것입니다.

 

A = dot_product( [m, m, m, ...., m], [n번째 데이터, n-1번째 데이터, ...., n-m+1번째 데이터] )

B = m+m+m... +m

 

A/B를 계산하면, 이것은 단순히 m = 6 인 simple moving average와 동일하게 됩니다. 즉, simple moving average 또한 사실 위의 꼴인데 그것을 상수함수가 아닌 선형함수로 변형해서 평균을 구하였다고 생각하면 될 것 같습니다.

 

어쨌든 이러한 방식은, 최신의 데이터에 더 큰 가중치 곱함으로서 최신의 데이터가 결과에 더 큰 영향력을 발휘하게 합니다. 

하지만, 목적에 맞추어 조금 더 유연하게 활용하기 위해 비선형적인 방식으로 곱해갈 수도 있습니다. 

 

4. 지수가중이동평균 (Exponentially weighted moving average, EWMA)

 

지수적으로 감소하는 가중치를 곱해준다는 의미만 다르고, 선형가중이동평균과 본질은 동일합니다.

 

따라서, 구하는 방식은 다음과 같습니다.

 

A = dot product( [ 1 , (1 - α) , (1 - α)^2 , ... , (1 - α)^(m-1) ],  [n번째 데이터, n-1번째 데이터, ... , n-m+1번째 데이터] )

B = 1 + (1 - α) + (1 - α)^2+ ... + (1 - α)^(m-1)

 

n번째 데이터의 지수가중이동평균 = A / B

 

이것은 다음과 같은 식으로 변형할 수 있습니다.

따라서, 현재의 지수가중이동평균은 바로 이전의 데이터의 지수가중이동평균을 이용하여 구할 수 있음을 보여줍니다.

 

위의 식을 다시 쓰면 다음과 같습니다.

 

1번째 지수가중이동평균 = 1번째 데이터 값

n번째 지수가중이동평균 = (1 - α ) * (n-1번째 지수가중평균) + α * 현재 데이터값

 

따라서, 가장 오래된 데이터부터 시작해서 재귀적(recursive)하게 가장 최근의 데이터까지 지수가중이동평균을 구할 수 있습니다. 새로운 데이터가 추가되어도 재귀적으로 바로 구할 수 있습니다.

 

이 때, α 값은 다음과 같은 세가지 방식 중 하나로 구해질 수 있습니다. 이것은 우리가 임의로 설정해 줄 수 있고, 각자가 가지는 의미는 다양합니다만 저도 사실 아주 자세히는 아직 살펴보지 않았습니다. 아마도 물리적인 의미를 가지고 있지 않을까 생각해 봅니다. 

 

그렇다면 우리가 자주사용하는 RSI 14지표에 대해 설명할 수 있습니다.

Wilder는 RSI 14를 추천했으며, α = 1/14 에 해당합니다. 즉 ,  c = period -1

window의 크기는 정해져 있지 않고, 새로운 데이터가 들어올 때마다 RSI값은 계산됩니다.

 

 

5. 더 나아가서

 

핵심은, 각기 다른 이동평균도 결국은 이동평균이라는 큰 맥락에서 벗어나지 않는다는것 같습니다. 제 생각에는, 적절한 목적에 맞게 각자 다른 이동평균을 고려하는 것은 중요함과 동시에, 비선형적인 새로운 방식으로 가중치를 주는 것은 하나의 시도가 될 수도 있을 것 같습니다. 또는, 단순 dot product의 형태에서 벗어나 새로운 형태를 고안해보는것도 좋은 시도일 것 같습니다. 물론, 그것은 특정한 목적과 아이디어가 필요하다고 생각됩니다.. 또한, 수학적으로 충분히 의미를 함포하고 있어야 할 것이라고 생각됩니다.