본문 바로가기

AI/TensorFlow 학습

19. TensorFlow 2.x - GRU 주가예측 예제

참고: https://youtu.be/Rxqp_sLSKAE?si=jK98vGOwI_UlWWFB

 

앞에서 LSTM으로 삼성전자의 주가예측을 하였다.

https://firstmove.tistory.com/35

 

17. TensorFlow 2.x - LSTM 예제

참고: https://youtu.be/LLLVYkXJw30?si=mssvpdtHH41FN1Xm 이번 글에서는 LSTM 모델을 이용하여 삼성전자 주가 예측하는 예제를 진행한다.데이터는 야후 파이낸스에서 csv 형식으로 다운 받아 사용한다.받아온

firstmove.tistory.com

 

이번 글에서는 지난 글에서 다룬 GRU를 이용하여 주가를 예측해보고, LSTM과 비교해 보자.

 

이를 위해서는 일단 삼성전자의 주가 데이터를 받아야하는데 위의 LSTM에서 이 과정을 다루었으므로,

사용할 파일만 공유한다.

005930.KS.csv
0.49MB

 

 

데이터를 읽고 전처리하는 부분은 LSTM과 동일하므로 코드만 붙여놓는다.

데이터를 받아와서 3일, 5일 이동평균까지 만들어 놓는다.

 

전처리를 하기 전에 데이터에 문제가 무었이 있는지 살펴보기 위해 describe(), isna(), isnull()을 사용하였다.

Volume에서 가장 작은 값, 0이 검출되었고, na는 없으며, 위에서 계산한 3MA, 5MA에서 null이 발견되었다.

앞에서 설명했듯이 Volume이 0인 것은 보통, 장이 열리지 않는 주말이 아닌 공휴일 데이터이기 때문이다. 

따라서 그냥 그 날짜의 데이터들은 삭제하고, null도 삭제하도록 하자.

 

 

이렇게 하면 outlier들은 모두 제거한 것으로 보인다.

다음은 정규화 작업을 위해 sklearn library의 MinMaxScaler를 사용하였다.  한가지, MinMaxScaler는 numpy.narray를 리턴하므로 이를 다시 dataframe으로 전환하는 과정이 필요하다.

그리고, 입력데이터와 결과데이터를 나눠주도록 한다.

 

지난 40일의 데이터를 이용하여 다음 날(41일째) 종가를 예측하는 것이므로,

입력은 기존 40일치의 3MA, 5MA, Adj Close 값들이 될 것이고,

출력은 그 다음날 41일 째의 Adj Close 값이 된다. 이를 학습데이터 형식으로 만들면 아래와 같다.

 

이제 GRU 모델을 만들고, 학습 시켜보자.

100회 학습을 시켰으나, earlystopping 조건에 따라서 23번 만에 학습을 마쳤다.

 

차트로 그려보면, 실제 주가와 엇비슷하게 가는 것처럼 보인다. 하지만.. 실제로 적용하지 말 것을 당부한다.

지난 차트와 잠깐 비교해보자.

 

-- LSTM 모델을 사용한 주가예측 --

 

두 차트가 비슷한 것 같지만, Adj Close 값들이 정규화 되어 있음을 잊지 말자. 

 

여기서 우리가 가져가야 할 것은 GRU, LSTM이 시계열 데이터 예측에 적합하다는 것이다.

 

다음 글에서는 Functional API에 대해서 알아보자.