🐍 파이썬 데이터 분석 프로젝트/📈 KOSPI 시각화 분석

📈 데이콘 KOSPI 주가 분석 04. FbProphet 예측

nyamin9 2023. 1. 15. 11:17

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!

 

 


 

📝 목차

1. KOSPI 지수 예측해보기
    1.1. 필요한 모듈 설치
    1.2. 2019-2022년도 코스피 지수를 통한 예측
    1.3. 2022년도 코스피 지수를 통한 예측
    1.4. 두 예측 결과 비교

2. 결과분석

 

 


🏆 1. KOSPI 지수 예측해보기

 

📈 주가 예측에 주로 사용하는 FbProphet 모듈을 사용해서 코스피지수를 예측할 것입니다.


📈 이 모듈을 설치하고 사용하기가 정말 어려웠습니다. 이 모듈을 사용하실 분들은 코랩에서 실행하시는 게 좋을 것 같습니다!!


📈 FbProphet 모듈 사용을 위해 미리 설치해줘야 할 모듈이 상당히 많습니다. 설치를 먼저 하고, KOSPI 지수를 예측할 것입니다.

 


🏆 1.1. 필요한 모듈 설치

 

# wheel 모듈 설치
pip install wheel

# cython 모듈 설치
pip install cython

# pystan 모듈 설치
# 특정 버전에서만 작동할 수도 있어 여러 버전을 실험해 보았는데, 2.17.1.0 버전에서 잘 작동했다.
pip install pystan==2.17.1.0

# fbprophet 모듈 설치
pip install fbprophet==0.6

# fbprophet 모듈 업데이트
pip install --upgrade fbprophet

# 설치한 모듈 임포트
from fbprophet import Prophet
from fbprophet.plot import plot_plotly, plot_components_plotly

# statsmodels 모듈 설치
!pip install statsmodels==0.11.1

 

📈 위 순서대로 모듈을 설치하면 뭔가 좌르르륵 많이 출력됩니다.

 

📈 블로그 포스팅에서는 가독성을 위해서 이러한 설치 출력을 모두 배제하였다는 점 양해 부탁드립니다!!

 

📈 실제로 fbprophet 모듈을 사용하실 분들도 위의 순서를 따르시는 게 좋을 것 같다고 생각합니다🙂.

 


🏆 1.2. 2019~2022년도 코스피 지수를 사용한 예측

 

# stick_2019 변수에 2019년도 이후의 코스피지수 선언
# 예측하고자 하는 column으로 지수의 종가를, 예측을 위한 날짜 데이터로는 인덱스를 선언
stock_2019 = kospi_2019
stock_2019['y'] = stock_2019['Close']
stock_2019['ds'] = stock_2019.index

# 예측을 위한 모델 생성 : m_2019
m_2019 = Prophet()
m_2019.fit(stock_2019)

# 향후 15일간의 지수를 예측
future_2019 = m_2019.make_future_dataframe(periods=15)
forecast_2019 = m_2019.predict(future_2019)
# matplotlib - 시각화 
# 파란 실선이 실제 지수를, 주황색 실선이 예측 지수를 의미

plt.figure(figsize=(15,7))
plt.plot(kospi_2019.index, kospi_2019["Close"], label="real")
plt.plot(forecast_2019["ds"], forecast_2019["yhat"], label="forecast")
plt.grid(True)
plt.legend()
plt.show()

 

  • 실제 지수와 예측 값 사이에 차이가 있긴 하지만, 전체적인 추세는 모두 따라가고 있다는 것을 확인할 수 있었습니다.

 

# 전체기간 동안의 지수 트렌드와 월별, 주별 변동량
m_2019.plot_components(forecast_2019);

 

▪ 2019~2022 기간 동안의 지수 트렌드와 월별, 주별 변동량을 나타냈습니다.

 

▪ 코스피 지수가 3월 말과 한주의 시작인 월요일에 많이 떨어지는 것을 확인할 수 있었습니다.

 

▪ 향후 KOSPI지수의 행보를 대략적으로 알아보았고, 트렌드와 월별, 주별 동향도 알아보았습니다. 이제 주가를 예측해봅시다.

 

#2019~2022 까지의 데이터를 사용한 결과 코스피지수의 예측
forecast_2019[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].iloc[-15:]
>> Out[44] 


                ds	       yhat	 yhat_lower	 yhat_upper
