이동 평균

마지막 업데이트: 2022년 7월 24일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
그럼 그냥 평균이라고 쓰면 되는데 왜 굳이 이동평균이라고 사용할까요?

이동평균선

주가, 거래량, 거래대금 등을 지나간 평균적 수치로 계산해서 그래프화 시켜놓은 선으로 보통 주가 이동평균선을 이동평균선이라 부릅니다.

일정기간 동안의 종가기준 주가를 산술평균 한 값인 주가 이동평균을 차례로 연결하여 만든 선으로 주가가 상승하기 위한 첫 단계가 주가가 이동평균선을 이동 평균 돌파하는 모습이 나타나는 것입니다.

표를 보며 설명 드리겠습니다. 최근 5일간 주가수준이 9800, 9900, 10000, 10100, 10200원 이라고 한다면 5일 평균 주가이동평균 가격은 10000원 입니다. 다음날 종가가 10300원 이라고 한다면 6일전 가격인 9800원을 제외한 나머지 가격과 10300원의 평균 가격인 10100원이 주가 이동평균 가격이 되고 그것을 연결한 선이 5일 이동 평균 이동평균선이 됩니다. 즉, 이동평균선의 상향은 주가의 상승을 나타내는 부분이 되는 것입니다.

D-4 D-3 D-2 D-1 D 이동평균
9800 9900 10000 10100 10200 10000
9900 10000 10100 10200 10300 10100
10000 10100 10200 10300 10400 10200

해당 기간 별로 이동평균선의 이름이 있으며 각 이름들이 이동평균선의 특징을 나타냅니다. 5일 이동평균선은 심리선, 20일 이동평균선은 세력선 / 생명선, 60일 이동평균선은 중기 수급선, 120일 이동평균선은 경기선이라 불리 웁니다.

단기 이동평균선 > 장기 이동평균선 상태를 정배열 상태라고 하며 주가의 추세적 상승이 나타나는 구간이며 장기 이동평균선

일반적으로 주가가 이동평균선을 돌파하는 시점이 의미가 있는 매매타이밍이며, 각 이동평균선들의 위치로 추가적인 매매타이밍을 판단할 수 있습니다. 즉, 단기 이동평균선이 장기 이동평균선을 돌파하는 골든 크로스 발생시 주식을 매수하고 반대의 경우인 데드크로스 발생시 주식을 매도하는 방법을 사용합니다.

아래 차트를 보시면서 매매타이밍에 대한 시점을 말씀드리겠습니다. 파란동그라미로 표시된 선이 주식의 매도 그리고 빨간 동그라미로 표시된 곳이 주식의 매수타이밍을 뜻합니다.

이동평균선은 후행성 지표이기 때문에 미래의 주가를 예측하는데 다소 어려운점이 있을수 있지만, 보기가 편해서 지지와 저항의 의미를 한눈으로 확인할 수 있고, 기계적인 매매가 가능하며, 주관적인 판단이 개입될 여지가 적다는 점에서 투자자들에게 매우 유용한 보조지표입니다.

이동 평균

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

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

RSI(Relative Strength Index) 계산방법

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

이동평균(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

사실 매번 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번째 데이터] )

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값은 계산됩니다.

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

3.1.1. 이동평균법

그럼 그냥 평균이라고 쓰면 되는데 왜 굳이 이동평균이라고 사용할까요?

평균과 이동평균의 가장 큰 차이점은 시간이라는 개념입니다.

앞절에서 리스크를 이야기할 때도 시간이라는 개념을 이동 평균 언급했습니다.

학자들을 위험선호이기 때문에 기대값이 음수임에도 불구하고 로또를 구매한다고 이야기 합니다.

하지만 저의 생각은 다릅니다. 로또를 통해 얻을 수 있는 금전적 기대값은 비록 음수이지만, 시간적 기대값은 양수입니다.

투자에 있어서 의외로 시간의 개념은 너무 과소 평가되고 있습니다.

다시 평균과 이동평균에 대해서 이야기 하겠습니다.

평균은 동일시점에서 산출되는 것이 흔한 반면, 이동평균은 동일 대상이지만 시점이 서로 상이해서 발생합니다.

본체는 동일하나 시점이 다릅니다.

비록 같은 나이지만, 어제의 나와 오늘의 나는 서로 동일하다고는 할 수 없습니다.

2002년 16강 월드컵 때 패널티 킥을 실축한 시점에서 안정환과 연장전에서 역전 결승골을 넣은 안정환은 동일 인물이지만, 불과 몇시간만에 사람들에게서 평가가 전혀 달라집니다.

고작 2시간 남짓밖에 안되는 시간이지만, 이 때 안정환에 대한 팬들의 기대치를 평가하면 매우 큰 변화가 나타날 것입니다.

3시간도 안되는 상황에서 선수에 대한 기대치는 급변하는 것을 느낄 수 있습니다.

