๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
์๊ธฐ ์๊ด(AutoCorrelation)์ด ๊ฐํ ์๊ณ์ด ๋ฐ์ดํฐ ํ์ตํ๊ธฐ ๋ณธ๋ฌธ
์๊ธฐ ์๊ด(AutoCorrelation)์ด ๊ฐํ ์๊ณ์ด ๋ฐ์ดํฐ ํ์ตํ๊ธฐ
์ง์ง์ํ์นด 2022. 9. 28. 14:49220928 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ today-1๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-) >
https://today-1.tistory.com/56?category=886697
์๊ณ์ด ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(Denoising Method)
์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๊ณผ์ ์์ ์๊ฐ ํ๋ฆ์ ๋ฐ๋ผ ๋ณ๋์ด ํฌ๊ฑฐ๋ ์ผ์ ํ์ง ์์ ๊ฒฝ์ฐ ๋น์ ์์ฑ(Non-Stationarity)์ ์ง๋๊ฒ ๋๊ณ ์ด๋ฅผ ์ ์ฒ๋ฆฌ ์์ด ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ตํ ๊ฒฝ์ฐ ๋จ์ ํํ
today-1.tistory.com
1๏ธโฃ ์๊ธฐ ์๊ด(AutoCorrelation)
: ํ์ฌ ๊ด์ธก๊ฐ๊ณผ ์ง์ฐ(Lag) ๊ฐ๋ค๊ณผ์ ๊ด๊ณ์์ ๋ฐ์
: ๊ด๊ณ์ฑ์ ํ์ ํ๊ธฐ ์ํด ACF/PACF ๋ฑ์ ์ฌ์ฉํ์ฌ ์ง๊ด์ ์ผ๋ก ์์๋ณด๊ฑฐ๋ Durbin-Watson ๊ฒ์ ์ ํตํด ๊ฐ๊ด์ ์ผ๋ก ์ดํด๋ด
2๏ธโฃ ์ฝ๋ ๊ตฌํ
๐ 1. library & data load
# ์์ ๋ก ์ฌ์ฉํ ์ฃผ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
!pip install finance-datareader
import pandas as pd
import FinanceDataReader as fdr
start_date = '20210101'
end_date = '20211231'
sample_code = '005930' # ์ผ์ฑ์ ์
stock = fdr.DataReader(sample_code, start = start_date, end = end_date)
๐ ์ก์ ์ ๊ฑฐ (Denoising)
- (1) ๋จ์ ์ด๋ํ๊ท (Simple Moving Average)
- ๊ตฌํ ๋ฐ ์ ์ฉ์ด ์ฉ์ดํ๋ ์ ์ ํ ํ๋ผ๋ฏธํฐ ์ค์ ๊ณผ ๊ฐ์ด ์ฐ์ธก์ผ๋ก ์ง์ฐ๋๋ ํน์ฑ
def SMA(df, col, window=2):
return df[col].rolling(window=window, min_periods=1).mean()
stock['MA(5)'] = SMA(stock, 'Close', 5)
stock['MA(5)'].plot(grid=True)
- (2) ์ง์ ์ด๋ํ๊ท (Exponetial Moving Average)
- ์ต๊ทผ๊ฐ์ ๊ฐ์ค์น๋ฅผ ์ฃผ๋ฉฐ ์ด๋ํ๊ท ์ ๊ณ์ฐ
- ํํ ๊ณ์(EP = 2/(๊ธฐ๊ฐ+1) ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์์ด๋ํ๊ท ์ ๊ณ์ฐ
- ์ง์์ด๋ํ๊ท = (์ข ๊ฐ(t) x EP) + (์ง์ ์ด๋ํ๊ท (t-1) x (1-EP))
def EMA(df, col, span=2):
return df[col].ewm(span=span).mean()
stock['EMA(5)'] = EMA(stock, 'Close', 5)
stock['EMA(5)'].plot(grid=True)
- (3) ํธ๋ฆฌ์ ๋ณํ(Fourier Transform)
- ์ด๋ค ๋ณต์กํ ํ๋์ด๋ผ๋ ์ง๋์์ ์งํญ์ด ๋ค๋ฅธ ๊ฐ๋จํ ํ๋๋ค์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค
- ์๊ฐ ์ฐจ์์์ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฃผํ์ ์ฐจ์์ผ๋ก ๋ณํํ์ฌ ํน์ ์์ ํ๋๋ค์ ํฉ์ ๊ณ์ฐํ๊ณ ๋ค์ ์๊ฐ ์ฐจ์์ผ๋ก ๋ณํ => ์ก์์ ์ ๊ฑฐํ์ฌ ์ฌ๋ฐ๋ฅธ ์ ํธ๋ฅผ ํฌ์ฐฉ
def FFT(df, col, topn=2):
fft = np.fft.fft(df[col])
fft[topn:-topn] = 0
ifft = np.fft.ifft(fft)
return ifft
stock['FFT(30)'] = FFT(stock, 'Close', 30)
stock['FFT(30)'] .plot(grid=True)
- ๋ณต์กํ ํ๋์ ๋จ์ํ ํ๋๋ค์ ํฉ์ผ๋ก ํํํ๊ณ ๋ค์ ์๊ฐ์ฐจ์์ผ๋ก ๋ณํ์ํค๋ ๊ณผ์ ์์ ์๊ฐ์ถ์ ์ ๋ณด๊ฐ ์์ค
- ์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํน์ ์๊ฐ ๊ตฌ๊ฐ๋ณ๋ก ํธ๋ฆฌ์ ๋ณํ์ ์งํํ๋ STFT(Short Time Fourier Transform)์ด ์๊ฐ
- but, ํน์ ์๊ฐ๋(=window size)๋ฅผ ์ค์
- ๊ธธ๊ฒ ์ก์ผ๋ฉด ์ฃผํ์ ํด์๋๋ ์์นํ๊ณ ์๊ฐ์ ๋ํ ํด์๋๋ ํ๋ฝ
- ์งง๊ฒ ์ก์ผ๋ฉด ์ฃผํ์ ํด์๋๊ฐ ๊ฐ์ํ๊ณ ์๊ฐ์ ๋ํ ํด์๋๋ ์์น
- ์๊ฐ๊ณผ ์ฃผํ์ ํด์๋์ ๋ํด Trade-off ๊ด๊ณ
- but, ํน์ ์๊ฐ๋(=window size)๋ฅผ ์ค์
- (4) ์จ์ด๋ธ๋ฆฟ ๋ณํ(Wavelet Transform)
- ํธ๋ฆฌ์ ๋ณํ์ ๋จ์ ์ ํด์ํ๊ณ ์ ๊ฐ๋ฐ
- ๊ณ ์ฃผํ ์ฑ๋ถ ์ ํธ์ ๋ํด์๋ ์ฃผํ์ ํด์๋๋ฅผ ๋์ด๊ณ ์๊ฐ ํด์๋๋ฅผ ๋ฎ์ถค
- ์ ์ฃผํ ์ฑ๋ถ ์ ํธ์ ๋ํด์๋ ์ฃผํ์ ํด์๋๋ฅผ ๋ฎ์ถ๊ณ ์๊ฐ ํด์๋๋ฅผ ๋์ด๋ ์จ์ด๋ธ๋ฆฟ ํจ์๋ฅผ ์ฌ์ฉ
- ์จ์ด๋ธ๋ฆฟ ๋ณํ์ ์๊ฐ์ ํ์ฅ๊ณผ ์ถ์ํ๋ Scaling๊ณผ ์๊ฐ ์ถ์ผ๋ก ์ด๋๋๋ Shifting์ด ํต์ฌ
- ๋์ผํ ์๋ฃ๋ฅผ ๋ถ์ํ๋๋ผ๋ ๋ชจ ์จ์ด๋ธ๋ฆฟ์ ์ ํ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํน์ฑ์ ๋ง๋ ๋ชจ ์จ์ด๋ธ๋ฆฟ์ ์ ์ ํ
- ์ด์ฐ ์จ์ด๋ธ๋ฆฟ ๋ณํ์ ์ํด Haar, Daubechies ๋ฑ์ ๋ง์ด ์ฌ์ฉ
!pip install PyWavelets
def WT(df, col, wavelet='db5', thresh=0.63):
signal = df[col].values
thresh = thresh*np.nanmax(signal)
coeff = pywt.wavedec(signal, wavelet, mode="per" )
coeff[1:] = (pywt.threshold(i, value=thresh, mode="soft" ) for i in coeff[1:])
reconstructed_signal = pywt.waverec(coeff, wavelet, mode="per" )
return reconstructed_signal
stock['db5'] = WT(stock, 'Close')
stock['db5'] .plot(grid=True)
- (5) AutoEncoder
- ์ข ๋จ ๊ฐ(end-to-end) ๋ฅ๋ฌ๋ ๋ชจ๋ธ๋ก ์ก์์ ์ ๊ฑฐํ ์ ์๋ ์์ฉ๋ชจ๋ธ(AutoEncoder,.. etc)์ ์์ธก ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐ์์ผ ํ์ต์ ์งํํ๋ค๋ฉด ํ์ต ๋น์ฉ์ ๊ฐ์์ํค๋ฉด์ ํจ๊ณผ์ ์ผ๋ก ์ฑ๋ฅ์ ํฅ์
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.utils.data as data_utils
class TimeDistributed(nn.Module):
def __init__(self, module):
super(TimeDistributed, self).__init__()
self.module = module
def forward(self, x):
if len(x.size()) <= 2:
return self.module(x)
x_reshape = x.contiguous().view(-1, x.size(-1))
y = self.module(x_reshape)
if len(x.size()) == 3:
y = y.contiguous().view(x.size(0), -1, y.size(-1))
return y
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.LSTM(
input_size = 1,
hidden_size = 16,
dropout = 0.25,
num_layers = 2,
bias = True,
batch_first = True,
bidirectional = True,
)
self.decoder = nn.LSTM(
input_size = 32,
hidden_size = 16,
dropout = 0.25,
num_layers = 2,
bias = True,
batch_first = True,
bidirectional = True,
)
self.fc = TimeDistributed(nn.Linear(32, 1))
def forward(self, x):
h0, (h_n, c_n) = self.encoder(x)
h0, (h_n, c_n) = self.decoder(h0[:,-1:,:].repeat(1,5,1))
out = self.fc(h0)
return out
๐ ์๊ฐํ
- ๋จ์ ์ด๋ํ๊ท (MA)๊ณผ ์ง์ ์ด๋ํ๊ท (EMA)์ ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋นํด ์ค๋ฌด๋ฉ ๋ ํํ์ ์ป์
- ์ฌ์ ํ ํฐ ๋ถ์ฐ์ ๋ณด์ด๊ณ ์์
- ํธ๋ฆฌ์ ๋ณํ(FFT)์ ์ดํด๋ณด๋ฉด ๊ธฐ์กด ๋ฐฉ๋ฒ๋ค์ ๋นํด ๋ ๋ถ๋๋ฌ์ด ํํ์ ๊ฐ์ง๊ฒ ๋์๊ณ ๋ง์ ์ก์์ด ์ ๊ฑฐ
- ์จ์ด๋ธ๋ฆฟ ๋ณํ(WT)์ ํธ๋ฆฌ์ ๋ณํ๋ณด๋ค ๋ ๋ถ๋๋ฌ์ด ํ๋์ ํํ๋ฅผ ์ง๋๊ฒ ๋์ด ๊ธฐ์กด ์ก์๊ณผ ๋๋ถ์ด ์ ๋ณด๊น์ง ๊ฐ์ด ์์ค
- ์คํ ์ธ์ฝ๋(AE)์ ๊ฒฝ์ฐ ๊ธฐ์กด ๋ฐ์ดํฐ์ ํธ๋ฆฌ์ ๋ณํ ์ค๊ฐ์ฏค์ ํํ๋ ฅ์ ์ง๋
- 1. ํธ๋ฆฌ์ ๋ณํ(FFT)์ด ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ
- 2. ์คํ ์ธ์ฝ๋(AE) ๋ชจ๋ธ์ด ์ก์ ์ ๊ฑฐ๋ก ์ธํด ์ข์ ์ฑ๋ฅ
- 3. ์ด๋ํ๊ท (MA, EMA) ๋ฐฉ๋ฒ๋ค์ ๊ณผ๊ฑฐ์ ๊ฒฐ๊ณผ ์๋ฃ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ํํ ์์ธก์ด ์ฌ์ ํ ์กด์ฌ (๊ฒ์ฆ ๋ฐ์ดํฐ์ ํ์ต์ด ์ ๋๋ก ์งํ๋์ง ์์)
- 4. ์จ์ด๋ธ๋ฆฟ ๋ณํ(WT)์ ๊ฒฝ์ฐ ํํ ์์ธก ๋ฌธ์ ๋ฅผ ํด์ํ ์ ์์ผ๋ ๋ณํ ์์ ์์ ์ ํธ์ ์ก์๊ณผ ์ ๋ณด๋ฅผ ๊ฐ์ด ์์ค๋์ด ์ ํ๋๋ฅผ ์๊ฒ๋จ
'๐ฉโ๐ป ์ธ๊ณต์ง๋ฅ (ML & DL) > Serial Data' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ต๊ณผ์ ๋ฆฌ๋ทฐ] Forecasting: Principles and Practice (1) | 2022.10.05 |
---|---|
๋ค๋ณ๋ ์๊ณ์ด ๋ฐ์ดํฐ 2 (Multivariate Time Series Data) (1) | 2022.09.30 |
์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์ ์์ (Time Series Analysis Order) (0) | 2022.09.28 |
๋ค๋ณ๋ ์๊ณ์ด ๋ฐ์ดํฐ 1 (Multivariate Time Series Data) (0) | 2022.09.28 |
์๊ณ์ด ๋ฐ์ดํฐ(Serial data) ์ ์ฒ๋ฆฌ ํ๊ธฐ (2) (0) | 2022.09.27 |