최근 기계 학습이 인기를 끌면서 주식이나 비트 코인 시세를 예측하는 시계열 회귀 모델을 만드는 경우를 종종 봅니다. 며칠 전에도 페이스북에서 딥 러닝 기법 중 하나인 Long Short-Term Memory (LSTM) 을 이용하여 비트 코인 시세를 비교적 성공적으로 예측했다는 글을 하나 봤습니다 (https://www.facebook.com/scalawox/posts/476545546074704).
해당 글에서는 실제 비트코인 시세와 예측값의 시계열 그래프를 보여주며 비교적 비슷하게 추세를 예측했다고 주장했지만 제가 보기에 이것은 전혀 예측이 된 상태가 아닙니다 (그림 1 참조).
이해를 돕기 위해, 위 모델과 동일한 시세 데이터를 이용해서 제가 만든 시세 추정 그래프를 보시기 바랍니다 (그림 2).
어떤가요? 위 그림보다 시세를 더 정확하게 예측하고 있는 것 같지 않나요? 그런데 저는 위 예측 데이터를 만들 때 LSTM같은 복잡한 방법을 사용하지 않았으며 심지어 학습 데이터를 전혀 사용하지 않고 제 노트북으로 10분만에 만든 모델을 이용했습니다. 이게 가능한 이유는 제가 사용한 모델이 y(t) = y(t-1) 이기 때문입니다. 쉽게 말해 오늘의 시세는 어제의 시세와 같다 라고 가정한 모델입니다. 물론 이것은 예측 모델이라고 부를 수 없습니다. 그런데 그림1을 자세히 보시면 앞서 소개한 링크에 있는 모델 역시 동일한 오류를 범했습니다 (주식이나 비트코인 시세를 예측했다며 인터넷에 떠도는 다른 많은 자료들 역시 거의 이와 같은 문제를 갖고 있습니다).
LSTM을 비롯한 시퀀스 모델을 잘못 사용하면 이와 같은 오류를 범할 수 있습니다. 대개의 경우 현재 데이터와 가장 차이가 적은 값은 바로 직전 데이터이기 때문에 과거 시퀀스를 이용해 단순히 현재 데이터와의 차이(loss)를 최소화하도록 학습을 시키면 직전 데이터를 그대로 답습하는 모델이 만들어 집니다.
이런 오류를 범하는 근본적인 이유는 시계열 모델을 학습하거나 평가할 때 RMSE처럼 단순히 실제값과 에측값의 차이를 측정하여 그 값을 줄이는데에만 집착하기 때문입니다. 그러나 RMSE는 회귀 모델 평가 방법 중 하나에 불과합니다. 단순히 오차를 줄이는 것이 목적이라면 괜찮은 방법이지만, 예측 모델의 사용 목적이 따로 있다면 RMSE만으로 섣불리 모델의 성능이나 유용성을 평가하면 안됩니다. 게다가 이렇게 모델의 예측 정확도만을 고려하여 측정된 수치만 보고 의사 결정에 활용하면 자칫 예상과 반대되는 결과를 초래할 수 있습니다. 예를 들어, 위 모델을 이용하여 비트코인을 사고 파는 것은 마치 오늘 시세는 어제 시세와 같을 것이라 가정하고 투기하는 것과 같습니다.
이 글에서는 이런 오류를 피하기 위해 '기대 이익'을 고려한 예측 모델 평가 방법에 대해 제안하고자 합니다.
이해를 돕기 위해 조금 더 단순한 이탈 예측 모델을 예로 들어 보겠습니다. 이탈 예측은 주로 '고객 관계 관리 (Customer Relationship Management, CRM)' 의 일환으로, 어떤 고객의 활동 정보를 이용해서 조만간 서비스에서 이탈할 것 같은 고객을 사전에 예측하는 기법을 말합니다. 어떤 대상에 대해 이탈이냐 아니냐를 분류하는 전형적인 분류 문제이기 때문에 예측 모델을 평가할 때도 일반적으로 많이 사용하는 분류 모델 평가 기법을 이용합니다. 많이 사용하는 평가 방법으로는 accuracy, precision/recall, TPR/FPR, AUC 등이 있습니다.
그러나 이탈 예측의 본래 목적을 생각해 보면 이런 평가 방법을 그대로 적용하는 것은 적절하지 않습니다. 우리가 고객의 이탈을 예측하려는 목적은 이탈할 것으로 예측된 고객의 이탈을 사전에 방지함으로써 이익을 보전하는데에 있습니다. 따라서 단순히 이탈을 얼마나 잘 예측했느냐로 평가하기 보다는 이탈 예측 모델을 적용했을 때 얻을 수 있는 기대 이익을 직접적으로 측정하는 것이 더 좋습니다. 이를 위해 아래와 같은 시나리오를 생각할 수 있습니다.
위 도식에서 'Would-be churner'와 'Non-churner'는 실제 고객이 이탈하는 경우와 아닌 경우를 의미합니다. 그리고 그 각각에 대해서 이탈 에측 모델은 '이탈'인지 아닌지 예측하게 됩니다. 이 때 전체 고객 중에서 TP는 실제 이탈하는 고객을 정확히 예측한 경우, FN은 실제 이탈하지만 예측에 실패한 경우, FP는 이탈하지 않는 고객을 이탈할 것이라고 잘못 예측한 경우, TN은 이탈하지 않는 고객을 정확히 예측한 경우의 비율을 의미합니다. 또한 CLV는 '고객 생애 가치 (Customer Lifetime Value)'를 의미하며, C는 이탈하려는 고객의 마음을 돌리기 위해 투입하는 마케팅 비용을 의미합니다 (이를테면, 무료 쿠폰 발급에 필요한 비용을 생각하시면 됩니다). 마지막으로 gamma (위 도식에서 r와 비슷하게 생긴 문자) 는 이런 마케팅을 통해 이탈하려는 고객이 마음을 바꿔 계속 서비스를 이용하는 비율을 의미합니다.
이제 이 각각의 경우에 대해 얻을 수 있는 기대 이익(혹은 비용)을 계산할 수 있습니다. 우선 실제 이탈하지 않는 고객의 경우 CLV 만큼의 기대 이익을 얻을 수 있습니다. 그런데 FP 의 경우 이탈 방지를 위한 비용이 불필요하게 투입되기 때문에 C만큼의 비용이 빠져서 기대 이익은 (CLV - C) 가 됩니다.
한편, 정확히 이탈을 예측한 경우에는 마케팅을 통해 gamma 만큼의 고객의 마음을 되돌릴 수 있기 때문에 gamma * (CLV-C) 를 기대 이익으로 얻게 되며, 나머지 비율인 1-gamma 만큼의 고객은 마케팅 비용만 소모하게 되어 전체 기대 이익에서 (1-gamma)*C 만큼이 빠지게 됩니다. 결국 위 시나리오를 모두 고려했을 때 고객 한명 당 얻을 수 있는 기대 이익은 다음과 같습니다.
실제 이탈 예측 모델을 마케팅에 활용하려면 단순히 예측 모델의 예측 정확도만 측정할 것이 아니라 위 수식을 이용해 얼마나 이익을 얻을 수 있는지 측정해야 합니다. 이를 위해선 CLV, C, gamma 를 모두 고려하여 계산해야 하는데 이것은 이탈 방지 정책을 어떻게 정할 것이냐에 따라 달라집니다. 다시 말해 어떤 예측 모델의 유효성을 제대로 평가하려면 모델 자체의 예측 성능(TP, FP, TN) 뿐만 아니라 이 모델을 적용하는 수행 정책의 비용(C) 및 효과(gamma)까지 고려해야 합니다.
아마도 비트 코인 시세를 예측하는 목적은 예측값을 이용해 적절한 시점에 비트코인을 사고 팔아 이익을 얻으려는 목적일 것입니다. 따라서 예측 모델의 유효성을 평가하려면, 예측 모델을 이용해 실제 매도/매입을 했을 때 얻게될 기대 이익을 추정해야 합니다. 이를 위해 이탈 예측 모델에서와 유사하게 각각의 상황에서 얻거나 잃게 되는 상황을 추정하면 아래와 같습니다.
실제 오르고 예측도 오른다고 정확히 예측했을 경우: 추가 매입을 통해 오른 만큼의 이익 획득
실제 오르는데 예측에서는 떨어진다고 잘못 예측했을 경우: 오른 만큼의 기회 비용 손실
실제 떨어지는데 예측에서 오른다고 잘못 예측했을 경우: 현재 보유량 및 추가 매입량에 대해 떨어진 금액만큼 손실
실제 떨어지고 예측에서도 떨어진다고 정확히 예측했을 경우: 떨어진 금액만큼의 기회 비용 보전
그런데 비트 코인 투자의 경우 매입/매도 전략 및 현재의 자산 상태 등에 따라 기대 이익을 추정하는 방법이 달라지기 때문에 기대 이익 추정을 위해선 먼저 어떤 매입/매도 전략을 세울 것인지 정해야 합니다.
상황을 간단히 하기 위해 '현재 시점보다 오를 것이라고 예측하면 비트 코인을 미리 정한 개수만큼 추가 구매하고, 떨어질 것이라고 예측하면 현재 보유한 물량을 모두 처분한다.' 라는 전략을 취한다면 아래와 같은 도식이 나오게 됩니다.
위 도식에서 P_t는 t 시점의 비트코인 시세를 의미하며, AMT_t 는 t시점에 보유한 비트코인 수량, CNT는 추가 매입할 비트코인 개수를 의미합니다. 이제 이 도식을 이용해서 기대 이익 (Profit) 에 대한 수식을 정리하면 아래와 같습니다.
위 수식을 보면 매 시점마다 예측 시세를 이전 시점 값과 비교해서 상승한다고 예측한 경우(TP or FP)와 하락한다고 예측한 경우(FN or TN) 각각에 대해 비트코인 보유량과 자본금을 업데이트하는 방식이 정의되어 있습니다. 그리고 이 정의된 값을 이용해 초기 자본금에 비해 얼마나 이익(혹은 손실)이 있는지 매 시점마다 계산한 후 그 평균값을 구하게 됩니다. 결국 예측 모델을 기대 이익 관점에서 평가하려면 위 수식을 테스트 데이터에 적용하여 매 시점마다 Profit_t 를 구한 후 평균을 계산하면 됩니다.
테스트를 위해 우선 아주 간단한 시세 예측 모델을 만든 후 원본 데이터 100일치에 대해서 시뮬레이션을 돌린 결과는 아래와 같습니다. 실험에서는 초기 자본금을 10만달러로 지정했습니다.
위 그래프에서 'model'은 제가 만든 예측 모델을 이용해서 100일 동안 투자를 진행했을 때 얻게 되는 일 평균 기대 이익을 의미합니다. 이 때 다양한 경우를 측정하기 위해 한번에 매입하는 비트 코인의 개수(CNT)를 1~10까지 바꿔가며 실험을 수행했습니다. 위 실험에 의하면 예측 모델을 이용할 경우 오히려 손해를 보는데 특히 CNT를 크게할수록 손해 규모가 기하급수적으로 증가합니다. 'random'은 예측모델 없이 임의로 사고 파는 경우에 얻게 되는 기대 이익입니다. 보다시피 예측 모델을 이용한 것보다 오히려 기대 이익이 더 높습니다. 마지막으로 'init'은 가장 첫 시점에 보유한 자본금을 모두 비트코인에 투자한 후 가만히 있는 경우입니다. 당연히 비트코인은 100일 동안 가격이 상승했으니 그만큼의 이득을 보게 됩니다. 그러나 이 경우도 실제 판매를 통해 이익을 실현하지 않으면 아무런 의미가 없는 수치입니다.
예측 모델을 만들 때는 항상 그 모델을 사용하는 목적이 무엇인지 생각해야 합니다. 그렇지 않고 예측 모델 기술에만 집착할 경우 본질에서 벗어난 결과를 초래할 수 있습니다. 그래서 모델의 성능을 평가할 때도 단순히 accuracy나 RMSE와 같이 일반적으로 통용되는 평가 방법만 이용하기 보다는 사용 목적에 맞는 평가 방법을 고민할 필요가 있습니다. 특히 실전에서는 해당 모델을 사용해서 얻게 되는 기대 이익을 고려한 평가 방법이 필요하다고 생각합니다. 그런데 이렇게 기대 이익을 측정하려면 모델을 어떻게 활용할 것인지에 대한 정책이 먼저 결정되어야 합니다. 그냥 '일단 모델 먼저 만들어 보고 잘 맞는 것 같으면 한번 적용해 보자' 라는 생각으로는 위에 소개한 비트 코인 시세 에측과 같은 우를 범하기 쉽습니다.
더 나아가 모델을 생성할 때 애초에 목표로 하는 기대 이익을 최적화하는 방향으로 학습하는 방법도 고려해볼 만합니다. 이에 대해서는 [1]을 참고하시기 바랍니다. 심지어 모델을 적용할 때 고려해야하는 여러 가지 변수 (예를 들어 이탈 예측에서 마케팅 비용이나 비트 코인 투자에서 매입할 코인 개수) 역시 기대 이익 관점에서 최적화가 가능합니다. 현재 제가 준비 중인 논문에서 이에 대한 내용을 다루고 있습니다.
마지막으로 비트코인이나 주식 시세는 과거 시세 정보만을 이용해서 예측하는 것이 불가능하다고 이미 이론적으로 검증되어 있습니다. 그러니 연습삼아 예측 모델을 만들어 볼 수는 있겠지만 그렇게 만든 모델을 이용해서 실제 투자에 활용해 보려는 시도는 하지 마시기 바랍니다.
[1] T. Verbraken, W. Verbeke, and B. Baesens, “Profit optimizing customer churn prediction with bayesian network classifiers,” Intelligent Data Analysis, vol. 18, no. 1, pp. 3.24, 2014.
[2] T. Verbraken, W. Verbeke, and B. Baesens, “A novel profit maximizing metric for measuring classification performance of customer churn prediction models,” IEEE Transactions on Knowledge and Data Engineering, vol. 25, no. 5, pp. 961.973, 2013.
[3] A. C. Bahnsen, D. Aouada, and B. Ottersten, “A novel cost-sensitive framework for customer churn predictive modeling,” Decision Analytics, vol. 2, no. 1, pp. 1.15, 2015.