913	2022-09-14	2363.812642	2276.453019	2455.542920
914	2022-09-15	2359.269320	2272.205219	2453.624150
915	2022-09-16	2355.217647	2260.617968	2446.259285
916	2022-09-17	2352.057246	2262.644187	2441.262350
917	2022-09-18	2347.922472	2252.701098	2441.691746
918	2022-09-19	2339.581314	2251.434051	2430.593805
919	2022-09-20	2341.494508	2258.825601	2433.583536
920	2022-09-21	2334.967461	2243.451821	2430.275066
921	2022-09-22	2327.559200	2232.059805	2416.580543
922	2022-09-23	2320.743648	2232.000082	2411.908552
923	2022-09-24	2314.971382	2228.765209	2418.079241
924	2022-09-25	2308.425217	2224.299974	2403.270875
925	2022-09-26	2297.918064	2204.928287	2386.758705
926	2022-09-27	2297.951072	2211.819755	2394.883481
927	2022-09-28	2289.864683	2198.925061	2383.381680

 

▪ 사용한 데이터는 2022-09-13 까지의 데이터였습니다.

 

▪ fbprophet 예측 모델을 통해서 향후 15일간의 코스피지수를 예상해보았습니다.

 

▪ 2019~2022 까지의 데이터를 사용한 결과 코스피지수의 예측값은 아래와 같습니다.

 

▪ 예측한 종가가 갈수록 낮아지는 추세이며, 상한가와 하한가의 차이가 꽤나 크게 예측되고 있음을 확인할 수 있습니다.

 


🏆 1.3. 2022년도 코스피 지수만을 사용한 예측

 

📈 이어서 2022년도의 데이터만을 사용해 코스피지수를 예측해보았습니다.


📈 동일하게 향후 15일 간의 지수를 예측하였으며, 이 예측 결과를 forecast_2022 객체에 저장하였습니다.

stock_2022 = kospi_2022
stock_2022['y'] = stock_2022['Close']
stock_2022['ds'] = stock_2022.index

m_2022 = Prophet()
m_2022.fit(stock_2022)

future_2022 = m_2022.make_future_dataframe(periods=15)
forecast_2022 = m_2022.predict(future_2022)

plt.figure(figsize=(15,7))
plt.plot(kospi_2022.index, kospi_2022["Close"], label="real")
plt.plot(forecast_2022["ds"], forecast_2022["yhat"], label="forecast")
plt.grid(True)
plt.legend()
plt.show()

 

 

▪ 앞서 살펴본 2019~2022년도의 결과와 비교해보면 실제값과 예측값의 차이가 꽤나 크게 나고 있습니다.

 

▪ 그럼에도 어느 정도 추세는 잘 따라가는 모습을 볼 수 있는데, 이는 상대적으로 데이터의 양이 적기 때문일 것이라 생각합니다.

 

# 트렌드와 요일별 지수 변동
m_2022.plot_components(forecast_2022);

 

▪ 이번에도 트렌드와 요일별 지수 변동을 살펴보았습니다.

 

▪ 2022년도 7월에 지수가 정말 많이 떨어졌고, 월요일만 낮았던 지난 3년과 달리 주중 내내 마이너스 지수를 확인 할 수 있습니다.

 

▪ 지수가 쉽게 회복하지 못하고 있는 현상을 위의 동향을 바탕으로 알아볼 수도 있을 것 같습니다.

 

▪ 이제 2022년도 데이터로 지수를 예측해보도록 합시다!!

 

forecast_2022[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].iloc[-15:]
>> Out[49]

	        ds	       yhat	 yhat_lower	 yhat_upper
171	2022-09-14	2483.494673	2417.317779	2546.866758
172	2022-09-15	2482.589250	2418.292829	2541.825097
173	2022-09-16	2492.464880	2428.540714	2556.977455
174	2022-09-17	2503.760585	2439.685602	2567.591851
175	2022-09-18	2505.333261	2435.380120	2568.248356
176	2022-09-19	2488.467385	2423.058140	2553.402026
177	2022-09-20	2492.644270	2428.006095	2559.014198
178	2022-09-21	2494.503400	2431.314316	2559.545292
179	2022-09-22	2493.597977	2430.479788	2558.036223
180	2022-09-23	2503.473607	2437.839679	2566.018739
181	2022-09-24	2514.769311	2447.731730	2576.440760
182	2022-09-25	2516.341988	2449.493558	2584.204460
183	2022-09-26	2499.476112	2430.244812	2562.016261
184	2022-09-27	2503.652996	2437.587989	2567.562299
185	2022-09-28	2505.512127	2440.712487	2573.243216

 


🏆 1.4. 2019~2022 데이터 예측값과 2022년 데이터 예측값 비교

 

📈 두 데이터로부터 나온 예측값들을 비교해봅시다.

