이전까지의 내용에선 말 그대로 간단히 데이터를 돌려보았다면 이번부터는 제대로 된 분석, 의미있는 분석을 시작해보겠습니다.
지난 시간까지의 분석 과정 중에서 가장 큰 문제가 되었던 것이 과적합 문제와 더불어 정확도와 오차율이 수렴하는 형태가 아닌 파동을 그리거나 발산하는 형태였다는 것인데요, 그러한 분석 결과를 통해서는 장기 투자가 단기 투자보다 정확도 등이 높겠구나 정도의 인사이트 정도만을 얻을 수 있을뿐입니다.
때문에 이번 시간에는 분석결과의 정확도를 높이는 방법에 대해 알아보고 직접 해보겠습니다.
우선 첫 번째 방법입니다.
어떤 프로젝트나 분석을 시작했을 때, 가장 먼저 시행되어야 할 것은 비슷한 주제의 프로젝트나 논문을 살펴보는 것입니다. 특히 주식과 관련된 프로젝트는 꽤나 많은 관심이 모이는 분야이기에 여러 레퍼런스를 손쉽게 얻을 수 있는데요. 저는 그 중에서 2015년에 중국의 Xiao Ding이라는 분 등이 저술한 'Deep Learning for Event-Driven Stock Prediction' 연구를 참고했습니다.
위의 연구에서는 이벤트에 의한 주가 데이터 분석에 대해 정리해놓았는데요, 이러한 유사 연구 등을 통해 어떤 지표를 반영할 수 있을지 어떤 모델이나 옵티마이저를 쓸 수 있을지 등을 참고할 수 있습니다. 특히 저번처럼 모델의 성능이 온전히 나오지 않는다면 다음의 과정을 반복하며 최적화 과정을 거쳐야 합니다.
1. 데이터 정제
2. activation 변경(ex. relu -> sigmoid)
3. 옵티마이저 세부 변수 조정(ex. momentum, decay...)
4. 옵티마이저 변경(ex. Adam -> SGD)
5. 모델 변경 or 복잡도 조정(ex. LSTM -> GRU or Dense를 줄이거나 Dropout 옵션 추가)
6. 추가 데이터 수집
대략적으로 위와 같이 보다 작은 단위에서 하나씩 개선해나가며 점차 큰 단위로 개선해나갑니다. 위의 과정을 하나 혹은 그 이상을 반복적으로 수행하며 최적화 과정을 거치는데요, 물론 애시당초 프로젝트 주제 자체가 답을 낼 수 없거나 모순인 경우도 있으니 사전에 '문제정의가 올바르게 되었는지?'와 같은 고민이 필요하기도 합니다.
처음 시간에 해보았던 것처럼 종가 데이터를 추측하는 경우에는 그 안의 규칙성을 발견해 수식화를 함으로써 구체적인 값을 추정해야 하기 때문에 sigmoid보다는 relu activation이, SGD보다는 Adam optimizer가, GRU보다는 LSTM가 더 좋은 경우에 해당합니다. 물론 이러한 사항도 데이터의 양, 질, 종류, 프로젝트 목적 등에 의해 가변적으로 변할 수 있으니 최대한 다양한 방법을 숙지하고 시도해보는 것이 중요합니다.
STEP 00. 문제 정의하기
하지만 그렇게 주가를 예측할 경우 예측율은 실질적으로 50% 대에 머물뿐 아니라 그조차도 파동을 그리는 형태의 cost가 발생하기 때문에 신뢰할 수는 없는 상황이죠. 때문에 이러한 프로젝트는 문제부터 '재정의'하는 과정을 거쳐야 합니다.
OLD ] "어떻게 하면 주식의 종가를 알 수 있을까?"
NEW ] "어떻게 하면 주식 투자를 통해 이익을 얻을 수 있을까?"
엄밀히 말해 우리가 이러한 분석을 하는 이유는 주식을 통해 이익을 얻기 위한 인사이트를 획득하고자 함이지, 구체적으로 그 가격이 어느정도일지는 관심이 없습니다. 그렇기에 문제를 재정의하고, 구체적으로 그 수치를 맞추는 것이 아닌 10일 동안의 평균 종가를 기준으로 지정한 수준(상위 25%)의 수익율을 달성할 수 있는지 여부만을 학습시키고 예측해보았습니다.
하지만 위에서 볼 수 있듯이 그러한 결과조차 그리 좋지는 않았습니다. 오차율과 정확도는 수렴하지 않았고, 모델의 신뢰성은 떨어졌습니다. 기껏해야 장기투자에 대한 긍정적 가능성 정도만을 확인할 수 있었던 것까지가 지난 시간까지의 과정입니다.
이런 오류가 발생할 수 있는 경우의 수는 크게 세 가지입니다.
1. 데이터의 양 or 질이 부족하다.
2. 분석 모델이 잘못되었다.
3. 분석 자체가 잘못되었다.
사실 위의 경우의 수 중에서 가장 정답에 가까운 것은 사실 3번 항목입니다. 본래 주가라는 것이 그 회사의 재무적 상태와 같은 요인들에 의해 항시 반영되지 않기 때문입니다. 예컨데 사소하게 투자를 하는 모든 투자자가 이 모든 재무적 수치를 참고하고 똑같은 교육 수준 하에서 똑같은 판단을 내리지 않는 한은 말입니다.
하지만 그렇다고 해서 보완할 방법이 없는 것은 아닙니다. 애초에 이번 프로젝트의 과정은 고작 머신러닝과 딥러닝 몇 번으로 주식 시장을 관통하는 답을 찾겠다는 것이 아닌 주식 투자자에게 투자에 도움이 될 수 있는 인사이트를 제공하는 것이니까요. 만약 투자자가 이 시점에 투자를 고민하고 있는데 그에 대한 인사이트와 근거가 되어주는 것이 본래의 목적입니다.
따라서 세 번째 경우의 수는 우선 제쳐두고(모델의 결과가 완벽하게 수렴하는 형태로 로스값이 줄어들고 정확도가 향상되는 이상적인 형태를 고집하지 않고), 첫 번째와 두 번째를 개선해보겠습니다.
우선 처음에 언급한 연구에 제시된 이벤트 데이터를 수치화하여 적용하였고, 재무 정보 또한 스타벅스 내부의 데이터에 한정짓지 않고 국제 금시세 데이터를 가져옴으로써 객관적인 재무 데이터를 추가하였습니다. 참고로 트랜드 데이터는 구글 트랜드를 통해 월별로 받은 데이터를 늘려서 적용했습니다. 아무래도 일별로 수집했을 때보다 정확도의 차이가 존재합니다.
STEP 01. 데이터 불러오기
이렇게 추가한 다양한 종류의 데이터를 기반으로 조정종가를 5일 이동평균값을 산출해 그것을 기준으로 했던 것을 10일 이동평균으로 수정해주었습니다. 휴일이 없는 평상시의 주식시장이 한 주에 5일씩 열리니, 실질적으로 이번에 산 주식을 미래 특정 시점의 전후 1주 안에만 팔면 목표한 수준의 이익을 얻을 수 있도록 하기 위함입니다.
본격적인 데이터 분석에 들어가보기 전에 늘 먼저 해야할 것은 데이터를 살펴보는 것입니다. 분석의 대상이 될 수정종가 데이터를 살펴보겠습니다.
(여기서 수정종가는 기존의 종가에 배당이나 분할, 증자와 같은 재무적 요소가 반영된 수치로 주로 재무분석 과정에서 자주 사용되는 수치입니다.)
STEP 02. 데이터 탐색하기
파란선이 종가, 노란선이 수정종가를 의미합니다. 3000일이 넘는 기간에 걸쳐 우상향의 곡선을 그리고 있다는 것을 확인할 수 있습니다. 다만 이러한 곡선을 온전히 학습시키고 제대로 된 규칙을 발견하기 위해선 우상향의 곡선의 변동폭, 특히 과거에 비해 과대하게 보여지는 수치를 조정할 필요가 있습니다.
이럴 때 사용하는 것이 바로 '로짓(Logit)'입니다. 심플하게 해당 값에 로그를 씌우는 것이라고 생각하시면 됩니다. 한 번 해보겠습니다.
이전의 그래프와 비교했을 때 비교적 완만해진 우상향의 선형으로 바뀌었습니다. 이러한 이유로 실제 여러 주식 데이터를 다루는 도메인에서도 로그값을 취해 데이터를 보여주는 기능을 지원하고 있습니다.
STEP 03. 목표 데이터 설정
이전까지의 분석은 매우 한정적인 목표치를 가지고 있었습니다. 예를 들어 이번 주에 산 주식이 다음 주, 혹은 몇 달 뒤에 팔았을 경우 수익율을 낼 수 있는지 여부를 얼마나 정확히 맞추는 문제였죠.
만약 우리가 구매한 것이 주식이 아니라 선물, 옵션 같은 것이었다면 위의 방법으로 하는 것이 맞는 방법일 수 있으나 엄밀히 말해 주식은 언제 팔지 소유자가 정하는 자산입니다. 즉, 굳이 다음 주에 오르지 않더라도 몇 달 뒤에 오른다면 그때까지 가지고 있다가 팔아도 된다는 것입니다.
그렇기 때문에 다음과 같이 다음주, 한 달, 두 달, 세 달, 여섯 달, 일 년 뒤에 팔았을 경우 중 현실적으로 가능한 수준의 수익율(여섯 개 경우의 수 중 상위 3개의 평균)을 목표값인 Y로 잡겠습니다.
현실적으로 가능한 수익율을 내기 위해 우선 하루 뒤, 한 달 뒤, 두 달 뒤, 세 달 뒤, 여섯 달 뒤, 일 년 뒤로 총 여섯 개의 표본 기간을 선정했습니다. 이렇게 지정한 표본 기간 뒤의 5일 평균 수정종가를 구해 정확히 어느 날에 사고 파는 것이 아니라 그 주에만 사고 팔면 되는 식으로 타겟을 구간화하였고, 이를 기준으로 현재의 수정종가와 비교해 수익율을 산정했습니다.
또한 이렇게 산정한 수익율의 경우 이미 로그화한 수정종가가 기반이기 때문에 자연스레 이상치에 해당하는 수치는 스케일링되는 효과가 있습니다.
STEP 04. 데이터 분석
2008년부터 2020년 현재까지의 데이터입니다.
이렇게 만든 데이터셋에서 이동평균 등의 과정으로 인해 생겨난 NaN 값을 제거해주겠습니다.
여기까지 하면 데이터셋에 대한 정제는 얼추 끝이 났습니다.
그 다음은 이러한 데이터를 스케일링하고, 모델을 만들어 적용시키는 것입니다. 우선 분석할 대상의 핵심이 되는 수익율의 분포를 먼저 살펴볼까요?
위의 바차트에서 보면 0에 해당하는 부분이 수익율이 낮아 수수료 등 제비용을 제하고나면 손실이 나거나 애초에 손실율이 나는 비율입니다. 총 2989건의 데이터 중에서 600건 정도가 이에 속합니다. 우상향의 우량 기업에 주식을 투자하면 단기적으로 손실을 볼 수 있어도 결국 대부분(약 80%)은 이익을 본다는 것을 시사하며, 성장성과 안정성을 모두 갖춘 우량 기업에 투자하는 이유를 보여주는 비율입니다.
그 다음 0.5는 제반 비용을 제하고 3% 내외의 수익율을 얻을 수 있는 구간이고, 1은 5% 이상 10% 이하, 2는 10%~20% 정도, 3은 그 이상의 고수익율을 만들어낸 구간입니다. 일년 이내의 투자 경우의 수만 반영되어 있고, 종가를 조정한 뒤 로그값을 취했음에도 상당히 높은 수익율을 올린 기업인 셈입니다.
실제로 조금이라도 수익을 내는 구간을 정답 구간으로 지정했더니 학습 데이터(2008년~2015년) 중에서는 거의 90%에 해당하는 부분이, 테스트 데이터(2016년~2019년) 중에서는 80%에 해당하는 부분이 원하는 구간에 해당했습니다.
모델 학습 결과입니다. 본격적인 과적합이 발생하기 전에 중지시킨 결과입니다. 목표치 자체를 구간화해서 목표를 잡았기 때문에 이전처럼 세밀하게 할 때보다 높은 정확도와 낮은 오차율을 보이는 것을 확인할 수 있습니다.
그 아래의 텍스트는 2016년부터 2019년까지 약 1,000일의 주식 개장일 중에서 안정적인 수익을 얻을 수 있다고 추천한 날 정도로 보시면 될 것 같습니다.
실제 데이터의 경우 0과 1로만 제시되는 것이 아니라 그 사이의 값이 반영되는 것이기에 어떤 식으로 값이 나왔으냐에 따라, 어떻게 해석하느냐에 따라 충분한 인사이트를 얻을 수 있을 것으로 예상됩니다.
한 번 확인해보겠습니다.
STEP 05. 데이터 시각화 & 해석
그 결과입니다.
위의 것이 모델이 학습해 예측한 결과인데, 1에 가까울 수록 상승 요인이 많은 것이고, 0에 가까울수록 하락 요인이 많은 것입니다. 또한 그 내부에서 오르고 내리는 경향 자체도 해당 주식이 가진 매력 요인을 얻거나 잃어가고 있다고 해석할 수 있습니다.
밑의 것이 실제 주식의 4년치 수익율 데이터입니다. 마지막의 0에 해당하는 부분이 전혀 수익을 얻을 수 없거나, 손실이 발생한 구간이고 위에서 설명한 것처럼 올라갈 수록 더 높은 수익율을 올린 구간입니다.
이러한 결과를 시각적으로 표시해보겠습니다.
위의 예측치에서 보면 적어도 70점 이상(0.7) 이상을 받아야 주식을 구매하고, 90점 이하인 경우에는 그 전에 70점 이상 구간에 머물렀고 올라가는 요인이 발생하면 투자(노란색 영역), 그리고 90점 이상인 경우에는 아주 높은 확률로 수익율을 올릴 수 있는 구간으로 반드시 투자(녹색 영역)하라는 의미입니다. 그리고 투자를 통해 수익을 얻을 확률이 낮은 50점 이하의 구간에서는 투자를 회피하라는 의미입니다.
아래의 실제값에는 실제로 손실이 발생한 구간을 표시해놓았는데요, 이를 실제 주가 데이터와 함께 한 번 같이 봐보겠습니다.
2800~3000에 해당하는 영역이 2019년의 데이터입니다. 실제로 주가가 고공행진을 하긴 했지만, 이때 고점을 찍고 2020년에 들어서도 이 정도 수준의 주가 혹은 그 이상으로 올라가지 않아 위와 같은 모습을 하고 있습니다.
이번에는 예측치와 실제 주가를 비교해보겠습니다.
위의 그림을 통해 확인할 것은 크게 두 가지입니다.
1. 수익성이 발생할 것이라고 예측한 구간 이후에 실제 주가가 상승했는가?
2. 손실이 발생할 것이라고 예측한 구간 이후에 실제 주가가 하락했는가?
1번을 확인하기 위해서는 현재 주식을 구매하라고 한 구간 이후에 주가가 상승하는 구간이 존재해야 합니다. 또한 2번을 확인하기 위해서는 현재 주식을 투자해선 안된다고 한 구간 이후에 실제로 주가가 하락하는 구간이 존재해야 합니다. 이 과정에서 큰 이득을 보는 것을 방해할 지라도, 큰 손실은 나지 않도록 즉 자동으로 손절이 아닌 익절을 하게 만드는 것이 해당 예측의 핵심입니다.
마지막으로 올해의 투자 예측에 대해서 살펴보고 끝마치겠습니다.
왼쪽이 투자 예측, 오른쪽이 실제 주가입니다.
위 데이터는 11월 2일까지의 데이터가 반영되어 있는 결과이고, 해당 모델로는 아직 하루하루의 데이터를 받아 그 주의 투자경향을 살펴보는 정도입니다.
하지만 만약 예측에서는 높은 확률로 수익이 예상된다고 했는데 아직 그런 구간이 나타나지 않았다면 미래를 기대해보고 투자를 해보는 것도 하나의 방법일 것 같습니다.
다음 시간부터는 이러한 학습 알고리즘을 스타벅스 이외의 여러 기업에 적용시켜보는 시간을 가져봄으로써 해당 모델의 성능을 다각도로 검증해보고, 이러한 모델의 결과물을 다시금 학습시켜 투자 여부를 추천할 수 있는 서비스의 기반을 닦아보도록 하겠습니다.