지난 6월 20일까지 약 한 달 동안, 삼성 멀티캠퍼스 K-Digital 데이터 사이언스/엔지니어링 과정 중 시행되는
2차 프로젝트를 진행하였다.
프로젝트의 주제는 '주가 예측 서비스 구축'으로, 해당 프로젝트에서 내가 담당한 것은
주가 예측 LSTM 모델, CNN 모델, 및 웹 서비스 페이지 구축이었다.
데이터 수집은 따로 하지는 않았으며, FinanceDataReader 라이브러리를 통해
주식, 코스피지수 등의 데이터를 받아왔다.
주식 예측에 있어, 다른 요소는 배제하고 순수하게 그래프의 움직임을 통한 기술적 분석만을 활용하고자 했다.
1. LSTM을 활용한 주가 예측
1-1. 데이터 추출
FinanceDataReader 라이브러리를 통해 주가(종가) 데이터를 받아왔으며,
연속되는 50일 치의 데이터를 통해 51번째 날의 주가를 예측할 수 있도록 feature 데이터와 target 데이터를 나누었다.
데이터의 양을 늘리기 위해, 코스피 상장된 기업 중 몇 기업을 임의로 선정하여 약 10년 간의 주가 변동 데이터를 가져왔다.
그리고 첫 날을 기준으로 주가의 흐름을 학습시킬 수 있도록, 첫 날의 주가를 0을 기준으로 하여 이후의 주가 또한 변동률로 나타나도록 수정하였다.
1-2. 딥러닝 모델링
시계열 데이터를 다뤄야 한다. 주가를 예측함에 있어 이전의 주가를 통해 다음의 주가를 이해할 수 있도록 학습시켜야 했다.
이에 사용한 것이 장단기기억, 즉 LSTM 모델이었다.
1-3. 결과
예측 성능은 썩 나쁘지 않았지만, LSTM을 통한 모든 주가 예측이 갖고 있는 근본적인 문제점을 벗어날 수는 없었다.
검증 손실을 줄이고 정확도를 높이기 위하여 오늘의 결과를 예측함에 있어 어제의 결과를 가져오는 래깅현상이 일어났기 때문이다.
1-4. 보완 및 한계점
위 문제를 해결하기 위해, 기존의 회귀 예측 모델을 분류 모델로 바꾸어 시도해보았다.
기존의 target 값을 0 혹은 1로 바꾸어, 50일 이후의 추가가 첫 날보다 떨어졌으면 0, 올랐으면 1로 설정하였다.
더불어 주가에 영향을 끼치는 요소로는, 비단 주가의 흐름뿐만 아니라 코스피지수, ETF, 환율 등의 요소가 있음을 생각했다.
이에 상관관계 분석을 해보았다.
국내 우량주 몇 종목을 기준으로 분석해보면, 대체적으로 코스피지수, 국내 ETF와는 상관관계가 강하게 나타나는 모습을 보였다.
반면 원달러 환율과는 약한 상관관계를 보이고, 미 국채 금리와는 매우 약한 상관 관계를 보였다.
하지만 미 국채 금리의 경우, 주식시장과는 낮은 상관관계를 보이지만 시장의 변동성이 커질 시에 그 거래량이 늘어난 다는 것에 착안하여 다른 세 요소와 함께 학습시키도록 하였다.
다만, LSTM 모델의 특성 상 한 행 내에 5*50 형태로 존재하는 2차원 데이터를 학습시킬 수는 없었고, 한 행에 50개씩 존재하는 주가, 코스피지수 등등의 데이터들을 따로따로 학습시켜야 했다.
이렇게 생성된 5개의 딥러닝 모델을 통해, 원시적인 보팅 기법을 통해 다음 날 주가가 오를 지, 아니면 내릴 지 예측하도록 하였다.
안타깝게도 순수하게 0과 1의 갯수를 보는 하드보팅 기법이나, 퍼센트로 예측하는 소프트 보팅 기법을 사용하나 큰 의미는 없었다.
결국 래깅 현상을 근본적으로 해결한 것은 아니었으므로, 주가 자체가 가장 큰 결정력을 가지는 요소가 되었다.
주가, 코스피지수, etf, 환율, 미 국채 10년 금리 다섯개의 요소를 이용했음에도 결과는 항상 주가를 학습시킨 모델에 의해서 결정되었다.
2. CNN을 활용한 주가 예측
이러한 문제를 해결하고, 나아가 주가, 코스피지수, etf, 환율, 미 국채 10년 금리 다섯 요소를 한 번에 학습시키고 싶었다.
이에 사용한 방법이 CNN, 합성곱 신경망이었다.
2-1. 딥러닝 모델링
한 행에 5*50 형태로 존재하는 2차원 데이터를 넣은 뒤, 4차원 형태의 데이터로 변환하였다.
CNN 모델은 주로 이미지를 학습시키기 위해 사용하는데, 하이퍼 파라미터로 설정된 커널 사이즈에 따라 이미지를 학습시킨다.
이 주가, 코스피지수, etf, 환율, 미 국채 10년 금리 데이터 또한 5*50 형태로 존재하는 이미지라 생각한다면,
커널 사이즈 5*1 에 맞추어 학습시킨다면 50일 간의 주가, 코스피지수, etf, 환율, 미 국채 10년 금리를 통해 다음 날 주가를 예측할 수 있지 않을까 하는 생각에 CNN 모델을 활용하였다.
2-2. 결과 및 한계점
특정 기간 동안의 주가 실제 데이터와 모델을 통해 확인한 테스트 데이터를 비교해보았다.
래깅 현상이 확연히 줄어든 것을 확인할 수 있었다. 더불어 어느 정도 주가의 흐름을 예측하고 있는 것을 확인할 수 있다.
하지만, 엄밀히 생각해본다면 주가가 높으면 높을 수록 그 오차는 더욱 커질 수밖에 없음을 알 수 있다.
어느 종목의 첫 날 주가가 1000원이라 해보자. 전처리를 통해 첫 날을 0으로 설정하고, 이후의 주가 또한 변동률로 바꾸어 보았다.
만약 50일 후의 변동률이 0.15고, 모델에 의한 테스트 데이터 값이 0.12이라 한다면 예측이 잘 된 것 처럼 보인다.
하지만 실제 주가를 반영하여 비교해보면 300원의 차이가 있는 것이며,
첫 날 주가가 1,000,000원이었다 하면 300,000원의 차이가 생기는 것이다.
결국, 여전히 추세나 흐름은 예측할 수 있을지언정 정확한 주가를 예측하는 것은 어려운 일로 남았다.
물론 추세 예측 만으로도 의의가 있을 수 있지만, 추세 예측으로 의의를 갖기 위해서는
5일, 10일, 한 달 뒤의 추세까지 예측할 수 있어야 한다.
5일, 10일, 한 달 뒤의 추세를 예측하기 위해서는 어떻게 해야할까?
우선 5일 뒤의 추세 예측을 위해선, 5개의 딥러닝 모델을 만들어 50일 후의 주가, 코스피지수, etf, 환율, 미 국채 10년 금리를 예측하는 모델을 만들고, 그 모델을 통해 다시 기준일+1일로부터 50일 간의 주가, 코스피지수, etf, 환율, 미 국채 10년 금리를 예측하고, 이런 식으로 5일 뒤의 주가를 예측하도록 해야 한다. 10일, 한 달 뒤의 데이터 또한 이러한 과정을 통해 예측해야 한다.
하지만, 이렇게 예측하여 얻은 결과에서 얼마나 높은 정확성을 기대할 수 있을까? 확신할 수 없다.
기존의 주가 데이터는 종가만을 불러왔는데, 만약 고점, 저점, 거래량, 그리고 국내 금리 데이터까지 불러오고자 한다면
만들어야 하는 예측 모델은 8개로 늘어나게 될 것이다.
주가 예측을 위해 다른 모든 데이터들까지 예측해야하는 상황이 된다. 배보다 배꼽이 더 커지는 상황이다.
다른 예측 모델은 제외하고 순수하게 주가만을 예측하고 싶다면, 모델 구성 자체를 바꾸어야 한다.
3. 후기
사이드 프로젝트의 느낌으로, 이전 프로젝트와는 다르게 크게 몰입하지 않고 진행하고자 했다.
하지만 하다보니 더 좋은 모델을 만들어보고자 욕심을 내게 되었는데,
그 과정에서 RNN, LSTM, CNN 모델에 대하여 학습할 수 있는 계기가 되었다.
다만 주가라는 것이, 워낙 많은 외부 요소들로부터 영향을 받는 데다가
측정하기 어려운 인간의 심리를 반영하고 있기에 정확한 측정값을 내지 못한 것은 아쉬웠다.
해당 프로젝트 과정에서 재미난 시도를 하나 해보았는데,
기사 목록 스크래핑 및 뉴스에 대한 감성 분석 모델 작성을 제외하면,
이 웹 페이지를 혼자 코딩하여 만든 것이다.
직접 쌓아놓은 데이터베이스를 이용하는 것이 아니라
매번 검색할때마다 FinanceDataReader를 통해 데이터를 불러왔고,
그 데이터를 통해 다시 네이버 뉴스를 크롤링해오고, 검색어를 가지고 주가 데이터를 수집하고
다시 딥러닝 모델도 돌리고 Plotly로 그래프를 작성하는 모든 과정이 일어났다.
그러다보니 상당히 홈페이지가 무거워졌다.
다만, 비로소 장고를 통한 MVC 구조 파악이라거나, html 코드 작성 및
CSS, javascript 활용법은 어느 정도 파악했다는 점에서 의미가 있었다.
javascript는 직접 코딩을 할 줄은 모르지만, 일단 무엇을 어떻게 복붙해와서 사용하는지는 알게 되었다.
빅데이터 분석 프로젝트를 하는 와중에, 뜬금없이 웹 개발을 시도하다보니
내가 데이터를 다루는 것인지, 웹 개발을 배우는 것인지 혼란스럽기는 했지만,
'순수한 재미'가 있었기에 그럼에도 할 만 했다.
나름 조의 테마에 맞춰 시크릿 쥬쥬 배경 색을 활용해 보았는데,
아, 만약 내가 프론트 개발을 하고자 한다면 일단 디자인부터 배워야겠다는 생각이 강하게 들었다..
'일상 > 삼성 멀티캠퍼스 생활' 카테고리의 다른 글
멀티캠퍼스 데이터 사이언스/엔지니어링 다섯 달, 그 끝 (2) | 2022.08.01 |
---|---|
멀티캠퍼스 데이터 사이언스/엔지니어링 최종 프로젝트 (0) | 2022.07.31 |
멀티캠퍼스 데이터 사이언스/엔지니어링 50% 수료 (2) | 2022.05.25 |
멀티캠퍼스 데이터 사이언스/엔지니어링 첫 프로젝트 (2) | 2022.05.10 |
멀티캠퍼스 데이터 사이언스/엔지니어링, 한 달을 보내며 (0) | 2022.04.03 |