# 예측값으로부터 마지막 20일간의 수치만 가져옴
df_2019 = forecast_2019[['ds', 'yhat']].iloc[-20:]
df_2022 = forecast_2022[['ds', 'yhat']].iloc[-20:]
df_2019 = df_2019.set_index('ds')
df_2022 = df_2022.set_index('ds')
df_2022

# 각 예측을 병합하여 새로운 데이터프레임인 forecast를 생성함
# column yhat_x가 2019~2022 지수를, yhat_y가 2022 지수를 반영한 예측값임

forecast = pd.merge(df_2019, df_2022, how = 'inner', left_index = True, right_index = True)
forecast
>> Out[66]

	             yhat_x	     yhat_y
        ds		
2022-09-05	2369.353959	2466.449932
2022-09-06	2375.783320	2470.626816
2022-09-07	2374.069666	2472.485947
2022-09-08	2371.692720	2471.580523
2022-09-13	2367.426042	2481.635543
2022-09-14	2363.812642	2483.494673
2022-09-15	2359.269320	2482.589250
2022-09-16	2355.217647	2492.464880
2022-09-17	2352.057246	2503.760585
2022-09-18	2347.922472	2505.333261
2022-09-19	2339.581314	2488.467385
2022-09-20	2341.494508	2492.644270
2022-09-21	2334.967461	2494.503400
2022-09-22	2327.559200	2493.597977
2022-09-23	2320.743648	2503.473607
2022-09-24	2314.971382	2514.769311
2022-09-25	2308.425217	2516.341988
2022-09-26	2297.918064	2499.476112
2022-09-27	2297.951072	2503.652996
2022-09-28	2289.864683	2505.512127

 

두 예측값을 시각화를 통해 비교해봅시다🙂.

plt.figure(figsize=(15,7))
plt.plot(forecast.index, forecast["yhat_x"], label="2019-2022")
plt.plot(forecast.index, forecast["yhat_y"], label="2022")
plt.grid(True)
plt.legend()
plt.show()

 

 

  • 비교 결과, 9월 5일부터 9월 28일까지 2022년도의 코스피 지수를 통해 예측한 결과가 3년간의 지수를 통해 예측한 결과보다 모두 상위에 있는 것을 알 수 있습니다.
  • 3년간의 데이터는 2020년과 2021년도의 지수가 압도적으로 높았기 때문에 계속해서 떨어지고 있는 2022년도의 지수에 좀 더 민감하게 반응하고 있는것이 아닐까 생각합니다.

 


🏆 2. 결과 분석

 

▪ 이렇게 plotly를 통해 시각화하고, fbprophet을 통해서 향후 15일 간의 코스피지수도 예측해보았습니다.

 

이동평균선들을 사용해서 시각화해본 결과 아직 장기이동평균선과 단기이동평균선 사이의 차이가 커서 쉽게 코스피지수가 반등하기는 힘들어 보이는 것이 사실입니다. 하지만 이렇게 숫자로만 하는 시각화 예측과 달리 주가는 얽혀있는 상황이 참 많습니다. 데이터로는 표현할 수 없는 국제 정세와 사람들의 소비 심리 하나하나가 주가에 정말 많은 영향을 미치기 때문에, 이런 시각화 모델 하나만 보고 주가가 오르지 않을거야!! 라고 생각하실 필요는 전혀 없습니다. 숫자가 항상 참을 말하는 건 아니니까요.

 

 fbprophet 모듈을 사용해서 진행한 예측은 3년간의 데이터와 2022년의 데이터를 사용했을 때 서로 생각보다 큰 차이를 보여주었습니다. 코스피 지수가 한창 최고점을 찍고 있었을 때의 데이터를 학습한 것과, 계속 떨어지고 있는 데이터를 학습한 것이 차이를 만든 가장 큰 이유가 아닐까 생각합니다. 전체적으로 호황일 때의 데이터를 학습하면 아무래도 모델 자체가 높은 수치에는 적은 가중치를 두고, 낮은 수치에는 높은 가중치를 둘테니 지속적으로 떨어지는 중인 2022년도의 낮은 수치에 민감하게 반응하기 때문일 것입니다. 2022년도의 데이터를 학습한 경우는 정반대라고 생각하면 되실 것 같습니다!!

 

 하지만 말했듯이 수치가 항상 모든 것을 말해주는 것은 아닙니다. 심지어 코스피지수는 우리나라 기업의 대부분의 정보를 담고 있으니, 세세한 움직임에 반응하기는 더 어려울 수 있지 않을까 합니다. 처음 해본 시계열 분석이라 많이 부족했던 것 같습니다. 이러한 경험을 바탕으로, 앞으로 더 많은 분석을 통해 발전해나가고 싶습니다🙂.