본문 바로가기

AI/TensorFlow 학습

17. TensorFlow 2.x - LSTM 예제

참고: https://youtu.be/LLLVYkXJw30?si=mssvpdtHH41FN1Xm

 

이번 글에서는 LSTM 모델을 이용하여 삼성전자 주가 예측하는 예제를 진행한다.

데이터는 야후 파이낸스에서 csv 형식으로 다운 받아 사용한다.

받아온 데이터의 무결성을 가지게 하기위해서 빠진 부분 등을 처리하고 정규화하여 데이터를 정리한다.

모델이 잘 인식하기 위해서 데이터의 형태를 조금 바꿔서 학습시키도록 해보자.

 

먼저, 야후 파이낸스에서 데이터를 받아오는 방법이다.

1. 브라우저에서 finance.yahoo.com으로 들어가서 "005930.KS"를 검색하고,

2. 왼쪽 메뉴에서 "Historical Data"를 클릭,

3. 가격 아래에 기간을 설정한 뒤,

4. 오른쪽 "Download"를 클릭하면 csv 파일을 받을 수 있다.

005930.KS.csv
0.49MB

 

 

받아온 데이터를 dataframe에 넣고, 예제에서는 3일 이동평균과, 5일 이동평균을 사용하므로 만들어준다.

 

현재가를 기준으로 과거의 가격을 오늘의 가격과 비교하기 쉽기때문에 수정주가를 사용하고,이를 rolling 함수를 통하면 이동평균가격을 쉽게 구할 수 있다.

 

그러면 2000년부터 오늘까지의 가격을 그래프로 그려보자.

 

여기서, 과거의 데이터로 학습하여 최근 1년간의 가격을 추론하는 모델을 만드는 것이 오늘의 실습이다.

 

앞에서 이야기한 대로, 원본 데이터를 받아서 사용할 때는 그 데이터의 무결성을 조사하고 결함이 있을 때는 처리해야 한다. 이 경우에는 두가지가 있을 수 있는데, 하나는 np.nan 값을 가지는 경우이고, 다른 하나는 0 값을 가지는 경우이다.

주식 가격인 "Adj Close"는 nan 값이 없고, 3MA, 5MA에서만 나타나는데 이것은 이동평균을 만들기 위해서는 어쩔수 없는 내용이다. 즉, 이 데이터에는 처리해야하는 nan 값은 없다고 볼 수 있다.

그 다음으로 0 값이 있는지 살펴보는 것이다. 이것은 describe()로 간단히 알아볼 수 있다.

 

"Volume"에서 0을 가진 경우가 있어서 조금 더 자세히 보기로 했다.

 

총 127개의 행이 이 경우에 해당한다. 보통은 공휴일 같은 날 가격은 전일 종가와 동일하고 Volumn은 0으로 표시된다. 이를 처리하는 코드는 아래와 같다.

 

 

다음 차례는 데이터를 정규화하는 것이다.

sklearn의 MinMaxScaler를 사용하면 간단하게 정규화 할 수 있다. 

한가지 여기서 주의해야 할 것은 fit_transform()의 결과가 numpy.ndarray이기 때문에,

dataframe 형식으로 바꿔주는 절차가 있어야 한다.

 

다음 단계는 학습용, 검증용 입력 데이터(feature)와 출력 데이터(label)를 나누는 일이다.

입력은 'Adj Close', '3MA', '5MA'를 사용할 것이고 출력은 다음 날의 'Adj Close'가 된다.

 

 

위에서 정규화까지 진행한 데이터들을 tensor형태로 만들어주는 과정이다.

 

이제 학습데이터와 검증데이터로 나누고 모델을 만들어 보자.

총 6000개의 dataset이 준비되었으므로 5%인 300개는 검증용으로 사용하고,

128개의 노드를 가지고, 활성화 함수는 tanh인 LSTM 모델을 만들어 학습시키도록 한다.

 

early_stop 조건에 의해서 21번만에 학습을 종료하였다.

이제 검증용 테이터를 가지고 얼마나 잘 추론하는지 확인해 보자. (이것만 잘되면 돈도 잘 벌수 있지 않을까???)

 

이 차트를 보면서 어떤 생각이 드는가? 돈을 좀 벌 수 있을것 같은가?

노파심으로 말하자면, 이렇게 간단한 수학에 귀한 돈을 걸지 않았으면 좋겠다.

 

이번 예제에서는 LSTM을 사용하여 추론하는 것을 실습을 통해서 학습하였다.

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