8강 경기가 시작될 때 안정환 선수에 대한 팬들의 기대치는 어느 정도 될까요?

각 시점의 기대치를 단순 합해서 나누는 방법을 사용할 수도 있습니다.

가장 마지막 기대치를 통해 측정할 수도 있습니다.

가장 최근 기대치에 가장 많은 가중치를 주어서 측정할 수도 있습니다.

평균은 동일 시점에서 발생하기 때문에 단순 평균이 많이 사용됩니다.

하지만 시간시점이 다를 경우 최근의 정보가 더 많은 영향력을 미칠 수 있기 때문에

최근에 단순 평균보다 최근 정보에 가중치를 더 주는 방법을 사용할 수도 있습니다.

그 결과 이동평균을 구하는 방법엔

단순이동평균(Simple Moving Average)

가중이동평균(Weighted Moving Average)

지수이동평균(Exponential Moving Average)

단순이동평균(이동 평균 Simple Moving Average)

일반적인 평균을 구하는 방법입니다.

n1 , n2, n3 가 존재한다고 가정하면, (n1 + n2 + n3) / 3 입니다.

가중이동평균(Weighted Moving Average)

n1 , n2, n3 가 존재한다고 가정하고 각각의 가중치를 w1, w2, w3라고 하면

(w1n1 + w2n2 + w3*n3) / (w1 + w2 + w3) 입니다.

일반적으로 최근일에 높은 가중치를 줍니다.

상황에 따라서 이벤특 발생한 특정일에 높은 가중치를 주어 사용할 수도 있습니다.

지수이동평균(Exponential Moving Average)

최근에 이동 평균 높은 가중치를 주지만, 오래된 과거도 비록 낮은 영향력이지만 가중치를 두여하도록 고려한 방법입니다.

EMV(t) = (1-w) * EMV(t-1) + w * Price(t)

오늘의 종가에 w의 가중치를 주고 (1-w)를 어제의 이동평균에 주는 방식입니다.

EMV(t) = (1-w) * ((1-w) * EMV(t-2) + w * Price(t-1)) + w * Price(t)

결국 과거의 값도 지속적으로 영향력이 잔존하게 됩니다.

이동평균법

주식 관련 책이나 방송을 보면, 골든크로스, 데드크로스라는 용어를 들어본 적이 있을 것입니다. 이는 가장 널리 알려진 기술적 지표인 이동평균선을 이용한 지표들입니다.

이동 평균법은 단기 추세가 장기 추세를 상향 돌파하면 매수, 하향돌파하면 매도를 합니다.

추세가 있다면, 통계적인 관점에서 자기 상관관계가 존재할 가능성이 높습니다. 자기 상관관계가 높으면 추세를 형성할 가능성이 더 높게 됩니다. 즉, 기초자산이 random보다 자기상관 관계가 이동 평균 높을 때, 상승 추세 하락 추세가 더 강하게 나타납니다. 그렇기 때문에 이동평균법을 적용할 때는 기초자산의 수익률의 자기 상관관계를 살펴서 투자 자산을 선별하면 보다 높은 성공확률을 얻을 수 있습니다.

변수명은 MA_m_N로 설정하고 이 값을 데이터프레임에 join함수를 이용해서 추가 시켰습니다.

대신은 배열[0]에 최신 데이터가 저장됩니다. 하지만 pandas 기본설정은 배열[0]을 가장 오래된 데이터로 인식합니다. 따라서 이동평균을 구하기 위해서 역순의 값이 필요하여, 이를 위해 사전에 fnSortDateTime(m_Df)를 통해 재배열하여 테이터를 사용하겠습니다.

시스템 트레이딩에 이용하기 위해서 시그널 라인을 포함시켰고, 매수 매도의 연속성을 나타내기 위해서 run함수를 사용하였습니다.

데이터 가공용( 데이터 오름차순으로 재정렬)

데이터 오름차순으로 재정렬 오름차순을 기준으로 작성된 코드가 일반적인데, 대신에서는 날짜 내림차순으로 데이터를 쏴주는 것이 기본으로 되어있습니다. 따라서 데이터를 한번 재가공하기 위해 다음 함수를 사용하겠습니다.

pandas update 이후 형태가 아래처럼 바뀌었습니다.

지수이동평균 부분 내용중 = (1-w)^2 * EMV(t-2) + (1-w )*w* Price(t-1)) + w * Price(t-1)) 여기서 마지막에 w * Price(t) 아닌가요? - 유승, 2020년 10월 30일 7:39 오전

이동 평균[MA]의 정의

이동 평균[MA]은 연속적인 관측치들의 모조 부분군으로부터 계산되는 평균입니다. 시간 가중 데이터에 대해 이동 평균[MA] 관리도를 생성할 수 있습니다. Minitab은 시계열 분석에서 데이터를 평활화하고 시계열의 랜덤한 변동을 줄이기 위해 이동 평균[MA]을 사용합니다.

