머신러닝에서 여러 가지 패키지와 라이브러리를 사용해서
삼성전자의 주식을 예측하는 코드를 만들어 보겠습니다.
데이터셋은 주식관련 데이터를 가져올 수 있는 Yahoo Finance에서 불러옵니다.
from statsmodels.tsa.arima_model import ARIMA # ARIMA 라는 시계열 패키지를 가져옵니다.
import statsmodels.api as sm # 데이터를 전처리 후 회귀분석을 적용해 회귀계수를 구할 수 있게 도와주는 패키지.
%matplotlib inline
#일반적으로 가장 많이 사용하는 패키지를 가져옵니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
from fbprophet import Prophet
가장 먼저 할 일은 필요한 패키지를 import 하는 것입니다.
그다음은 필요한 데이터를 불러옵니다.
samsung_df = yf.download('005930.KS',
start='2020-01-01',
end='2021-10-05',
progress=False)
samsung_df
위와 같이 2020년 1월 1일부터 시작해서, 2021년 10월 5일에 끝나는 삼성전자 주식 데이터를 가져옵니다.
가져온 데이터는 아래와 같은 형태로 존재합니다.
불러온 데이터에서 Close(종가)의 데이터만을 가져와 price라고 지정하고,
간단하게 시각화합니다.
samsung_df = samsung_df[["Close"]]
samsung_df = samsung_df.reset_index()
samsung_df.columns = ['day', 'price']
samsung_df['day'] = pd.to_datetime(samsung_df['day'])
samsung_df.index = samsung_df['day']
samsung_df.set_index('day', inplace=True)
samsung_df
fig, ax = plt.subplots(figsize=(15, 8))
samsung_df.plot(ax=ax)
이렇게 가져온 데이터와 시각화한 결과입니다.
이제 이러한 데이터를 첫날부터 430일 동안의 데이터는 train데이터,
그 이후의 5일 동안의 데이터를 test데이터로 구분합니다.
samsung_train_df = samsung_df[:430]
samsung_test_df = samsung_df[430:]
samsung_train_df
samsung_test_df
여기까지 필요한 데이터를 가져오는 기본적인 단계이고,
이제 ARIMA을 이용해 시계열 예측을 해 보겠습니다.
ARIMA 모형은 자기 상관 모형(AR)과 이동평균 모형(MA)이 합쳐진 모형으로
일반적으로 가장 선호되는 모델입니다.
model = ARIMA(samsung_train_df.price.values, order = (2,1,2))
model_fit = model.fit(trend = 'c', full_output = True, disp = True)
print(model_fit.summary())
fig = model_fit.plot_predict()
ARIMA 시계열 모델을 AR=2 , 차분=1, MA=2라고 설정하고 그에 따른 결과와 시각화를 출력한 것입니다.
이후 과정은 지금까지의 과정을 통해 얻을 수 있는 예측값, 예측 최저값, 예측 최고값, 실제 가격을 시각화합니다.
forecast_data = model_fit.forecast(steps=5)
pred_arima_y = forecast_data[0].tolist() # 마지막 5일의 예측 데이터 (2021-09-28 ~ 2021-10-05)
test_y = samsung_test_df.price.values # 실제 5일의 데이터 (2021-09-28 ~ 2021-10-05)
pred_y_lower = [] # 마지막 5일의 예측 데이터 최소값
pred_y_upper = [] # 마지막 5일의 예측 데이터 최대값
for lower_upper in forecast_data[2]:
lower = lower_upper[0]
upper = lower_upper[1]
pred_y_lower.append(lower)
pred_y_upper.append(upper)
plt.figure(figsize=(15, 10))
plt.plot(pred_arima_y, color = 'gold') # 모델이 예측한 가격 그래프
plt.plot(pred_y_lower, color = 'red') # 모델이 예측한 최저 가격 그래프
plt.plot(pred_y_upper, color = 'blue') # 모델이 예측한 최고 가격 그래프
plt.plot(test_y, color = 'green') # 실제 가격 그래프
#4가지 종류의 데이터를 시각화
plt.legend(['예측값', '최저값','최대값','실제값'])
plt.title("값 비교")
plt.show()
이렇게 시각화된 자료를 통해 삼성전자 주식 예측 과정을 마무리할 수 있습니다.
데이터를 가져오는 건 쉽고, 전처리과정도 어렵지 않지만
모델을 설정해서 데이터를 예측하는 과정이 조금 어려운 과정이었습니다.
감사합니다.