프로그래밍/Python

[Python] 예측 모델을 통한 주가 예측하기!

슬기나무 2020. 10. 18. 18:33
반응형

이번 글에서는 Python으로 예측모델을 통해 주가를 예측하는 방법을 알아보도록 하겠습니다.

 

역시 직접 모델을 모델링하진 않을거고, 똑똑하신 분들이 만들어 놓은 것 잘 써먹는 방법으로 진행하겠습니다. ㅎㅎ

 

본격적으로 시작하기 전에 이번에 사용하는 모델은 그저 과거 주가 trend, 등락 주기 등을 파악하여

 

예측하는 방법으로써, 기업의 현재 경영전략과 미래 성장 가능성과는 관련이 없을 수 있습니다!

 

재미로 '이런게 있다' 라는 정도로만 참고해주세요. ^^

 

 

 Prophet 모델 간략 소개

 

Prophet 모델은 시계열 데이터를 예측하는데에 유용한 모델로써, Facebook에서 개발한 모델이라고 합니다.

 

이 모델은!

 

1) 시간별, 일별, 주별 기록 데이터나

 

2) 계절성을 띄는 데이터,

 

3) 불규칙한 이벤트 등

 

이 포함된 데이터를 예측하는데에 유용합니다.

 

데이터를 Fourier series를 사용해 모델링하여 계절적 요소 및 그 외 변수를 사용해 모델링하는 방법입니다.

 

 

 예제

 

우선 prophet 모델을 제공하는 라이브러리를 설치해야 합니다!

 

아나콘다 유저라면 아나콘다 프롬프트에서

 

conda install -c conda-forge fbprophet

 

명령어를 통해 라이브러리를 설치해주세요!

 

이 외 pandas, datetime 등 기본적인 라이브러리는 설치가 되어있다고 가정하고 진행하겠습니다~

 

 

먼저 예측 모델에 입력할 데이터가 필요합니다. 데이터를 추출할 날짜의 범위를 설정해주세요!

 

저는 과거 10년의 데이터를 긁어와서 진행해보겠습니다.

 

 

 

 

 

 

추출할 날짜의 시작-끝과 DataReader 함수를 통해 주가 데이터를 불러옵니다.

 

yahoo와 google finance 두 곳에서 가져올 수 있는 듯하나, 무슨 이유에선지 저는 google은 오류가 나더군요.

 

어느 곳이든 상관은 없습니다!

 

 

 

불러온 데이터를 DataFrame형태로 저장합니다. ds에는 날짜를 받아오고, y에는 종가를 받아옵니다.

 

 

 

 

 

 

불러온 데이터를 Prophet 모델에 집어넣어서 예측 모델을 fit 합니다!

 

그리고 예측할 기간(periods)를 설정하고, forecast에 예측값을 저장합니다.

 

여기까지 하면 데이터를 불러와서 예측하는 과정까지 모두 끝이 납니다. 너무 쉽죠?

 

그려보도록 하지요.

 

 

 

 

 

입력하면 아래처럼 두가지 그래프가 나타납니다.

 

2010.10~2020.10 주가 데이터를 통해 향후 1년간의 주가를 예측!

위 그래프에서는 실제 주가(검은색)와 예측 주가(하늘색)이 함께 나타납니다.

 

과거 데이터에 대해서 실제 주가와 100% 일치하지 않는 것은 과거 데이터를 통해 예측 모델을 fit했기 때문입니다!

 

최소자승법에서 데이터를 직선으로 fitting할 때에 완전히 일치하지 않는 경우와 유사하다고 생각하시면 될 것 같아요.

 

2018년 즈음에 주가가 하락하기 시작하여 현재까지 하락하고 있고, 향후도 하락할 것으로 예측이 되었습니다.

 

다시한번 말씀드리지만 이 결과는 기업의 경영전략과 미래 성장가능성과는 무관할 수 있습니다!

 

그저 과거 데이터의 트렌드로 예측하는 방법이기 때문이지요.

 

 

주가 변동 Trend

주가 변동 Trend를 살펴보면 연도별로는 첫번째 그래프에서와 비슷한 경향으로 하락하는 모습을 보이고,

 

주간 데이터를 보았을 땐 장이 닫히는 주말엔 -, 평일엔 +로 나타나네요.

 

연간 데이터에서는 대체로 상반기에 주가가 높고 하반기에 낮은 모습을 볼 수 있었습니다.

 

 

불과 20줄 남짓한 코드로 실제 작동하는 모습을 보니 재밌기도 하면서 실전에서 써먹기 힘들겠다는 생각도 함께 드네요.

 

 

 

※ 실제 코드

import pandas as pd
import pandas_datareader as web
import matplotlib.pyplot as plt

from fbprophet import Prophet
from datetime import datetime

start = datetime(2010,10,19)
end = datetime(2020,10,18)

GS = web.DataReader("078930.KS","yahoo",start,end)

df = pd.DataFrame({'ds':GS.index,'y':GS['Close']})

m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=365)

forecast = m.predict(future)

m.plot(forecast)
m.plot_components(forecast)
plt.show()

 

반응형