예를 들어 한 사무용품 제조업체에서 매일 재고 수준을 점검한다고 가정합니다. 길이 2의 이동 평균[MA]을 사용하여 데이터를 평활화하고 재고 수준을 추적하려고 합니다. 업체에서는 한 제품에 대해 이동 평균 8일간 데이터를 수집합니다.

1 2 3 4 5 6 7 8
재고 수준 4310 4400 4000 3952 4011 4000 4110 4220
이동 평균[MA] 4310 4355 4200 3976 3981.5 4005.5 4055 4165

첫 번째 이동 평균[MA]은 4310으로, 첫 번째 관측치의 값이며, 시계열 분석의 경우에는 이동 평균[MA] 계열의 첫 번째 값(결측값)을 계산하지 않습니다. 다음 이동 평균[MA]은 처음 두 관측치의 평균 (4310 + 4400) / 2 = 4355입니다. 세 번째 이동 평균[MA]은 관측치 2와 3의 평균 (4400 + 4000) / 2 = 4200이며, 이러한 방식으로 계속 계산합니다. 길이가 3인 이동 평균[MA]을 계산하려면 두 개 값 대신 세 개 값의 평균을 구하면 됩니다.

이동 평균[MA] 에 대한 방법 및 공식

이동 평균[MA]을 계산하기 위해 Minitab에서 계열 내 관측치의 연속적 그룹의 평균을 구합니다. 예를 들어, 계열이 숫자 4, 5, 8, 9, 10으로 시작하고 길이가 3인 이동 평균[MA]을 사용한다고 가정합니다. 이동 평균의 세 번째 값은 4, 5, 8의 평균, 네 번째 값은 5, 8, 9의 평균, 다섯 번째 값은 8, 9, 10의 평균입니다.

중심화된 이동 평균[MA]

기본적으로 이동 평균[MA] 값은 해당 값이 계산되는 기간에 배치됩니다. 예를 들어, 이동 평균[MA] 길이가 3인 경우 첫 번째 숫자 이동 평균[MA] 값은 기간 3에 배치되고 그 다음 이동 평균[MA] 값은 기간 4에 배치되는 식입니다.

이동 평균[MA]을 중심화하면 범위의 끝이 아니라 중심에 이동 평균[MA]이 배치됩니다. 이동 평균[MA]의 중심화는 이동 평균[MA] 값을 중심이 되는 시점에 배치하기 위해 수행됩니다.

이동 평균[MA] 길이가 홀수인 경우

이동 평균[MA] 길이가 3이라고 가정합니다. 이 경우, Minitab에서는 첫 번째 숫자 이동 평균[MA] 값을 기간 2, 다음 값을 기간 3에 배치하고, 이런 식으로 계속합니다. 이 경우 첫 번째 기간과 마지막 기간의 이동 평균[MA] 값은 결측값( *)이 됩니다.

이동 평균[MA] 길이가 짝수인 경우

이동 평균[MA] 길이가 4라고 가정합니다. 기간 2.5에는 이동 평균[MA] 값을 배치할 수 없기 때문에 Minitab에서는 처음 네 값의 평균을 계산하고 MA1 이름을 지정합니다. 그런 다음 Minitab에서는 다음 네 값의 평균을 계산하고 MA2 이동 평균 이름을 지정합니다. 이 두 값의 평균이 Minitab에서 기간 3에 배치하는 숫자입니다 이 경우 처음 두 기간과 마지막 두 기간의 이동 평균[MA] 값은 결측값( *)이 됩니다.

시간 t에서의 적합치는 시간 t – 1에서의 중심화되지 않은 이동 평균[MA]입니다. 예측값은 예측시점에서의 적합치입니다. 10 시간 단위 이후를 예측할 경우 각 시간에 대해 예측된 값은 예측시점에서의 적합치가 됩니다. 이동 평균[MA]을 계산하는 데는 예측시점까지의 데이터가 사용됩니다.

연속적 이동 평균[MA]으로 선형 이동 평균[MA] 방법을 사용할 수 있습니다. 이 방법은 데이터에 추세 성분이 있는 경우에 자주 사용됩니다. 먼저 원래 계열의 이동 평균[MA]을 계산하고 저장합니다. 그런 다음 이전에 저장한 열의 이동 평균[MA]을 계산하고 저장하여 두 번째 이동 평균[MA]을 구합니다.

단순 예측에서 시간 t에 대한 예측값은 시간 t – 1에서의 데이터 값입니다. 이동 평균[MA] 길이를 1로 하여 이동 평균[MA] 절차를 사용하면 단순 예측이 됩니다.

예측 한계

상한 = 예측값 + 1.96 ×

하한 = 예측값 – 1.96 ×


0 개 댓글

답장을 남겨주세요