파이썬으로 시계열 분해를 해보자! 샘플 데이터로는 애플의 주가 데이터를 사용해볼 것이다.
연습용으로 데이터 사용할 사람만 샘플 데이터 다운로드
#패키지가 없는 사람만
pip install yfinance
import pandas as pd
import yfinance as yf
# 시작 날짜와 끝 날짜 지정
start_date = '2020-01-01'
end_date = '2024-04-24'
# 애플 주식의 데이터를 불러오기
aapl = yf.download('AAPL', start=start_date, end=end_date)
# 결과 출력
aapl.head()
받아오면, 아래와 같이 멀티 인덱스로 개장 시, 고점, 저점 ,폐장 시, 조정 종가, 거래량 데이터가 받아진 것을 확인할 수 있다. 연습용으로 쓰기는 살짝 불편하니 간단한 전처리를 Date 인덱스를 컬럼으로 바꾸고, Open 컬럼만 선택해오장
aapl.reset_index(inplace=True)
aapl=aapl[['Date','Open']]
아주 깔끔하게 데이터셋이 나왔다~! 어떻게 생겼는지 한번 살펴보자.
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 3))
plt.plot(aapl['Date'], aapl['Open'], color='navy', linewidth=1)
plt.title('AAPL Stock Open Price Over Time')
plt.xlabel('Date')
plt.ylabel('Open Price')
plt.xticks(rotation=30,fontsize=9)
plt.yticks(fontsize=9)
plt.grid(True)
plt.show()
추세는 상향인거 같긴한데 계절성, 주기성, 불규칙성에 대해선 찾아보기가 힘들다 ㅜㅜㅜ 시계열 분해를 해야할 필요성이 느껴지지 않는가!!! 그럼 이제 진짜 파이썬으로 시계열 분해를 해보자.
파이썬 시계열 분해
seasonal_decompose 구성 요소
파이썬으로 시계열 분해는 보통, statsmodels.tsa.seasonal의 seasonal_decompose를 이용하는데, 당장 사용하기 앞서 각 옵션에 어떤것을 넣어서 돌려야하는지 살펴보고 가자.
result=seasonal_decompose(data,
model = 'additive' or 'multiplicative',
filt = None,
period = None,
two_sided = True or False,
extrapolate_trend = True or False,
freq : '',
weighted : True or False
)
- data : 분해할 시계열 데이터 셋, 보통 Pandas의 Series나 DataFrame 사용
- model : 분해 모델 지정
- filt : 추세 추정에 사용되는 필터, 기본값은 None (그 외, 'hp', 'convolution')
- period : 계절성 주기의 길이를 지정, None으로 지정 시 자동 계산
- two_sided : True이면 분해에 대해 양방향 필터링, False이면 단방향 필터링 (기본값 True)
- extrapolate_trend : True이면 추세가 범위 외에 지점에서 추정됨 (기본값 False)
- freq : 시계열 데이터의 주기 지정, None으로 지정 시 자동 계산
- weighted : True이면 가중치 적용되어 회귀분석에 사용 (기본값 False)
그럼 이제 본격적으로 애플 주식 시계열 데이터를 분해해보잣 얍
파이썬 예제
aapl의 경우 비선형보단 선형 느낌이 나기 때문에 , 나는 model = 'additive'를 선택해주었다.
*statsmodels 패키지가 없을 경우
pip install statsmodels
from statsmodels.tsa.seasonal import seasonal_decompose
#date_time이 index로 가야한다고해서 아래 전처리 한번 더 진행
aapl.set_index('Date',drop=True,inplace=True)
result = seasonal_decompose(aapl, model='additive', period=365)
이렇게하면 끝..!!!!!!!! 이러니 파이썬을 사랑할 수 밖에 ...
분해한 모델은 아래와 같이 시각화 하면 된다.
그래프 출력
# 결과 시각화
plt.figure(figsize=(8, 6))
# 원본 데이터 플롯
plt.subplot(4, 1, 1)
plt.plot(aapl, label='Original', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)
# 추세 플롯
plt.subplot(4, 1, 2)
plt.plot(result.trend, label='Trend', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)
# 계절성 플롯
plt.subplot(4, 1, 3)
plt.plot(result.seasonal, label='Seasonal', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)
# 잔차 플롯
plt.subplot(4, 1, 4)
plt.plot(result.resid, label='Residual', color='navy')
plt.legend(loc='upper left',fontsize=9)
plt.xticks(fontsize=7)
plt.yticks(fontsize=7)
plt.tight_layout()
plt.show()
에서 대충 예측한대로 추세는 상향이고, 약 1년 반 단위의 계절성을 가지고 있다. 원본 데이터만 봤을 때는 전혀 몰랐는데, 이렇게 보니까 하눈에 확인해볼 수 있음. (지금 풀매수각 ?;;!)
내용은 길었지만, 결론은 단순했던 seasonal decomposition 끝!
'파이썬 Python' 카테고리의 다른 글
[Python] 파이썬 구글 번역 API로 리뷰 데이터 번역하기 (1) | 2024.06.20 |
---|---|
[Python] 파이썬 - 구글 스프레드 시트 연동하기 (2) | 2024.03.18 |
[Python] linux 환경에서 DB 계정 정보를 숨기고, mssql을 연동해보자. (0) | 2023.12.04 |
[Python] 파이썬에서 빅쿼리 불러오기 (0) | 2023.02.15 |
[Python] 파이썬 판다스 데이터 타입 (Data Type) (0) | 2022.09.16 |
댓글