그… 시계열 데이터를 아십니까? 가로축이 시간인 데이터라고 보면 된다. 예를 들자면 나는 오늘 얼마나 걸었는가, 어제랑 비교해서는 얼마나 걸었는가, 얼마나 퍼잤는가, 오늘 삼전은 몇만전자인가(…) 뭐 그런거 말이다. 시계열의 대표적인 예시가 주식이다.
아니 오늘 판다스 통계분석을 하는데 diff()가 나온거임. 이게 뭐냐면 차분이거든요? 이 차분이 뭐냐면... 시계열 데이터는 슈뢰딩거도 무덤에서 기함할 정도로 평균과 분산이 아주 널을 뛰기때문에 이걸 정상화할 필요가 있는데, 그 정상화 절차다. 그리고 ARIMA에서 I를 맡고 있지.
그럼 AR이랑 MA는 뭔데요? AR은 자기상관이고 MA는 이동평균이다. 이동평균은 또 뭔데요? 12345 있으면 123 234 345 이런식으로 범위를 옮겨가면서 평균 내는 게 이동평균이다. ARIMA는 ARIMA(p, d, q) 이런 식으로 쓰는데 p가 AR, d가 차분(왜죠), q가 이동평균이다. 그래서 p가 0이면 IMA, q가 0이면 ARI임. 근데 뭐가 문제죠? 그건 과정 올리면서 설명해드림.
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA # 아리마
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # 우리 이거 볼거예요 예
yfinance는 주식 불러올라면 필요한 애고 매트플롯은 그래프 그리는 애고(…) 밑에 쟤들이 아리마 하고 acf, pacf 그릴 애들이다. 아니 그건 또 뭔데여? 그건 나중에 설명해드림. 어차피 곧 만나요.
# 삼성전자 주가 데이터... 인데...
# 제미나이야... 너 구글 소속 아니니...?
df = yf.download('005930.KS', start='2023-01-01', end='2024-01-01')
series = df['Close']
그... 구글 니네 삼성이랑 뭐 하니...? 주식을 삼전껄 추천해주네...? 아무튼... 삼성전자의 2023~2024년 주가를 가져왔다. ㅇㅋ? ㅇㅇㅋ. 저걸 근데 그냥 쓸 게 아니라 차분을 할거예요. 위에도 썼지만 시계열 데이터는 슈뢰딩거도 무덤에서 기함하고 하이젠베르크도 이딴 불확정성을 원한게 아니라면서 밥상 엎을 정도로 심각해서 정상화 절차를 거쳐야 한다.
# 위에도 썼지만 AR이냐 MA냐를 결정하기 위해서는 ACF, PACF를 봐야 합니다. 아니 그니까 봐야 뭘 알아요.
# 근데 시계열 데이터를 날로 이걸 그린다? 아 안돼 차분해야돼.
# 차분: 현재 시점-이전 시점
diff_df = series.diff().dropna()
diff_df
예 일단 차분 한번 할게요.

저걸 봐도 저게 오른건지 떨어진건지 모르겠지만 아무튼 차분 한 게 저거다.
fig, ax = plt.subplots(1, 2, figsize = (15,5)) # 사실 이게 뭔 기준인지 아직도 모르겠음둥
plot_acf(diff_df, ax = ax[0]) # 위에서 둘로 쨌으니까 한쪽에는 ACF가 들어가고
ax[0].set_title('ACF')
plot_pacf(diff_df, ax = ax[1]) # 얘는 PACF임다
ax[1].set_title('PACF')
plt.show()
# 이거... 맞나?
그럼 AR이냐 MA냐를 결정하기 위해 ACF와 PACF를 그려보자. ACF는 자기상관함수고 PACF는 부분자기상관함수인데... 이걸로 저걸 어떻게 정해요? 간단하다. ACF에서 슬금슬금 떨어지고 PACF에서 절단면(보면 앎 갑자기 선 방향이 막 틀어짐)이 보이면 AR, 반대로 ACF에서 절단면이 보이고 PACF에서 슬금슬금 떨어지면 MA, 둘 다 슬금슬금 떨어지면 ARMA 둘 다 해야된다. 그래서 뭐가 문제냐고?

이게 문제여 이게... 둘이 그래프가 거의 클론이여 클론... 아니 원래는 한쪽이 슬금슬금 떨어지고 한쪽에 팍 꺾이는 예시를 보여주면서 음 이건 AR이구나 이건 MA구나 하려고 했는데 얘는 여기서 뭘 더 할 필요가 없이 걍 저걸로 땡임... 차분 한 번 했더니 백색 잡음만 남아버려서 AR이고 MA고 못해요... 일단 제미나이 피셜 이 그래프는 개같이 깔끔한 그래프가 맞음.
# 나 많이 당황했쟈나...
# 근데 어쨌든 해봅시다. 투비컨티뉴.
# 아니 둘 중 하나는 완만하게 떨어져야 하는거 아니냐고... 삼전 이때 뭔 일이 있었던건데요...
model = ARIMA(diff_df, order = (0,1,0)) # p, d, q = 0, 1, 0
model_fit = model.fit()
model_fit.plot_diagnostics(figsize=(12, 8)) # 잔차 분석(뭔지 모르겠음...)
plt.show()
무빙평균이고 자기상관이고 못하니까 p, d, q=0, 1, 0으로 해보자. plot_diagnostics은 잔차분석 하는거라서 이따 그래프 또 나옴.

제미나이 피셜로 이건 진짜 개깔끔하게 된 게 맞다고 함. 쟤네가 뭔데요?
1. 왼쪽 위(Standard residual): 특정 시점에 비정상적으로 튀는 무리가 없고 일정하게 튀면 좋은거다.
2. 오른쪽 위(히스토그램): 저 작대기들이랑 선이 정규분포를 따를수록 좋은거다.
3. 왼쪽 아래(Q-Q plot): Q는 사분위수를 의미하는데 이건 또 나중에 설명해드리겠음. 일단 저 점들이 직선상에 일정하게 늘어져있으면(y=x에 가까우면) 좋은건데 저 그래프는 몇 개 빼고 다 일정하죠?
4. 오른쪽 아래(Correlogram): 야는 뭔지 모르겠음. 맨 왼쪽에 하나 튀는 놈은 있지만 대체로 괜찮단다.

이건 p, d, q=1, 1, 1로 돌려본 결과인데 일단 히스토그램이랑 QQ만 봐도 뭔가 아 이건 0, 1, 0쪽이 더 낫다 싶죠? 정상이랍니다. 주식이 원래 그래요...
'Coding > Python' 카테고리의 다른 글
| 한타바이러스의 시퀀스를 받아서 MSA를 해보자 (전편) (0) | 2026.01.02 |
|---|---|
| 클린바 가서 VCF 자동으로 받기 시스템 (0) | 2025.12.30 |
| loc, iloc, at, iat (0) | 2025.12.24 |
| 넘파이 하는 김에 빙고 만들기 신공 (0) | 2025.12.22 |
| 힙 정렬을 구현해보자 (0) | 2025.12.13 |