배고픈 개발자 이야기

[2021/08/31] 파이썬 머신러닝 (시계열 분석_지수이동평균) 본문

인포섹 아카데미

[2021/08/31] 파이썬 머신러닝 (시계열 분석_지수이동평균)

이융희 2021. 8. 31. 15:46
728x90

Exponential Moving Average

 

다음과 같이 주단위로 8주의 데이터를 생성한다.

 

아래 myEWMA는 지수이동평균값을 df.ewm(span=3).mean()과 같이 계산해주도록 정의한 메소드이다.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "week":pd.date_range(start="2020-08", periods=8, freq="W"),
    "sales":[39,44,40,45,38,43,39,np.nan],
    "3EMA":[0]*8
})

# 지수 이동 평균을 계산할 함수
# data: 지수 이동 평균을 계산할 데이터
# span: 지수 이동 평균의 거리 (강의 자료에서는 3주마다의 지수 이동 평균이므로 3)
def myEWMA(data, span):
  # 지수 이동 평균을 계산해서 저장할 리스트
  ewma=[0]*len(data)
  # 지수 이동 평균의 분자
  molecule=0
  # 지수 이동 평균의 분모
  denominator=0
  # 값에 곱해지는 가중치
  alpha = 2.0 / (1.0 + span)

  for i in range(len(data)):
    # 분자 계산 data+(1-alpha)앞의 데이터
    molecule = (data[i] + (1.0-alpha)*molecule)
    # 분모 계산 (1-alpha)의 i승
    denominator+=(1-alpha)**i
    print("index:",i)
    print("molecule:",molecule)
    print("denominator:",denominator)
    # 지수 이동 평균 계산
    ewma[i] = molecule/denominator
    print("ewma",ewma[i])
    print("="*100)
  
  return ewma

 

먼저 pandas 내장함수로 span이 3, 즉 3주간의 지수이동평균값을 구하면 아래와 같다.

df[["sales"]].ewm(span=3).mean()

정의한 함수로 일부분의 데이터를 똑같이 계산해 보았을 때 아래와 같이 같은 결과가 나오는것을 볼 수 있다.

myEWMA(df["sales"].iloc[0:2],3)

 

컬럼에 구한값을 추가한다.

df["3EMA"]=df[["sales"]].ewm(span=3).mean()

 

 

- 주식가격 예측

아래는 애플사의 종가 그래프

import matplotlib.pyplot as plt
%matplotlib inline

plt.style.use("ggplot")
df = pd.read_csv('apple_stock.csv')
df["Date"]=pd.to_datetime(df["Date"])
df.set_index("Date", inplace=True)
df[['Close']].plot(figsize=(20,10))
plt.title('Close Price for Apple')

 

# 최근 7일 간의 지수이동 평균으로 주식을 예측
df.ewm(span=7).mean().head()

 

 

종가와, 7일간의 지수 이동평균값을 그린 그래프

from datetime import datetime

# 2019년 1월 2일 생성
last_day=datetime(2019,1,2)

# 1월 2일의 종가를 결측치로 대입
df.loc[last_day, 'Close']=np.nan

# 7일간 종가의 지수이동 평균을 계산하여 컬럼에 추가
df['Close_7Days_Mean'] = df['Close'].ewm(span=7).mean()

# 실제 종가와 예측값을 조회
df[['Close', 'Close_7Days_Mean']].plot(figsize=(30,20))

 

 

# 월단위 샘플링
df_monthly = df.resample(rule='M').mean()
# 마지막 컬럼 제외
df_monthly = df_monthly.iloc[:,:-1]
df_monthly[['Close']].plot(figsize=(20,10))
plt.title('Monthly Mean Close Price for Apple')

 

월단위 종가와 3개월단위 지수이동평균값을 그린 그래프

df_monthly['Close_3Month_Mean'] = df_monthly['Close'].ewm(span=3).mean()
df_monthly[['Close', 'Close_3Month_Mean']].plot(figsize=(15,20))

Comments