배고픈 개발자 이야기
[2021/08/31] 파이썬 머신러닝 (시계열 분석_지수이동평균) 본문
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))
'인포섹 아카데미' 카테고리의 다른 글
[2021/09/13] 머신러닝 알고리즘 - LGBM (0) | 2021.09.13 |
---|---|
[2021/09/06] DNN_CNN (선형회귀 분석) (0) | 2021.09.06 |
[2021/08/30] 파이썬 머신러닝 (시계열 분석_이동평균) (0) | 2021.08.30 |
[2021/08/27] 파이썬 머신러닝 (XGBoost 유방암 분류) (1) | 2021.08.27 |
[2021/08/25~26] 파이썬 머신러닝 랜덤포레스트 (0) | 2021.08.25 |
Comments