본문 바로가기

👩🏼‍🎓💦

비전공자를 위한 LSTM 주가예측, 코인가격예측 / 시계열데이터 분석 / 딥러닝으로 시계열 데이터 예측 모델 만들기 -1

🚀 비트코인 종가 예측하기 ( 날마다 오전 9시 값 )


⚡ 왜 답답하냐면 

나는 전혀 이쪽 전공이 아니다. 난 우리가 일상생활에서 볼 수 있는 수도꼭지에서의 물, 하천과 강에서의 물, 하늘에서 내리는 물 💧을 관리하는 수공학자인데.. 어쩌다보니 AI 관련 연구과제를 맡아서 타전공 수업도 듣고 근 1년간 열심히 공부하였다.

근데 AI를 공부하고 모델을 개발하다보면.. 솔직히 나같은 비전공자들은 인터넷 서칭 자료에 많이 의지를 할 수 밖에 없다. 그래서 나역시 인터넷에 있는 LSTM 주가예측 자료란 자료는 다 뒤지고 코드 설명또한 보았는데 !!

아니 ㅡㅡ 뜯어보니까 다 엉망이다. 특히 코드 공개된 것들 하나하나 분석해보면 의문점이 한 두가지가 아니고, 고쳐주고 싶은 것도 많다.

AI에 대해 잘 아는 것 같고 코드 흐름도 괜찮아보이는 건 비전공자가 따라가기엔 너무 어려웠다. 각자 코딩스타일이 있겠지만 같은 걸 직관적으로 풀어쓸 수도 있는 코드인데, 너무 어렵게 되어있어서 타겟 자체가 비전공자가 아니구나 싶었다.

그래서 그냥 내가 적을라고 한다. 참고로 LSTM 은 시계열 데이터에서 성능이 꽤나 괜찮은 편이니 잘 따라와서 자신만의 주가예측, 날씨예측 등등 모델을 만들었으면 좋겠다 !

 

🚀 load map
.
데이터 정규화 -> 시퀀스 데이터 만들기 -> train, validation, test 셋 분류 -> 모델 생성 -> 훈련, 정확도 출력

위 이미지는 다른 곳에서 퍼왔당 ㅇㅅㅇ 나는 시퀀스 데이터를 먼저 만들고, 분류하고, 훈련하는 직관적 방법으로 모델을 구성해서 위 이미지와는 쪼오금 코드 구성이 다르다 !

근데 이 순서가 조금 변동되는 것은 의미가 없구.. ( 둘 다 정답이라는 뜻 ) 개념자체를 이해하는 것이 포인트다.

'데이터 정규화'까지는 6-7 정도 범위의 데이터가 있을때 이를 0과 1로 만들어줘 컴퓨터 계산을 빠르게 해준다는 개념으로 쉽게 이해할 수 있다. 이 개념은 통계적, 수학적으로도 많이 쓰이기때문에 한 번쯤 들어봤을 것이다. 또 코드에서도 scaler를 이용해 빠르게 처리할 수 있어서 여기까지는 쉽게 넘어간다. 

비전공자의 동공이 흔들리는 것은 '시퀀스 데이터 구성' 부터인데.. 우리는 이제 데이터에 '차원'이 있다는 것을 이해해야되고, x와 y대신 feature 와 label 이라는 말을 쓸 것이기때문에 ! 집중해서 따라와야된다.


🚀 시퀀스 데이터란?

시퀀스 데이터가 무엇일까 ? 아이즈원의 That's the sequance ~ 킬링파트를 아는가? 안유진이 정말 예쁘다.

어쨌든.. 시퀀스가 '시간 단위'를 의미하는 건 대충 감으로 알텐데.. 숫자들로 이루어진 '데이터'는 시간의 흐름을 어떻게 나타낼까?

정답은 시간단위 ( time step, window size, sequance length 등등의 이름을 가진다 ) 로 집합을 만들어 하나의 데이터 군단을 결성한다.

이미지로 조금 더 직관적으로 살펴보자면..

이런식이다

이렇게 여러개의 데이터를 하나의 집합 (노란색 초록색 파란색)을 만들어 데이터 1 , 데이터 2 , 데이터 3 의 항목으로 만들어준다. 이제 저 노란색 데이터는 안에 여러개의 항목이 있고 숫자가 있지만 모델에서 1개의 데이터로 분류된다.

용어와 개념에 대한 설명을 하자면..

이렇게 하나의 데이터 열에 대한 것을 feature (특성) 이라고 하고, 그에 대응되는 y를  label 이라고 한다. 예를들어 주가예측의 경우, feature 1은 그 날의 시가, feature 2는 그 날의 거래량, feature 3은 그 날의 평균가 등등이 되겠다. 이렇게 내가 예측하고자하는 label에 대해 관련이 있다고 생각되는 feature을 여러개, 혹은 하나를 넣어서 구성할 수 있다. label (target)조차도 하나에서 다섯개 등등 다음날 1일치를 예측할 것인지, 5일치를 예측할 것인지에 따라 다르다.

이렇게 시퀀스 데이터를 구성하는 feature와 label에 대한 구성을 하는 것이 모델 성능에 중요하며 < 삼성전자는 코스피에 영향을 받으니까 코스피 항목을 feature로 넣자! > 이를 따로 다루는 feature엔지니어링이라는 분야가 있다. 

이것은 타겟변수가 1개일 때의 상황이다. 하나씩 밀려가면서 데이터를 구성하는 것은 동일하다. 이렇게 시퀀스 길이가 5로 지도학습용 데이터를 구축하게 된다면, 총 데이터 개수가 1000개일때, 시퀀스 데이터를 구성하고 나서는 995개로 준다.

왜 그럴지는 생각해봐라. 이거를 명료하게 설명할 수 있다면 시퀀스 데이터에 대한 이해가 얼추 끝난 것이다.

모델은 이렇게 뭉텅이로 시간단위 데이터를 읽는다. 1,2,3 -> x 이고 3 -> y라면 (1,3) (2,3) (3,3) 이런 세 쌍의 데이터 대응을 한번에 인풋하고, 이게 데이터 1개의 단위를 갖는다는 것이다. (엄밀히 따지면 정확한 개념은 아니지만 이해를 위해 이렇게 설명한다)

또, lstm 은 '3차원'의 데이터를 읽는다.

예를들어, 내가 삼성전자 주가예측을 위해 1000일 동안의 5개의 feature  ( 시가 종가 거래량 평균값 변화량 ) 를 20일 단위로 보는 시퀀스데이터로 넣는다면

모델에 넣어지는 데이터의 형태는 (980, 20, 5) 가 된다. 이게 3차원이다. 우린 (x,y) 이런 2차원 데이터에 익숙하다. 나는 문과와 노인도 이 모델링을 하게 만들고싶은데, 시퀀스 데이터의 형태를 받아들이기엔 낯선 개념일 수 있다고 생각한다. 

어쨌든 시퀀스데이터는 3차원이고 lstm은 이를 읽는다는것을 기억하자.. label값 (target변수) 값은 1개일 경우 ( 내일의 종가를 예측하고 싶을 경우 ) 데이터의 형태는 (1000,1)이 된다. 이래도 괜찮다! 시퀀스 데이터의 구성만 잘 되어있으면 타겟변수는 2차원 형태더라도 모델이 읽는 데에 문제 없다.

 

다음 글에서는 모델을 위한 데이터 나누기와 모델 구성에 대해 알아보겠다.

최종 글에서는 지금까지의 여정을 코드로 설명하는 글을 써보고 시원하게 공개해보겠다.

🤚