개발 창고/AI

파이썬과 Prophet으로 삼성전자 주가 예측: 시계열 분석 입문

Royzero 2025. 10. 10. 17:21
반응형

Prophet은 다음을 고려하지 못합니다:

  • 기업 실적 발표
  • 경제 지표 변화
  • 국제 정세
  • 시장 심리
  • 산업 트렌드

따라서 주식 예측에는 한계가 있으며, 교육/학습 목적으로만 사용해야 합니다.


 

TL;DR: 본 문서는 Python을 이용해 삼성전자 주가 데이터를 수집하고, Prophet 라이브러리로 시계열 예측 모델을 만드는 방법을 다룹니다. yfinance 라이브러리로 삼성전자(티커: 005930.KS)의 과거 주가 데이터를 다운로드합니다. 이후 Prophet 모델이 요구하는 형식(ds, y 컬럼)에 맞게 데이터를 전처리합니다. 모델을 학습시킨 후, 미래 기간에 대한 주가를 예측하고 matplotlib을 통해 결과를 시각화하여 추세와 계절성을 확인하는 과정을 포함합니다. 이 가이드는 금융 데이터 분석 및 시계열 예측의 기초를 다루는 실무자에게 유용합니다.


서론: Prophet을 이용한 시계열 예측의 중요성

금융 시장에서 주가 예측은 가장 도전적이고 흥미로운 분야 중 하나입니다. Prophet은 Meta(구 Facebook)에서 개발한 오픈소스 시계열 예측 라이브러리로, 복잡한 시계열 데이터를 비교적 간단하게 모델링하고 예측할 수 있도록 설계되었습니다. 특히 계절성(Seasonality)과 추세(Trend), 휴일 효과를 잘 처리하여 비전문가도 쉽게 사용할 수 있다는 장점이 있습니다.

이 글에서는 파이썬 환경에서 삼성전자 주가 데이터를 yfinance 라이브러리를 통해 가져오고, Prophet 모델을 활용하여 미래 주가를 예측하는 전체 과정을 단계별 예제 코드와 함께 상세히 설명합니다.

Why it matters: Prophet은 기존의 복잡한 시계열 모델(ARIMA 등)에 비해 직관적이고 사용하기 쉬우며, 준수한 성능을 보여줍니다. 실무자들이 복잡한 튜닝 없이 빠르게 시계열 데이터의 패턴을 파악하고 미래를 예측하는 프로토타입을 만들 때 매우 유용합니다.


1단계: 개발 환경 설정 및 라이브러리 설치

가장 먼저 필요한 파이썬 라이브러리들을 설치해야 합니다. 데이터 분석에는 pandas, 주가 수집에는 yfinance, 시계열 예측에는 prophet, 결과 시각화에는 matplotlib이 사용됩니다.

!pip install pandas yfinance prophet matplotlib -q

설치가 완료되면, 필요한 라이브러리들을 임포트합니다.

import pandas as pd
import yfinance as yf
from prophet import Prophet
import matplotlib.pyplot as plt

 

Why it matters: 정확한 버전의 라이브러리를 설치하고 프로젝트를 시작하는 것은 재현 가능하고 안정적인 분석 환경을 구축하는 첫걸음입니다. 각 라이브러리는 특정 역할을 수행하므로, 누락 없이 모두 설치하는 것이 중요합니다.


2단계: yfinance로 삼성전자 주가 데이터 가져오기

yfinance는 Yahoo Finance API를 통해 주식 데이터를 간편하게 다운로드할 수 있는 라이브러리입니다. 삼성전자의 티커(Ticker)는 '005930.KS'입니다. yf.download() 함수를 사용하여 지난 5년간의 데이터를 가져오겠습니다.

# 삼성전자 티커
ticker = '005930.KS'

# 데이터 다운로드 (예: 2020-01-01부터 2025-10-10까지)
start_date = '2020-01-01'
end_date = '2025-10-10'
data = yf.download(ticker, start=start_date, end=end_date)

# 데이터 앞부분 5개 확인
print(data.sort_index(ascending=False).head())
Date Close High Low Open Volume
2025.10.2 89,750 90,300 88,700 89,300 49,883,028
2025.10.1 86,000 86,200 84,700 84,900 22,039,361
2025.9.30 83,900 84,900 83,400 84,600 16,319,061
2025.9.29 84,200 85,000 83,200 83,300 13,069,094
2025.9.26 83,300 85,300 82,400 85,000 24,071,193

 

다운로드된 데이터는 시가(Open), 고가(High), 저가(Low), 종가(Close), 수정 종가(Adj Close), 거래량(Volume) 컬럼으로 구성된 Pandas DataFrame 형태입니다.

 

Why it matters: 정확하고 신뢰할 수 있는 과거 데이터를 확보하는 것은 예측 모델의 성능을 좌우하는 핵심 요소입니다. yfinance를 사용하면 단 몇 줄의 코드로 표준화된 금융 데이터를 손쉽게 얻을 수 있습니다.


3단계: Prophet 모델을 위한 데이터 전처리

Prophet 모델은 특정 형식의 입력 데이터를 요구합니다. 바로 날짜 정보가 있는 ds 컬럼과 예측할 값(여기서는 종가)이 담긴 y 컬럼입니다. 다운로드한 데이터를 이 형식에 맞게 가공해야 합니다.

