본문 바로가기
시계열모델링

[데이터로 보는 미래] 경제 순환을 반영한 삼성전자 주가 예측, Prophet 모델 활용!

by 다빈치스탁 2024. 4. 11.
728x90
반응형

안녕하세요, 다빈치스탁의 시청자 여러분. 오늘은 지난 시간에 이어서, 경기순환과 시장 예측의 심화된 내용으로, 특정 종목의 미래 주가를 예측하는 방법에 대해 알아보겠습니다. 이번 강의에서는 Prophet이라는 도구를 중심으로 살펴볼 것입니다.

 

Prophet 모델은 페이스북에서 개발한 시계열 데이터 예측 도구로, 트렌드, 계절성, 그리고 휴일 효과를 포함하여 비선형 추세를 예측할 있는 가법 모델을 기반으로 합니다. 모델은 연간, 주간, 일간 패턴을 유연하게 포착하여 강한 계절성을 가진 데이터에 특히 적합합니다.

 

모델의 핵심 구성 요소는 다음과 같은 방정식으로 표현됩니다:

여기서 ( g(t) ) 트렌드 함수, ( s(t) ) 계절성 함수, ( h(t) ) 휴일 구성 요소, 그리고 ( \epsilon_t ) 오차 항을 나타냅니다.

 

특히, 계절성을 모델링할 때는 다음과 같은 푸리에 급수를 사용하여 복잡한 계절성 패턴을 유연하게 포착하는 것이 장점입니다.

이처럼, Prophet 모델은 트렌드 변화 감지, 계절성 모델링, 그리고 휴일 이벤트 모델링을 통해 예측의 정확도를 높입니다. 사용자 친화적인 설계로, 복잡한 파라미터 튜닝 없이도 좋은 예측 결과를 제공합니다.

 

게다가, Prophet 모델은 ARIMA 같은 전통적인 시계열 예측 방법과 가지 중요한 차이점을 가지고 있는데요. 이러한 차이점들로 인해 Prophet 유연하고 사용하기 쉬운 모델로 평가받고 있습니다.

 

그럼 지금부터 파이썬으로 prophet 모델을 활용하여 삼성전자에 대한 미래주가를 예측해보겠습니다. 지난 시간에 우리는 대한민국의 경기 순환 주기가 대략 4~4.5년임을 알아보았습니다. 따라서, 최소 4 이상의 데이터를 이용해야 결과의 신뢰도를 높일 있습니다.

# 주석을 해제하고 facebook_prophet 을 설치하세요.
# pip install prophet

# prophet 설치과정 중 관련한 에러문구가 나올 경우 아래의 라이브러리를 설치 후 진행하세요.
# visual studio c++ 라이브러리가 없을 경우 : https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/
# 위 링크를 방문하여 라이브러리 설치 후 아래의 명령어 실행, 만약 정상설치 될 경우 추가적으로 진행할 필요가 없습니다.
# pip install cython
# pip install plotly
# pip install pystan

# 필요한 라이브러리 임포트
import yfinance as yf
from prophet import Prophet
import matplotlib.pyplot as plt
import pandas as pd

# 삼성전자의 종가 데이터 다운로드
df = yf.download("005930.KS", start="2019-08-01", end="2024-04-10")
df.reset_index(inplace=True)

# prophet 모델에 맞게 ds와 y 컬럼 지정
df_train = df[df['Date'] < '2023-08-01'][["Date", "Close"]]
df_train = df_train.rename(columns={"Date": "ds", "Close": "y"})

# prophet 모델 생성 및 학습(default values)
m = Prophet(
    # changepoint_prior_scale: 트렌드의 유연성을 조절하는 파라미터로, 이 값을 조정함으로써 
    # 모델이 트렌드 변화를 얼마나 민감하게 감지할지 결정할 수 있습니다.
    changepoint_prior_scale=0.05,
    # weekly_seasonality: 주간 데이터의 계절성을 나타냅니다. 
    # 데이터가 일별 데이터로 날짜가 길면 weekly_seasonality = True로 설정합니다
    weekly_seasonality=10,
    # 연간 데이터의 계절성을 나타냅니다. 
    # 데이터가 연간 데이터로 이루어져 있으면 yearly_seasonality = True로 설정합니다
    yearly_seasonality=10,
    # 일간 데이터의 계절성을 나타냅니다. 
    # 데이터가 일별 데이터면 daily_seasonality = True로 설정합니다
    daily_seasonality=10,
    # 가법 모델(additive model) : 일반적 시계열, y(t)=g(t)+s(t)+h(t)+ϵ_t
    # 승법 모델(multiplicative model) : 계절성 요소가 시간에 따라 변하는 트렌드의 크기에 
    # 비례하여 변화하는 시계열, y(t)=g(t)⋅s(t)⋅h(t)⋅ϵ_t
    seasonality_mode='additive'
)
m.fit(df_train)

# 향후 365일간의 주가 예측
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)

# 실제 데이터와 예측 데이터 병합
df_test = df[df['Date'] >= '2023-08-01'][["Date", "Close"]]
df_test = df_test.rename(columns={"Date": "ds", "Close": "Actual"})
forecast = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
merged = pd.merge(forecast, df_test, on='ds', how='left')

# 예측 결과 및 실제 주가 시각화
plt.figure(figsize=(14, 7))
plt.plot(merged['ds'], merged['yhat'], label='Predicted')
plt.plot(merged['ds'], merged['Actual'], label='Actual', color='r')
plt.scatter(df_train['ds'], df_train['y'], color='black', s=10, label='Historical Data')  # 검정색 점 추가
plt.fill_between(merged['ds'], merged['yhat_lower'], merged['yhat_upper'], alpha=0.2)
plt.legend()
plt.show()

주가예측을 위한 종목으로 삼성전자를 선택하였고, 2019 8월부터 오늘까지의 데이터를 이용했습니다. Prophet 모델의 예측 파라미터는 별다른 수정 없이 디폴트 값을 그대로 사용할 것입니다.

 

예측의 시작점을 2023 8 1일로 설정하고, 2024 8 1일까지 예측을 수행하였습니다. 예측된 주가는 파란색의 실선으로, 과거의 차트는 검정색 점으로, 그리고 예측 이후 실제 주가는 빨간선으로 표시됩니다.

 

예측결과와 실제주가를 비교해보면, 변동성 추세가 아주 근소한 차이로 일치하는 높은 정확도를 보이고 있습니다. 이는 Prophet 모델이 경기순환 업종이면서 대형주인 삼성전자와 같은 종목의 예측에 아주 높은 신뢰도를 보여준다는 것을 의미합니다.

 

지금까지 살펴본 것처럼 주가는 결국 실적의 바로미터이며, 실적은 경제순환주기를 크게 벗어나기 어렵습니다. 따라서 경제의 흐름을 이해하는 것은 매우 중요하며, Prophet 모델은 미래에 대한 인사이트를 얻기 위한 강력한 도구입니다.

 

물론 Prophet 모델이 모든 시계열 데이터에 대해 항상 나은 성능을 보이는 것은 아닙니다. 그러나 주식투자를 진행함에 있어서 캔들패턴, 기술적 지표와 같은 미시적인 요소들에만 집중하다 보면 시장의 흐름을 놓치게 됩니다.

 

따라서, 투자 결정을 내릴 때는 단기적인 신호들에만 의존하기보다는, 오늘 배운 내용을 토대로 경제 전반의 흐름과 기업의 기본적인 가치를 함께 고려해보시길 바랍니다.

 

이상으로 오늘의 강의 내용을 마치도록 하겠습니다. 시청해주셔서 감사합니다.

728x90
반응형

댓글