70일차 학습 내용
- 시계열 데이터 분석 Project
▶ARIMA, Facebook Prophet 모델을 이용하여 삼성 주가 예측하기
⑥ ARIMA 모수 추정
ⓐ d(차분 횟수) 추정
import pmdarima as pm from pmdarima.arima.utils import ndiffs n_diffs = ndiffs(samsung_data, alpha=0.05, test='adf', max_d=6) print(f"추정된 차수 d = {n_diffs}")
결과: 추정된 차수 d = 1
ⓑ auto arima로 p(AR 차수), q(MA차수) 추정
from statsmodels.tsa.arima_model import ARIMA model_fit = pm.auto_arima( y=train_data, d=1, start_p=0, max_p=6, start_q=0, max_q=6, m=1, stepwise=True, trace=True ) print(model_fit.summary())

- 결과 : ARIMA(0,1,0)으로 parameter 확정
⑦ ARIMA 모델 적용
print(model_fit.summary())

⑧ 예측값 생성
ⓐ forecast 함수 정의
def forecast_n_step(model, n = 1): fc, conf_int = model.predict(n_periods=n, return_conf_int=True) return (fc.tolist()[0:n], np.asarray(conf_int).tolist()[0:n]) def forecast(len, model, index, data=None): y_pred, pred_upper, pred_lower = [],[],[] if data is not None: for new_ob in data: fc, conf = forecast_n_step(model) y_pred.append(fc[0]) pred_upper.append(conf[0][1]) pred_lower.append(conf[0][0]) model.update(new_ob) else: for i in range(len): fc, conf = forecast_n_step(model) y_pred.append(fc[0]) pred_upper.append(conf[0][1]) pred_lower.append(conf[0][0]) model.update(fc[0]) return pd.Series(y_pred, index=index), pred_upper, pred_lower fc, upper, lower = forecast(len(test_data), model_fit, test_data.index, data = test_data) lower_series = pd.Series(lower, index=test_data.index) # 예측결과의 하한 바운드 upper_series = pd.Series(upper, index=test_data.index) # 예측결과의 상한 바운드
ⓑ 예측값 생성
print(fc.head()) print('-'*80) print(upper_series.head()) print('-'*80) print(lower_series.head())
결과: Date 2023-11-01 72800.0 2023-11-02 68600.0 2023-11-03 69700.0 2023-11-06 69600.0 2023-11-07 70900.0 dtype: float64 -------------------------------------------------------------------------------- Date 2023-11-01 74698.267496 2023-11-02 70500.227460 2023-11-03 71600.227460 2023-11-06 71500.227460 2023-11-07 72800.227460 dtype: float64 -------------------------------------------------------------------------------- Date 2023-11-01 70901.732504 2023-11-02 66699.772540 2023-11-03 67799.772540 2023-11-06 67699.772540 2023-11-07 68999.772540 dtype: float64
⑨ 모델 검증
fc_diff = np.sign(fc.diff().dropna()) real_diff = np.sign(test_data.diff().dropna()) correct_predictions = np.sum(fc_diff == real_diff) total_predictions = len(fc_diff) accuracy = correct_predictions / total_predictions
fc_diff = np.sign(fc.diff().dropna()) print('예측값의 상승, 하락 여부') print(fc_diff) print('-'*80) real_diff = np.sign(test_data.diff().dropna()) print('실제값의 상승, 하락 여부') print(real_diff) print('-'*80) correct_predictions = np.sum(fc_diff == real_diff) print('상승, 하락 여부 예측 정확도') print(correct_predictions) print('-'*80) total_predictions = len(fc_diff) accuracy = correct_predictions / total_predictions print(f'상승, 하락 여부 예측 정확도 비율: {accuracy * 100:.2f}%')
- 결과
→ 상승, 하락 여부를 정확하게 맞춘 개수=7개, 정확도=33.33%(7/21)


⑩ 최종 결과
ⓐ 예측값과 실제값을 적용하여 시각화
plt.figure(figsize=(20,6)) plt.plot(train_data, label='train_data') plt.plot(test_data, c='b', label='test_data (actual price)') plt.plot(fc, c='r',label='predicted price') plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.10) plt.legend(loc='upper left') plt.show()

ⓑ 예측 기간 시각화(11월 한 달)
plt.figure(figsize=(20,6)) plt.plot(test_data, c='b', label='test_data (actual price)') plt.plot(fc, c='r',label='predicted price') plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.10) plt.legend(loc='upper left') plt.show()

'AI데이터 엔지니어, 새싹' 카테고리의 다른 글
77th_12_22(Fri)_Streamlit 활용 (0) | 2024.01.08 |
---|---|
75th_12_20(Wed)_API활용 웹 크롤링 (1) | 2024.01.08 |
73th_12_18(Mon)_Web Scrapping (1) | 2023.12.18 |
62th_121_Overfitting (0) | 2023.12.04 |
61th_11_30(Thu)_ResNet (1) | 2023.11.30 |