# 날짜 인덱스를 컬럼으로 변환
df = data.reset_index()

# 필요한 컬럼만 선택하고 이름 변경
df = df[['Date', 'Close']].rename(columns={'Date': 'ds', 'Close': 'y'})

# MultiIndex 컬럼 문제 해결 (yfinance가 반환하는 데이터 구조 때문)
if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.get_level_values(0)

# ds 컬럼을 datetime 형식으로 변환
df['ds'] = pd.to_datetime(df['ds'])

# y 컬럼을 숫자형으로 명시적 변환 및 평탄화
df['y'] = df['y'].values.flatten()

# NaN 값 제거
df = df.dropna()

# 데이터 확인
print(df.sort_index(ascending=False).head())
Price ds y
1412 2025.10.2 89,750
1411 2025.10.1 86,000
1410 2025.9.30 83,900
1409 2025.9.29 84,200
1408 2025.9.26 83,300

 

Why it matters: 데이터 전처리는 모델링에서 가장 많은 시간이 소요될 수 있는 중요한 단계입니다. 모델의 요구사항에 맞게 데이터를 정확히 변환해야만 오류 없이 모델 학습을 진행할 수 있습니다.


4단계: Prophet 모델 학습 및 미래 예측

데이터 준비가 완료되었으면 Prophet 모델을 생성하고 학습시킬 차례입니다. 모델 객체를 생성한 후 fit() 메소드를 호출하여 데이터를 학습시킵니다.

# Prophet 모델 생성 (한국 공휴일 포함)
model = Prophet(daily_seasonality=True)
model.add_country_holidays(country_name='KR')

# 모델 학습
model.fit(df)

학습이 완료되면, make_future_dataframe() 함수를 사용해 예측을 수행할 미래 기간을 정의합니다. 예를 들어, 향후 365일(1년)을 예측해 보겠습니다.

# 미래 365일 예측
future = model.make_future_dataframe(periods=365)

# 예측 실행
forecast = model.predict(future)

# 예측 결과 확인 (마지막 5개 행)
display(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
  ds yhat yhat_lower yhat_upper
1773 2026.9.28 52,281.35667 37,493.68425 66,900.36074
1774 2026.9.29 52,182.02656 37,075.11049 68,163.16971
1775 2026.9.30 51,775.90743 37,543.43204 68,660.54809
1776 2026.10.1 51,368.63271 37,018.00412 67,333.97566
1777 2026.10.2 50,699.6975 35,662.37866 65,590.34719

 

forecast DataFrame에는 예측값(yhat)과 예측의 불확실성을 나타내는 신뢰구간(yhat_lower, yhat_upper)이 포함됩니다.

 

Why it matters: 모델 학습과 예측은 시계열 분석의 핵심입니다. Prophet은 이 과정을 단 몇 줄의 코드로 단순화하여, 사용자가 복잡한 수학적 이론 대신 데이터와 예측 결과 해석에 집중할 수 있도록 돕습니다.


5단계: 예측 결과 시각화

마지막으로 예측 결과를 시각화하여 모델이 데이터를 어떻게 학습했고 미래를 어떻게 전망하는지 직관적으로 확인합니다. Prophet은 plot()과 plot_components()라는 편리한 시각화 함수를 제공합니다.

# 예측 결과 그래프
fig1 = model.plot(forecast)
plt.title('Samsung Electronics Stock Price Forecast')
plt.xlabel('Date')
plt.ylabel('Close Price (KRW)')
plt.show()

위 그래프는 과거 데이터(검은 점), 예측값(파란 선), 신뢰구간(하늘색 영역)을 함께 보여줍니다.

# 예측 성분 분해 그래프
fig2 = model.plot_components(forecast)
plt.show()

plot_components는 데이터의 전반적인 추세(Trend), 연간 계절성(Yearly seasonality), 주간 계절성(Weekly seasonality)을 시각적으로 분해하여 보여줍니다. 이를 통해 주가가 특정 요일이나 월에 어떤 패턴을 보이는지 파악할 수 있습니다.

 

Why it matters: 시각화는 숫자만으로는 파악하기 어려운 데이터의 패턴과 모델의 예측 결과를 명확하게 이해하는 데 필수적입니다. 특히 성분 분해 그래프는 예측 결과의 근거를 해석하는 데 중요한 단서를 제공합니다.

 


결론 및 주의사항

본 문서에서는 파이썬의 yfinance와 Prophet 라이브러리를 사용하여 삼성전자 주가를 가져와 예측하는 전 과정을 살펴보았습니다. 이 방법론은 다른 주식이나 시계열 데이터에도 쉽게 적용할 수 있는 강력한 프레임워크를 제공합니다.

다만, 주가 예측은 시장 심리, 경제 지표, 기업 뉴스 등 예측 모델에 포함되지 않은 수많은 외부 변수에 의해 영향을 받습니다. 따라서 이 모델은 학습용 및 기술 시연용으로 참고해야 하며, 실제 투자 결정의 근거로 사용해서는 안 됩니다.

 

**면책조항**
본 예측 모델은 교육 및 학습 목적으로만 제작되었습니다. 실제 투자에 활용 시 발생하는 손실에 대해 어떠한 책임도 지지 않습니다. 투자 결정은 반드시 전문가와 상담하고 자신의 판단 하에 신중하게 결정하시기 바랍니다.

 

반응형