3. 이동평균을 구하는 방법
• 단순 이동 평균(Simple Moving Average)
• 가중 이동 평균(Weighted Moving Average)
• 지수 이동 평균(Exponential Moving Average)
참조 : http://pepic.tistory.com/255
4. 이동평균 비교
• 단순 이동 평균(Simple Moving Average)
– 개념이나 구하는 방법은 간단하지만, 현재값의 반영이 느림
• 가중 이동 평균(Weighted Moving Average)
– 현재의 값에 비중을 더 두어 평균을 구함
• 지수 이동 평균(Exponential Moving Average)
– 오래된 값도 버리지 않고, 현재의 이동평균에 반영
5. 단순 이동평균 with python
• 단순 이동 평균(Simple Moving Average)
def sma(dataset, window):
weight = np.repeat(1,window) #가중치
a = (np.convolve(dataset,weight,'valid') / weight.sum()).tolist() # 합성곱을 이용하여 평균구함
[a.insert(0,np.nan) for i in range(window-1)] # 빠진 갯수만큼 nan 채우기
return a
dataset = np.arange(0, 11, 1.0)
print sma(dataset,3)
pprint.pprint(sma(np.random.rand(10),5))
[nan, nan, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
[nan,
nan,
nan,
nan,
0.6846600727316047,
0.7979787565611873,
0.8567790817007008,
0.7467720330518219,
0.7187438722607699,
0.7300641782033382]
6. 가중 이동평균 with python
• 가중 이동 평균(Weighted Moving Average)
def wma(dataset, window):
weight = np.linspace(1, 0, window+1)[:-1] #가중치
a = (np.convolve(dataset,weight,'valid') / weight.sum()).tolist() # 합성곱을 이용하여 평균구함
[a.insert(0,np.nan) for i in range(window-1)] # 빠진 갯수만큼 nan 채우기
return a
dataset = np.arange(0, 11, 1.0)
pprint.pprint([round(val, 4) for val in wma(dataset, 3)])
window = 3
print np.linspace(1, 0, window+1)[:-1]
[nan,
nan,
1.3333,
2.3333,
3.3333,
4.3333,
5.3333,
6.3333,
7.3333,
8.3333,
9.3333]
[ 1. 0.66666667 0.33333333]
7. 지수 이동평균 with python
• 지수 이동 평균(Exponential Moving Average)
def ema(dataset, window):
weight = float(2) / (window + 1) # 지수이동평균식 가중치
result = []
for index, value in enumerate(dataset):
if not result: # dataset[0]은 계산하지 않음
result.append(value)
else:
# dataset[1] 이상부터 지수 평균계산 시작, 계산은 dataset[1]부터 시작하지만, result[window - 1] 부터 window가
적용된 값
result.append((value * weight) + (result[-1] * (1-weight))) #지수이동평균식을 Python Code로
return result
dataset = np.arange(0, 11, 1.0)
pprint.pprint(ema(dataset, 3))
[0.0,
0.5,
1.25,
2.125,
3.0625,
4.03125,
5.015625,
6.0078125,
7.00390625,
8.001953125,
9.0009765625]