728x90
๋ฐ์ํ
ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
์๊ณ์ด๋ถ์_์ฃผ์๋ฐ์ดํฐ_์ฃผ๊ฐ์์ธก
In [4]:
"""๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"""
import datetime
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
In [5]:
"""๋ง์ด๋์ค ๊ธฐํธ ๋ฐ ํ๊ธ ์ค์ """
### ๋ง์ด๋์ค ๊ธฐํธ ์ฌ์ฉ ์ค์
plt.rcParams["axes.unicode_minus"] = False
### OS๋ณ ํ๊ธ ์ค์
if platform.system() == "Windows" :
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc("font", family=font_name)
### Mac์ธ ๊ฒฝ์ฐ
elif platform.system() == "Darwin" :
rc("font", family="Applegothic")
### ๋ฆฌ๋
์ค์ธ ๊ฒฝ์ฐ
elif platform.system() == "Linux" :
path = "/usr/share/fonts/NanumGothic.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc("font", family=font_name)
else :
print("OS ํ์ธ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.!!~~๋ ๋๊ตฌ?")
10๋ ์น ์ฃผ๊ฐ ์ ๋ณด ์์งํ๊ธฐ¶
In [6]:
"""
* ์ฆ๊ถ์ฌ : yahoo finance
* ์์ง ์ฆ๊ถ : ๊ตฌ๊ธ ์ฃผ์(GOOG) ์์ง
* ์์ง ๊ธฐ๊ฐ : 2012๋
10์ 31์ผ~2022๋
10์ 31์ผ๊น์ง ๋ฐ์ดํฐ
* ์ฆ๊ถ์ฌ ์ ๊ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ : yfinance ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์์
* ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํ์ : pip install yfinance
"""
import yfinance as yf
In [7]:
"""
๋ฐ์ดํฐ ์์งํ๊ธฐ
"""
### ์์ ๋ฐ ์ข
๋ฃ ๊ธฐ๊ฐ ๋ณ์ ์ค์
# - ๋ ์ง ํ์
์ผ๋ก ๋ณํํด์ ๋ฃ๊ธฐ...
start = datetime.datetime(2012, 10, 31)
end = datetime.datetime(2022, 10, 31)
start, end
Out[7]:
(datetime.datetime(2012, 10, 31, 0, 0), datetime.datetime(2022, 10, 31, 0, 0))
In [8]:
"""Google(GOOG) ์ฃผ์ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
- ์ฒซ๋ฒ์งธ ์ธ์ : ๊ฐ์ ธ์ฌ ์ฃผ์(์ฆ๊ถ) ์ง์
- start : ๊ฑฐ๋ ์์์ผ
- end : ๊ฑฐ๋ ์ข
๋ฃ์ผ
"""
goog_data = yf.download("GOOG", start=start, end=end)
goog_data
[*********************100%%**********************] 1 of 1 completed
Out[8]:
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2012-10-31 | 16.933031 | 16.961424 | 16.811985 | 16.943991 | 16.943991 | 61710442 |
2012-11-01 | 16.924065 | 17.208000 | 16.904636 | 17.125559 | 17.125559 | 82311371 |
2012-11-02 | 17.304888 | 17.323816 | 17.120081 | 17.133778 | 17.133778 | 93324497 |
2012-11-05 | 17.048597 | 17.107376 | 16.825932 | 17.010241 | 17.010241 | 65681270 |
2012-11-06 | 17.073006 | 17.098412 | 16.875496 | 16.979357 | 16.979357 | 63549309 |
... | ... | ... | ... | ... | ... | ... |
2022-10-24 | 102.089996 | 103.099998 | 100.300003 | 102.970001 | 102.970001 | 24680800 |
2022-10-25 | 103.300003 | 105.099998 | 103.019997 | 104.930000 | 104.930000 | 29910200 |
2022-10-26 | 96.760002 | 98.540001 | 94.570000 | 94.820000 | 94.820000 | 71504300 |
2022-10-27 | 94.309998 | 95.169998 | 91.900002 | 92.599998 | 92.599998 | 54036500 |
2022-10-28 | 92.529999 | 96.860001 | 92.322998 | 96.580002 | 96.580002 | 35696900 |
2517 rows × 6 columns
In [9]:
"""
- index : ๋ ์งํ์
- Open : ์์๊ฐ
- High : ์ํ๊ฐ
- Low : ํํ๊ฐ
- Close : ์ข
๊ฐ
- Adj Close : ์์ ์ข
๊ฐ(๋ถํ , ๋ฐฐ๋น, ๋ฐฐ๋ถ, ์ ์ฃผ ๋ฑ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์กฐ์ ์ด ์ด๋ฃจ์ด์ง)
- Volume : ๊ฑฐ๋๋
"""
goog_data.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2517 entries, 2012-10-31 to 2022-10-28
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Open 2517 non-null float64
1 High 2517 non-null float64
2 Low 2517 non-null float64
3 Close 2517 non-null float64
4 Adj Close 2517 non-null float64
5 Volume 2517 non-null int64
dtypes: float64(5), int64(1)
memory usage: 137.6 KB
In [10]:
goog_data.describe()
Out[10]:
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
count | 2517.000000 | 2517.000000 | 2517.000000 | 2517.000000 | 2517.000000 | 2.517000e+03 |
mean | 58.009613 | 58.595069 | 57.437768 | 58.027879 | 58.027879 | 4.060716e+07 |
std | 35.285227 | 35.699213 | 34.883556 | 35.287322 | 35.287322 | 2.764954e+07 |
min | 16.089443 | 16.264538 | 15.840625 | 16.119081 | 16.119081 | 1.584340e+05 |
25% | 29.169914 | 29.295568 | 28.920597 | 29.103001 | 29.103001 | 2.455000e+07 |
50% | 49.605000 | 50.805000 | 49.348751 | 49.640499 | 49.640499 | 3.156843e+07 |
75% | 71.495003 | 72.042000 | 70.569504 | 71.486504 | 71.486504 | 4.658756e+07 |
max | 151.863495 | 152.100006 | 149.887497 | 150.709000 | 150.709000 | 4.643901e+08 |
์ ์ฒ๋ฆฌ¶
In [11]:
"""์์ ์ข
๊ฐ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๊ธฐ"""
data = goog_data["Adj Close"]
data
Out[11]:
Date
2012-10-31 16.943991
2012-11-01 17.125559
2012-11-02 17.133778
2012-11-05 17.010241
2012-11-06 16.979357
...
2022-10-24 102.970001
2022-10-25 104.930000
2022-10-26 94.820000
2022-10-27 92.599998
2022-10-28 96.580002
Name: Adj Close, Length: 2517, dtype: float64
์ฃผ์ ํ๋ฆ(๋กค๋ง(rolling)) ํ์ธํ๊ธฐ¶
In [12]:
"""
<์ฃผ์ ํ๋ฆ>
- ํ๋ฆ ๋๋ ์ด๋์ด๋ผ๊ณ ์นญํ๋ฉฐ, ๋กค๋ง(rolling)์ด๋ผ๋ ๋ช
์นญ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฃผ์ ํ๋ฆ์ ํ์ธํ๊ธฐ ์ํด์๋ ์ด๋(rolling)ํ๊ท ๊ณผ
์ด๋(rolling)ํ์คํธ์ฐจ ๋ฐ์ดํฐ๊ฐ ํ์ํจ
"""
Out[12]:
'\n<์ฃผ์ ํ๋ฆ>\n - ํ๋ฆ ๋๋ ์ด๋์ด๋ผ๊ณ ์นญํ๋ฉฐ, ๋กค๋ง(rolling)์ด๋ผ๋ ๋ช
์นญ์ ์ฌ์ฉํฉ๋๋ค.\n - ์ฃผ์ ํ๋ฆ์ ํ์ธํ๊ธฐ ์ํด์๋ ์ด๋(rolling)ํ๊ท ๊ณผ \n ์ด๋(rolling)ํ์คํธ์ฐจ ๋ฐ์ดํฐ๊ฐ ํ์ํจ\n'
In [13]:
"""50์ผ์น์ ๋ํ ์ฃผ์ ํ๋ฆ(์ด๋ ํ๋ฆ) ํ์ธํ๊ธฐ
- 50์ผ์น์ ์ด๋(rolling)ํ๊ท ๊ณผ ํ์คํธ์ฐจ ๊ณ์ฐํ๊ธฐ
"""
### ๊ธฐ๊ฐ ์ค์ : 50์ผ
interval = 50
### ์ด๋ํ๊ท ๊ณ์ฐํ๊ธฐ
# - ์ฃผ์ ๊ฐ๊ฒฉ์ ํ๋ฆ์ ์ ์ฐํ๊ฒ ๋ณด๊ธฐ ์ข๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ฉ
# - ์ค์ ๊ฐ๊ฒฉ ํ๋ฆ๊ณผ ์ด๋ํ๊ท ๊ฐ๊ณผ ์ฐจ์ด๊ฐ ๋ณด์ด๋ ๋ถ๋ถ : ๋ณ๋์ฑ์ด ์๋ ๋ถ๋ถ
rolmean = data.rolling(interval).mean()
rolmean
### ์ด๋ํ์คํธ์ฐจ ๊ณ์ฐํ๊ธฐ : ๋ณ๋์ฑ์ ํ๋ฆ ๋ฐ์ดํฐ
rolstd = data.rolling(interval).std()
rolstd
Out[13]:
Date
2012-10-31 NaN
2012-11-01 NaN
2012-11-02 NaN
2012-11-05 NaN
2012-11-06 NaN
...
2022-10-24 7.438346
2022-10-25 7.027929
2022-10-26 6.755694
2022-10-27 6.614440
2022-10-28 6.272286
Name: Adj Close, Length: 2517, dtype: float64
In [14]:
"""์๊ฐํ ํ๊ธฐ"""
### ์๋ณธ, ์ด๋ํ๊ท , ์ด๋ํ์คํธ์ฐจ ์๊ฐํ
plt.figure(figsize=(10, 6))
plt.title("์ค์ , ์ด๋ํ๊ท , ์ด๋ํ์คํธ์ฐจ ์๊ฐํ")
### ์ค์ ์ฃผ์๊ฐ๊ฒฉ ๊ทธ๋ฆฌ๊ธฐ
plt.plot(data, color="blue", label="์ค์ ์๋ณธ ์ฃผ๊ฐ")
### 50์ผ ๊ฐ๊ฒฉ์ ์ด๋ํ๊ท ๊ทธ๋ฆฌ๊ธฐ
plt.plot(rolmean, color="red", label=f"์ด๋ํ๊ท {interval}์ผ ๊ธฐ์ค")
### 50์ผ ๊ฐ๊ฒฉ์ ์ด๋ํ์คํธ์ฐจ ๊ทธ๋ฆฌ๊ธฐ
plt.plot(rolstd, color="black", label=f"์ด๋ํ์คํธ์ฐจ {interval}์ผ ๊ธฐ์ค")
plt.xlabel("Date")
plt.ylabel("data")
plt.legend()
plt.show()
In [15]:
"""(์๊ฐํ ํด์)
* ๋น์ ์์ฑ : ํ๊ท ์ด ์ผ์ ํ์ง ์๊ณ ์ค๋ฅด๋ฝ ๋ด๋ฆฌ๋ฝํ๋ ๋ถ๊ท์น ํํ๋ฅผ ์๋ฏธํจ
- ์๊ณ์ด ๋ถ์ ์์๋ ๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ง๋ค์ด์ ๋ถ์์ ์งํํฉ๋๋ค.
-> ์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์ฐจ์(d)๋ผ๋ ๊ณ๋
์ด ์ ์ฉ๋จ(์๋์ ์ค๋ช
์์ ...)
-> ํ์คํ(์ ๊ทํ) ์ํค๋ ๊ฐ๋
๊ณผ ์ ์ฌํจ
- ๊ณ์ ์ฑ์ ๋ํ๋ด์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ, ํน์ง์ ํจํด์ ๋ณด์ด๊ณ ์์ง ์์(ํน์ ์ฃผ๊ธฐ์ฑ์ด ์์)
"""
Out[15]:
'(์๊ฐํ ํด์)\n* ๋น์ ์์ฑ : ํ๊ท ์ด ์ผ์ ํ์ง ์๊ณ ์ค๋ฅด๋ฝ ๋ด๋ฆฌ๋ฝํ๋ ๋ถ๊ท์น ํํ๋ฅผ ์๋ฏธํจ\n - ์๊ณ์ด ๋ถ์ ์์๋ ๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ง๋ค์ด์ ๋ถ์์ ์งํํฉ๋๋ค.\n -> ์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์ฐจ์(d)๋ผ๋ ๊ณ๋
์ด ์ ์ฉ๋จ(์๋์ ์ค๋ช
์์ ...)\n -> ํ์คํ(์ ๊ทํ) ์ํค๋ ๊ฐ๋
๊ณผ ์ ์ฌํจ\n - ๊ณ์ ์ฑ์ ๋ํ๋ด์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ, ํน์ง์ ํจํด์ ๋ณด์ด๊ณ ์์ง ์์(ํน์ ์ฃผ๊ธฐ์ฑ์ด ์์)\n'
์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์ ๋ชจ๋ธ -> ARIMA ๋ชจ๋ธ¶
In [16]:
"""
<์๊ณ์ด ๋ถ์>
- ์๊ณ์ด ๋ถ์์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ชจ๋ธ์ ARIMA ๋ชจ๋ธ๋ก,
- ์ค๋ ๋์ ์ฌ์ฉ๋์จ ํต๊ณํ์ ๊ธฐ์ ํต๊ณ ๋ชจ๋ธ์
- ์๊ณ์ด ๋ถ์์, ์ผ๋ฐ์ ์ผ๋ก ์์ธก๋ถ์ ์ค์์๋ [์๊ฐ์ ๋
๋ฆฝ๋ณ์(X)]๋ก ์ฌ์ฉํ๊ณ ,
๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ข
์๋ณ์(Y)๋ก ์ฌ์ฉํ์ฌ ์์ธกํ๋ ๋ถ์ ๋ฐฉ๋ฒ์
- ARIMA(Autoregressive Integrated Moving Average)
: ์๊ณ์ด ๋ถ์(์์ธก)์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ธ ์ค ํ๋
: ์๊ณ์ด ๋ถ์์ ํ ์์ ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์
-> ์์ผ๋ก ์ด๋ค ํจํด์ ์ฐจํธ๋ฅผ ๊ทธ๋ฆด์ง ์์ธกํ๋ ๋ถ์๊ธฐ๋ฒ์
* AR(Autoregressive) : "์๊ธฐ์๊ด" ์ด๋ผ๊ณ ์นญํฉ๋๋ค.
- ์ด์ ์ ๊ฐ์ด ์ดํ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ ์ํฉ(๊ด๊ณ)
* MA(Movign Average) : "์ด๋ํ๊ท " ์ด๋ผ๊ณ ์นญํฉ๋๋ค.
- ํน์ ๋ณ์์ ํ๊ท ๊ฐ์ด ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ ์ถ์ธ(์ถ์ด)
<์ ์์ฑ(stationary)๊ณผ ๋น์ ์์ฑ(Non-stationary)>
* ์ ์์ฑ
- ํ๊ท ๊ณผ ๋ถ์ฐ์ด ์ผ์ ํ ํํ
* ๋น์ ์์ฑ
- ํ๊ท ๊ณผ ๋ถ์ฐ์ด ์ผ์ ํ์ง ์์ ํํ
- ์๊ฐ์ ๋ฐ๋ผ ํ๊ท ์์ค์ด ๋ค๋ฅด๊ฑฐ๋,
ํน์ง์ ํจํด(Trend)์ด๋ ๊ณ์ ์ฑ(Sessonality)์ ์ํฅ์ ๋ฐ๋ ํํ
- ์์ ๋ฐ์ดํฐ ํํ : ๊ฒจ์ธ์ ๋๋ฐฉ๋น ์ฆ๊ฐ, ์ฌ๋ฆ์ ์์ด์คํฌ๋ฆผ ํ๋งค๋ ์ฆ๊ฐ ๋ฑ๋ฑ...
- ๋น์ ์์ฑ ๋ฐ์ดํฐ๋ ์์ธ ๊ทธ ๋ฒ์๊ฐ ๋๋ฌด ๋ค์ํ๊ณ ๋ง๊ธฐ์, ๊ณ ๋ คํด์ผํ ํน์ฑ๋ค์ด ๋ง์
- ์ด์, ๋น์ ์์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์์ฑ์ผ๋ก ๋ณํํ์ฌ ๋ถ์์ ์งํํ๊ฒ ๋จ
- ์ ์์ฑ์ผ๋ก ๋ถ์์ ์งํํ๋ฉฐ, ์์ธก๋ฒ์๊ฐ ์ผ์ ํ๊ฒ ์ค์ด๋ค๊ณ , ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ ํจ๊ณผ๋ฅผ ๋ฐํํจ
<๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ๋ค>
- ํ๊ท ์ ์ ์ํ๋ฅผ ์ํ ์ฐจ๋ถ ์ฌ์ฉ (** ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ)
- ๋ถ์ฐ์ ์์ ํ๋ฅผ ์ํ ๋ก๊ทธ ๋ณํ ์ฌ์ฉ
- ์ ๊ณฑ/์ ๊ณฑ๊ทผ ๋ณํ ์ฌ์ฉ
- ์ด์ธ ๋ฑ๋ฑ...
* ์ฐจ๋ถ : ๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด,
: ๊ด์ธก๊ฐ๋ค์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ์ฌ์ฉํ๊ฒ๋จ
"""
Out[16]:
'\n<์๊ณ์ด ๋ถ์>\n - ์๊ณ์ด ๋ถ์์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ชจ๋ธ์ ARIMA ๋ชจ๋ธ๋ก,\n - ์ค๋ ๋์ ์ฌ์ฉ๋์จ ํต๊ณํ์ ๊ธฐ์ ํต๊ณ ๋ชจ๋ธ์\n\n - ์๊ณ์ด ๋ถ์์, ์ผ๋ฐ์ ์ผ๋ก ์์ธก๋ถ์ ์ค์์๋ [์๊ฐ์ ๋
๋ฆฝ๋ณ์(X)]๋ก ์ฌ์ฉํ๊ณ ,\n ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ข
์๋ณ์(Y)๋ก ์ฌ์ฉํ์ฌ ์์ธกํ๋ ๋ถ์ ๋ฐฉ๋ฒ์\n - ARIMA(Autoregressive Integrated Moving Average)\n : ์๊ณ์ด ๋ถ์(์์ธก)์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ชจ๋ธ ์ค ํ๋\n : ์๊ณ์ด ๋ถ์์ ํ ์์ ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์\n -> ์์ผ๋ก ์ด๋ค ํจํด์ ์ฐจํธ๋ฅผ ๊ทธ๋ฆด์ง ์์ธกํ๋ ๋ถ์๊ธฐ๋ฒ์\n\n * AR(Autoregressive) : "์๊ธฐ์๊ด" ์ด๋ผ๊ณ ์นญํฉ๋๋ค.\n - ์ด์ ์ ๊ฐ์ด ์ดํ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ ์ํฉ(๊ด๊ณ)\n\n * MA(Movign Average) : "์ด๋ํ๊ท " ์ด๋ผ๊ณ ์นญํฉ๋๋ค.\n - ํน์ ๋ณ์์ ํ๊ท ๊ฐ์ด ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ ์ถ์ธ(์ถ์ด)\n\n<์ ์์ฑ(stationary)๊ณผ ๋น์ ์์ฑ(Non-stationary)>\n * ์ ์์ฑ\n - ํ๊ท ๊ณผ ๋ถ์ฐ์ด ์ผ์ ํ ํํ\n\n * ๋น์ ์์ฑ\n - ํ๊ท ๊ณผ ๋ถ์ฐ์ด ์ผ์ ํ์ง ์์ ํํ\n - ์๊ฐ์ ๋ฐ๋ผ ํ๊ท ์์ค์ด ๋ค๋ฅด๊ฑฐ๋, \n ํน์ง์ ํจํด(Trend)์ด๋ ๊ณ์ ์ฑ(Sessonality)์ ์ํฅ์ ๋ฐ๋ ํํ\n - ์์ ๋ฐ์ดํฐ ํํ : ๊ฒจ์ธ์ ๋๋ฐฉ๋น ์ฆ๊ฐ, ์ฌ๋ฆ์ ์์ด์คํฌ๋ฆผ ํ๋งค๋ ์ฆ๊ฐ ๋ฑ๋ฑ...\n\n - ๋น์ ์์ฑ ๋ฐ์ดํฐ๋ ์์ธ ๊ทธ ๋ฒ์๊ฐ ๋๋ฌด ๋ค์ํ๊ณ ๋ง๊ธฐ์, ๊ณ ๋ คํด์ผํ ํน์ฑ๋ค์ด ๋ง์\n - ์ด์, ๋น์ ์์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์์ฑ์ผ๋ก ๋ณํํ์ฌ ๋ถ์์ ์งํํ๊ฒ ๋จ\n - ์ ์์ฑ์ผ๋ก ๋ถ์์ ์งํํ๋ฉฐ, ์์ธก๋ฒ์๊ฐ ์ผ์ ํ๊ฒ ์ค์ด๋ค๊ณ , ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ ํจ๊ณผ๋ฅผ ๋ฐํํจ\n\n<๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ๋ค>\n - ํ๊ท ์ ์ ์ํ๋ฅผ ์ํ ์ฐจ๋ถ ์ฌ์ฉ (** ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ)\n - ๋ถ์ฐ์ ์์ ํ๋ฅผ ์ํ ๋ก๊ทธ ๋ณํ ์ฌ์ฉ\n - ์ ๊ณฑ/์ ๊ณฑ๊ทผ ๋ณํ ์ฌ์ฉ\n - ์ด์ธ ๋ฑ๋ฑ...\n\n* ์ฐจ๋ถ : ๋น์ ์์ฑ์ ์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด, \n : ๊ด์ธก๊ฐ๋ค์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ์ฌ์ฉํ๊ฒ๋จ\n'
์๊ณ์ด ์ ์์ฑ ํ์ธํ๊ธฐ -> ADF ํ ์คํธ¶
In [17]:
"""
<ADF ํ
์คํธ(Augmented Dickey-Fuller Test)>
- ์๊ณ์ด ๋ฐ์ดํฐ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํต๊ณ์ ์ธ ์ ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ
- ๊ท๋ฌด๊ฐ์ค๊ฐ ๋๋ฆฝ๊ฐ์ค์ ๋ฐ๋ผ ๊ฒฐ์ ๋จ
- ๊ท๋ฌด๊ฐ์ค : ๊ธฐ์กด ์ฐ๊ตฌ์ด๋ก
- ๋๋ฆฝ๊ฐ์ค : ์ ๊ท ์ฐ๊ตฌ์ด๋ก (์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ ํ๋ ๊ฒ)
- ๊ท๋ฌด๊ฐ์ค๊ณผ ๋๋ฆฝ๊ฐ์ค์ ๋ณดํธ์ ๊ธฐ์ค -> p-value < 0.05 (์ฆ๊ฐ ๊ฐ๋ฅ)
: p-value < 0.05 ์ด๋ฉด, ๊ท๋ฌด๊ฐ์ค ๊ธฐ๊ฐ, ๋๋ฆฝ๊ฐ์ค ์ฑํ
: p-value > 0.05 ์ด๋ฉด, ๊ท๋ฌด๊ฐ์ค ์ฑํ (์ฐ๊ตฌ ๋ฐฉํฅ์ ์์ ํด์ผ ํจ)
- ์๊ณ์ด ๋ถ์์์๋ ์ ์์ฑ๊ณผ ๋น์ ์์ฑ ๋ฐ์ดํฐ์ ํํ๋ฅผ ๊ตฌ๋ถํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋จ
- ADF ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : statsmodels ํจํค์ง์ adfuller ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
-> ์ค์น ํ์ : pip install statsmodels
"""
Out[17]:
'\n<ADF ํ
์คํธ(Augmented Dickey-Fuller Test)>\n - ์๊ณ์ด ๋ฐ์ดํฐ์ ์ ์์ฑ ์ฌ๋ถ๋ฅผ ํต๊ณ์ ์ธ ์ ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ\n - ๊ท๋ฌด๊ฐ์ค๊ฐ ๋๋ฆฝ๊ฐ์ค์ ๋ฐ๋ผ ๊ฒฐ์ ๋จ\n - ๊ท๋ฌด๊ฐ์ค : ๊ธฐ์กด ์ฐ๊ตฌ์ด๋ก \n - ๋๋ฆฝ๊ฐ์ค : ์ ๊ท ์ฐ๊ตฌ์ด๋ก (์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ ํ๋ ๊ฒ)\n - ๊ท๋ฌด๊ฐ์ค๊ณผ ๋๋ฆฝ๊ฐ์ค์ ๋ณดํธ์ ๊ธฐ์ค -> p-value < 0.05 (์ฆ๊ฐ ๊ฐ๋ฅ)\n : p-value < 0.05 ์ด๋ฉด, ๊ท๋ฌด๊ฐ์ค ๊ธฐ๊ฐ, ๋๋ฆฝ๊ฐ์ค ์ฑํ\n : p-value > 0.05 ์ด๋ฉด, ๊ท๋ฌด๊ฐ์ค ์ฑํ (์ฐ๊ตฌ ๋ฐฉํฅ์ ์์ ํด์ผ ํจ)\n - ์๊ณ์ด ๋ถ์์์๋ ์ ์์ฑ๊ณผ ๋น์ ์์ฑ ๋ฐ์ดํฐ์ ํํ๋ฅผ ๊ตฌ๋ถํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋จ\n\n - ADF ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : statsmodels ํจํค์ง์ adfuller ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ\n -> ์ค์น ํ์ : pip install statsmodels\n'
In [19]:
"""ADF ๋ผ์ด๋ธ๋ฌ๋ฆฌ"""
from statsmodels.tsa.stattools import adfuller
In [20]:
"""์๋ณธ(์์ ์ข
๊ฐ) ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ ADF ํ
์คํธํ๊ธฐ"""
result = adfuller(data.values)
result
Out[20]:
(-0.7728513783029779,
0.8269669996469453,
24,
2492,
{'1%': -3.432976825339513,
'5%': -2.862700515844509,
'10%': -2.5673877878037974},
8123.380716155494)
In [21]:
data.values
Out[21]:
array([16.94399071, 17.12555885, 17.13377762, ..., 94.81999969,
92.59999847, 96.58000183])
In [22]:
"""p-value ์ถ์ถํ๊ธฐ
- ADF ๊ฒฐ๊ณผ์ 1๋ฒ์งธ ๊ฐ์ด -> p-value ๊ฐ์
"""
print(f"p-value : {result[1]}")
"""
(ํด์)
- p-value < 0.05์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก,
(p-value์ ๊ฐ์ด 0.827๋ก 0.05๋ณด๋ค ํฌ๋ฏ๋ก,,,,์ด๋ ๊ฒ ์์ฑํ์ง๋ฉด ์๋๋์~~)
- ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์์. ์ฆ, ์ ์๋ฏธ ํ์ง ์์
- ๋ฐ๋ผ์, ๊ตฌ๊ธ ์ฃผ์ ๋ฐ์ดํฐ๋ "๋น์ ์์ฑ" ๋ฐ์ดํฐ์ด๋ฉฐ,
์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ์ฐจ๋ถ ์ฒ๋ฆฌ๊ฐ ํ์ํจ
"""
p-value : 0.8269669996469453
Out[22]:
'\n(ํด์)\n - p-value < 0.05์ ๋ง์กฑํ์ง ์์ผ๋ฏ๋ก,\n (p-value์ ๊ฐ์ด 0.827๋ก 0.05๋ณด๋ค ํฌ๋ฏ๋ก,,,,์ด๋ ๊ฒ ์์ฑํ์ง๋ฉด ์๋๋์~~)\n - ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์์. ์ฆ, ์ ์๋ฏธ ํ์ง ์์\n - ๋ฐ๋ผ์, ๊ตฌ๊ธ ์ฃผ์ ๋ฐ์ดํฐ๋ "๋น์ ์์ฑ" ๋ฐ์ดํฐ์ด๋ฉฐ, \n ์ ์์ฑ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ์ฐจ๋ถ ์ฒ๋ฆฌ๊ฐ ํ์ํจ\n'
In [23]:
"""1d(1์ฐจ) ์ฐจ๋ถ ๊ณ์ฐํ๊ธฐ
- 1d(1์ฐจ) : 1์นธ์ฉ ์ด๋ํ๋ฉด์ ์ด์ ๊ณผ ํ์ฌ์ ์ฐจ์ด๊ฐ์ ์ฌ์ฉํจ
- ์ฌ์ฉํจ์ : diff()
- ์ฐจ๋ถ์ ๊ณ์ฐํ๊ฒ๋๋ฉด, ์ต์ด ๋๋ [์ฐจ๋ถ์ ์ด๋ ๊ฑฐ๋ฆฌ]์ ๋ฐ๋ผ์ Nan์ด ๋ฐ์
--> Nan์ ์ ๊ฑฐํ๊ณ ์ฌ์ฉํจ
"""
dff1 = data.diff().dropna()
dff1
Out[23]:
Date
2012-11-01 0.181568
2012-11-02 0.008219
2012-11-05 -0.123537
2012-11-06 -0.030884
2012-11-07 -0.363636
...
2022-10-24 1.489998
2022-10-25 1.959999
2022-10-26 -10.110001
2022-10-27 -2.220001
2022-10-28 3.980003
Name: Adj Close, Length: 2516, dtype: float64
In [24]:
"""์ฐจ๋ถ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ์๊ฐํํ๊ธฐ"""
dff1.plot(figsize=(15, 5))
Out[24]:
<Axes: xlabel='Date'>
In [25]:
"""์ฐจ๋ถ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ์ ์์ฑ ์ฌ๋ถ ํ์ธํ๊ธฐ
- ADF ํ
์คํธํ์ฌ, p-value < 0.05 ํ์ธํ๊ธฐ
"""
result = adfuller(dff1.values)
print("p-value : %f" % result[1])
"""
(ํด์)
- p-value < 0.05๋ฅผ ๋ง์กฑํจ์ผ๋ก, ์ ์๋ฏธํจ
- ์ฆ, ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ๊ณ ๋๋ฆฝ๊ฐ์ค์ ์ฑํ
- ์๊ณ์ด ๋ถ์์์๋ ์ฐจ๋ถ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ ์์ฑ ๋ฐ์ดํฐ๋ก ๋ณํ๋์์ผ๋ฉฐ,
- ์ดํ, ARIMA ๋ถ์์ ํตํด ์งํ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ฆ๋ช
๋์์
- ์ฌ์ฉ๋ ์ฐจ๋ถ์ 1์ฐจ ์ฐจ๋ถ์ ์ํํ์ฌ ์ฆ๋ช
ํ์์
<์ฐจ๋ถ์ ์ฐจ์ ์ฌ์ฉ>
- 1์ฐจ ์ฐจ๋ถ : ์ผ๋ฐ์ ์ผ๋ก ์๊ณ์ด ๊ณก์ ์ด ํน์ ํ ํธ๋๋(ํจํด์ด ์์)๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ์ฌ์ฉ
- 2์ฐจ ์ฐจ๋ถ : ์๊ฐ์ ๋ฐ๋ผ ๋ค์ฅ ๋ ์ฅํ ํธ๋๋๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ์ฌ์ฉ(๋๋คํ ๋ค์ฅ ๋ ์ฅ)
"""
p-value : 0.000000
Out[25]:
'\n(ํด์)\n - p-value < 0.05๋ฅผ ๋ง์กฑํจ์ผ๋ก, ์ ์๋ฏธํจ\n - ์ฆ, ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ๊ณ ๋๋ฆฝ๊ฐ์ค์ ์ฑํ\n - ์๊ณ์ด ๋ถ์์์๋ ์ฐจ๋ถ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ ์์ฑ ๋ฐ์ดํฐ๋ก ๋ณํ๋์์ผ๋ฉฐ,\n - ์ดํ, ARIMA ๋ถ์์ ํตํด ์งํ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ฆ๋ช
๋์์\n - ์ฌ์ฉ๋ ์ฐจ๋ถ์ 1์ฐจ ์ฐจ๋ถ์ ์ํํ์ฌ ์ฆ๋ช
ํ์์\n\n <์ฐจ๋ถ์ ์ฐจ์ ์ฌ์ฉ>\n - 1์ฐจ ์ฐจ๋ถ : ์ผ๋ฐ์ ์ผ๋ก ์๊ณ์ด ๊ณก์ ์ด ํน์ ํ ํธ๋๋(ํจํด์ด ์์)๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ์ฌ์ฉ\n - 2์ฐจ ์ฐจ๋ถ : ์๊ฐ์ ๋ฐ๋ผ ๋ค์ฅ ๋ ์ฅํ ํธ๋๋๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ์ฌ์ฉ(๋๋คํ ๋ค์ฅ ๋ ์ฅ)\n'
ARIMA ๋ชจ๋ธ์ ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ) ์ฐพ๊ธฐ¶
In [26]:
"""
* ARIMA ๋ชจ๋ธ์์ ์ฌ์ฉ๋๋ ์ค์ํ 3๊ฐ์ ํ์ดํผํ๋ผ๋ฉํฐ
- p, d, q
- ARIMA(AR, MA, ARMA) ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋
-> AR(์๊ธฐํ๊ท๋ชจํ, p), ์ฐจ๋ถ(d), MA(์ด๋ํ๊ท ๋ชจํ, q) ๊ฐ์ ๊ฒฐ์ ํด์ผ ํจ
* ๊ฒฐ์ ๋ฐฉ๋ฒ
1. ACF plot๊ณผ PACF plot์ ํตํด ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ๊ฒฐ์ ํ ์ ์์
- ํ์ฌ ๊ฐ์ด -> ๊ณผ๊ฑฐ ๊ฐ๊ณผ ์ด๋ค ๊ด๊ณ(relationship)๊ฐ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ํ๋ก ํ์ธ
2. pmdarima ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ndiffs, auto_arima ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ) ๊ฒฐ์ ํ ์ ์์
- ์ฃผ๋ก auto_arima ํจ์๋ฅผ ์ฌ์ฉํจ
"""
Out[26]:
'\n * ARIMA ๋ชจ๋ธ์์ ์ฌ์ฉ๋๋ ์ค์ํ 3๊ฐ์ ํ์ดํผํ๋ผ๋ฉํฐ\n - p, d, q\n - ARIMA(AR, MA, ARMA) ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋\n -> AR(์๊ธฐํ๊ท๋ชจํ, p), ์ฐจ๋ถ(d), MA(์ด๋ํ๊ท ๋ชจํ, q) ๊ฐ์ ๊ฒฐ์ ํด์ผ ํจ\n\n * ๊ฒฐ์ ๋ฐฉ๋ฒ\n 1. ACF plot๊ณผ PACF plot์ ํตํด ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ๊ฒฐ์ ํ ์ ์์\n - ํ์ฌ ๊ฐ์ด -> ๊ณผ๊ฑฐ ๊ฐ๊ณผ ์ด๋ค ๊ด๊ณ(relationship)๊ฐ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ํ๋ก ํ์ธ\n\n 2. pmdarima ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ndiffs, auto_arima ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ) ๊ฒฐ์ ํ ์ ์์\n - ์ฃผ๋ก auto_arima ํจ์๋ฅผ ์ฌ์ฉํจ\n'
(๋ฐฉ๋ฒ-1) ACF plot๊ณผ PACF plot์ ํตํด ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ)๋ฅผ ๊ฒฐ์ ¶
In [27]:
"""์ฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"""
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
In [28]:
"""์ค์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ -> ACF ๋ฐ PACF ์๊ฐํํ๊ธฐ"""
plot_acf(data)
plot_pacf(data)
plt.show()
"""(ํด์)
* ACF plot
- ACF plot์์ ๋ง๋๊ทธ๋ํ๊ฐ ์ฒ์ฒํ ๊ฐ์๋๋ ๊ฒ์ผ๋ก ๋ณด์
- ์ด๋ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ผ์ ํ์ง ์์ ๋น์ ์ ๋ฐ์ดํฐ๋ก ํ๋จํฉ๋๋ค.
* PACF plot
- ์ฒซ๊ฐ์ ์ ์ธํ 1๊ฐ ์ดํ ํ๋ ๋ฐ์ค์ ๋ค์ด๊ฐ๋ฉด์, ๋ง๋๊ทธ๋ํ๊ฐ ๋๊ธฐ๋ ๊ฒ์ผ๋ก ๋ณด์
- ์ด๋ ์๊ธฐํ๊ท๋ชจํ(AR)์ ๊ฒฐ๊ณผ๊ฐ์ด 1๊ฐ ์ดํ์ธ, ์ฆ p๋ 1์ธ ๊ฐ์ ํ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค๋ ์๋ฏธํ
- ์ด๋ํ๊ท (MA)์ ๊ฐ์ AR๊ณผ์ ์ฐจ์ด๊ฐ์ด 0์ด ๋๋๋ก ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋ฐ๋ผ์, MA๋ 1์ด ์ ์ ํจ์ ์๋ฏธํจ.
"""
Out[28]:
'(ํด์)\n* ACF plot\n - ACF plot์์ ๋ง๋๊ทธ๋ํ๊ฐ ์ฒ์ฒํ ๊ฐ์๋๋ ๊ฒ์ผ๋ก ๋ณด์\n - ์ด๋ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ผ์ ํ์ง ์์ ๋น์ ์ ๋ฐ์ดํฐ๋ก ํ๋จํฉ๋๋ค.\n\n* PACF plot\n - ์ฒซ๊ฐ์ ์ ์ธํ 1๊ฐ ์ดํ ํ๋ ๋ฐ์ค์ ๋ค์ด๊ฐ๋ฉด์, ๋ง๋๊ทธ๋ํ๊ฐ ๋๊ธฐ๋ ๊ฒ์ผ๋ก ๋ณด์\n - ์ด๋ ์๊ธฐํ๊ท๋ชจํ(AR)์ ๊ฒฐ๊ณผ๊ฐ์ด 1๊ฐ ์ดํ์ธ, ์ฆ p๋ 1์ธ ๊ฐ์ ํ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค๋ ์๋ฏธํ\n - ์ด๋ํ๊ท (MA)์ ๊ฐ์ AR๊ณผ์ ์ฐจ์ด๊ฐ์ด 0์ด ๋๋๋ก ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์\n ๋ฐ๋ผ์, MA๋ 1์ด ์ ์ ํจ์ ์๋ฏธํจ.\n'
In [29]:
"""1์ฐจ ์ฐจ๋ถ๋ฐ์ดํฐ๋ก ACF ๋ฐ PACF ์๊ฐํ ํ๊ธฐ"""
plot_acf(dff1)
plot_pacf(dff1)
plt.show()
In [30]:
"""
(๊ฒฐ๋ก )
- AR(p) = 1, d = 1, MA(q) = 1์ด ์ ์
- ์ด๋, MA(q)๊ฐ์ AR - MA๊ฐ์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. (q=0)
- MA๊ฐ์ AR- MA๋ฅผ ์ฌ์ฉ
"""
Out[30]:
'\n(๊ฒฐ๋ก )\n - AR(p) = 1, d = 1, MA(q) = 1์ด ์ ์ \n - ์ด๋, MA(q)๊ฐ์ AR - MA๊ฐ์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. (q=0)\n - MA๊ฐ์ AR- MA๋ฅผ ์ฌ์ฉ\n'
(๋ฐฉ๋ฒ-2)pmdarima ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ndiffs, auto_arima ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ์(ํ์ดํผํ๋ผ๋ฉํฐ) ๊ฒฐ์ ¶
In [34]:
"""์ฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํด์ผํจ : pip install pmdarima
"""
import pmdarima as pm
from pmdarima.arima import ndiffs
In [35]:
"""ndiffs ๋ฐฉ๋ฒ : ์ฐจ์๋ฅผ ๊ฒฐ์ ํ๋ ํจ์
- data : ์๋ณธ ๋ฐ์ดํฐ
- alpha : ์ฐจ๋ถ ํ์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์ฌ์ฉํ p-value(์ ์์์ค) ๊ธฐ์ค
- test : ์ฐจ๋ถ ํ์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์ฌ์ฉํ ํ
์คํธ ๋ฐฉ๋ฒ ์ง์
: ์ฃผ๋ก adf ํ
์คํธ ๋ฐฉ๋ฒ์ ์ฌ์ฉ (kpss ํ
์คํธ ๋ฐฉ๋ฒ๋ ์์ผ๋, ๊ฑฐ์ ์ฌ์ฉ์ํจ)
- max_d : ์ต๋ ์ฐจ๋ถ ํ์๋ฅผ ์ ํํจ(์ด ๋ฒ์ ๋ด์์ ๊ฐ์ฅ ์ ์ ํ ์ฐจ์๋ฅผ ๊ฒฐ์ )
"""
n_diffs = ndiffs(data, alpha=0.05, test="adf", max_d=6)
print(f"๊ฒฐ์ ๋ ์ฐจ์ : {n_diffs}")
๊ฒฐ์ ๋ ์ฐจ์ : 1
In [36]:
"""
* auto_arima ํจ์ ์ฌ์ฉ : p, d, q ๊ฐ์ ๋ชจ๋ ์ถ์ถํด ์ค๋๋ค.
- y = ๋ฐ์ดํฐ ์๋ณธ
- d = ์ฐจ๋ถ์ ์ฐจ์, ์ด๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์คํ ์๊ฐ์ด ๋งค์ฐ ๊ธธ์ด์ง(๊ธฐ๋ณธ๊ฐ None)
- start_p(๊ธฐ๋ณธ๊ฐ 2), max_p(๊ธฐ๋ณธ๊ฐ 5) : AR(p)๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ฒ์(start_p์์ max_p๊น์ง ์ํ),
- start_q(๊ธฐ๋ณธ๊ฐ 2), max_q(๊ธฐ๋ณธ๊ฐ 5) : MA(q)๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ฒ์(start_q์์ max_q๊น์ง ์ํ)
- m : ๊ณ์ ์ ํน์ฑ์ด ์์ ๋ ์ฌ์ฉํ๋ ๋งค๊ฐ๋ณ์(๊ธฐ๋ณธ๊ฐ 1) -> ์ฐจ์๋ฅผ ์๋ฏธํจ
- seasonal : ๊ณ์ ์ฑ ํน์ฑ์ ์์ ๋ ์ฌ์ฉ(๊ธฐ๋ณธ๊ฐ True)
: ๊ณ์ ์ฑ ํน์ฑ์ด ์์ ๋(True) -> m์ ๊ฐ์ ๊ณ์ ์ ํน์ฑ์ ๋ฒ์ ์ฐจ์ ์ง์ (๋ณดํต 3)
: ๊ณ์ ์ฑ ํน์ฑ์ด ์์ ๋(False) -> m์ 1์ ๋ณดํต ์ฌ์ฉ
- stepwise : ์ต์ ์ ๋ชจ์๋ฅผ ์ฐพ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ(๊ธฐ๋ณธ๊ฐ True)
(์ต์ ์ ๋ชจ์ ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ : ํ๋๋ง-์นธ๋ค์นด๋ฅด ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋จ)
- trace : ๊ฒฐ๊ณผ ์ถ๋ ฅ ์ฌ๋ถ(๊ธฐ๋ณธ๊ฐ False)
"""
model = pm.auto_arima(
y=data,
d=1,
start_p=0, max_p=3,
start_q=0, max_q=3,
m=1, seasonal=False,
stepwise=True,
trace=True
)
"""(ํด์)
- auto_arima๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ์์ ์ต์ ์ ๋ชจ๋ธ์ ARIMA(1, 1, 0) ๋ชจํ์ผ๋ก ๊ฒฐ์ ๋จ
- ๋ชจ๋ธ์ด ์ค๋ช
๋ ฅ(๊ฒฐ์ ๋ ฅ)์ด ์ข์ ์๋ก AIC ๊ฐ์ด ์์์ง๊ณ ,
- ๋ชจ๋ธ์ ๋ณต์ก๋๊ฐ ๋์์ง์๋ก AIC๊ฐ์ด ์ปค์ง
- AIC๊ฐ์ ์์ ์๋ก ์ข์
"""
Performing stepwise search to minimize aic
ARIMA(0,1,0)(0,0,0)[0] intercept : AIC=8231.556, Time=0.04 sec
ARIMA(1,1,0)(0,0,0)[0] intercept : AIC=8221.824, Time=0.09 sec
ARIMA(0,1,1)(0,0,0)[0] intercept : AIC=8221.860, Time=0.15 sec
ARIMA(0,1,0)(0,0,0)[0] : AIC=8231.191, Time=0.03 sec
ARIMA(2,1,0)(0,0,0)[0] intercept : AIC=8223.799, Time=0.14 sec
ARIMA(1,1,1)(0,0,0)[0] intercept : AIC=8223.097, Time=0.41 sec
ARIMA(2,1,1)(0,0,0)[0] intercept : AIC=8225.820, Time=0.24 sec
ARIMA(1,1,0)(0,0,0)[0] : AIC=8221.686, Time=0.05 sec
ARIMA(2,1,0)(0,0,0)[0] : AIC=8223.648, Time=0.09 sec
ARIMA(1,1,1)(0,0,0)[0] : AIC=8222.890, Time=0.17 sec
ARIMA(0,1,1)(0,0,0)[0] : AIC=8221.739, Time=0.07 sec
ARIMA(2,1,1)(0,0,0)[0] : AIC=8224.664, Time=0.25 sec
Best model: ARIMA(1,1,0)(0,0,0)[0]
Total fit time: 1.750 seconds
Out[36]:
'(ํด์)\n - auto_arima๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ์์ ์ต์ ์ ๋ชจ๋ธ์ ARIMA(1, 1, 0) ๋ชจํ์ผ๋ก ๊ฒฐ์ ๋จ\n - ๋ชจ๋ธ์ด ์ค๋ช
๋ ฅ(๊ฒฐ์ ๋ ฅ)์ด ์ข์ ์๋ก AIC ๊ฐ์ด ์์์ง๊ณ ,\n - ๋ชจ๋ธ์ ๋ณต์ก๋๊ฐ ๋์์ง์๋ก AIC๊ฐ์ด ์ปค์ง\n - AIC๊ฐ์ ์์ ์๋ก ์ข์\n'
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
728x90
๋ฐ์ํ