금융 머신러닝 프로젝트란 금융 데이터에 머신러닝을 적용하여 현실의 문제를 해결하는 프로젝트다. 이 프로젝트는 다음과 같은 요소로 나눠볼 수 있다.
CRISP data mining process
각 요소 하나하나를 앞으로 독립된 주제의 포스팅으로 다루려고 한다. 이번 포스팅에서는 각 구성 요소에 대해 간단하게 정리해보겠다.
Business Understanding → 산업 이해 및 문제 도출
가장 먼저 Business Understanding이다. 특정 산업 분야를 이해하고 그 산업의 needs를 파악할 수 있으면, 해당 분야에서 머신러닝을 통해 해결할 수 있는 문제, 자동화할 수 있는 문제를 찾을 수 있다.
금융 분야에 머신러닝을 적용할 수 있는 문제들의 예시는 다음과 같다.
- 대출 심사 등에 필요한 신용 평가(Underwriting)
- 신용카드 이상 거래 탐지(Fraud detection)
- 본인인증 절차 자동화(KYC)
- 고객 상담 및 영업을 위한 챗봇(Chatbot)
- 투자 자동화(Investment/Trading) 또는 투자에 도움이 되는 정보를 제공
이 블로그에서 다루고자 하는 금융 머신러닝 문제 - ‘투자’
금융 머신러닝 문제는 정말 다양하지만, 그 중 이 블로그에서 다루고자 하는 금융 머신러닝 문제가 무엇인지 우선 짚고 넘어가려고 한다.
문제에 따라 그 뒤의 내용들이 크게 달라지기 때문이다. (문제의 수)x(데이터의 수)x(적용할 수 있는 머신러닝 모델의 수)x(평가 방법의 수)x(배포 및 운영 방법의 수)만큼 많아질텐데, 문제 하나하나가 독립된 주제를 이루고 있어 이를 모두 다루기는 어려울 듯 싶다.
이 글을 읽는 대부분의 개인 투자자가 관심 있는 문제는 아마 비슷하리라 생각한다. 물론 나에게도 금융 머신러닝에 있어 가장 우선순위가 높은 관심분야다. 바로 ‘투자를 통해 돈을 버는 문제’다.
사실 위에서 언급한 예시들 중 투자를 제외한 문제들은 주로 은행이나 카드 회사, 보험사 등 대형 금융 회사에서 다루는 주제인데다 데이터도 접근이 제한적이다. 데이터 경연대회 같은 곳을 통해 공개된 정보가 아닌 한 데이터를 개인이 확보하기가 쉽지 않다. 그리고 주제 자체도 개인의 사이드 프로젝트보다는 회사 내에서 업무 프로젝트로 진행하는 게 좀 더 어울릴 법하다.
반면 데이터가 대부분 대중에게 공개되어 있어 비교적 간단한 크롤링 또는 API로 수집이 가능하고, 데이터 사이언티스트가 도전해볼만한 흥미로운 주제이면서, 개인적인 사이드 프로젝트로 진행하기에도 좋은(사이드 프로젝트와 재테크를 동시에!) 것이 바로 ‘투자를 통해 돈을 버는 문제’라고 생각한다.
(꿩도 먹고 알도 먹고! 하지만 그 꿩이 잡기 쉽다고는 안 했다..)
하여튼 그래서 금융 머신러닝의 적용 분야는 다양하지만, 그 중 앞으로 포스팅으로 다룰 문제는 ‘투자’에 한정지을 예정이다.
Data Understanding
풀고자 하는 문제를 결정했다면, 그 문제를 푸는 데 사용할 데이터의 특성을 이해하는 것이 중요하다. 다른 도메인처럼 금융 데이터도 그 고유한 특징을 가지고 있다.
금융 데이터의 특성은 기본적으로 시계열이고, structured data(일부 alternative data는 제외)라는 것이다. 다만 어떤 time resolution이냐에 따라 다룰 수 있는 데이터의 양이 천차만별이다. 예를 들면 재무 데이터는 분기별로 발표하기 때문에 굉장히 적은 편이지만, 주가 데이터는 틱 단위까지 가자면 하루에 GB 단위로 쌓인다. 그 밖에도 중요한 사실이 있다면 결국 금융 데이터는 해당 데이터와 관련이 있는 금융 상품에 대해 직/간접적으로 정보를 제공하고 있다는 것이다. 예를 들어 아무리 주가가 random walk처럼 보인다 한들 해당 상품에 대한 각 시장 참여자의 valuation의 조합으로 발생한 결과물이다.
금융 데이터가 가지는 좀 더 자세한 특징에 대해서는 별도의 포스팅으로 작성하였다.(이 링크에서 확인)
Data Preparation
데이터를 어떻게 수집하고 저장할지, 모델 학습 시 어떻게 서빙할지, 그리고 어떻게 전처리하고 가공할지가 중요한 부분이다. 엔지니어링 역량이 필요한 부분이기도 하다.
데이터를 수집하고 저장할 때 단순히 일봉만 활용하는 것이라면 크롤링과 CSV 파일 저장 형식으로도 충분하다. 그러나 Time resolution이 높아질수록(일→시→분→초→틱), 호가 데이터 등의 다양한 데이터를 포함하려고 할수록 데이터 용량은 기하급수적으로 늘어난다. 그래서 REST API, Websocket 같은 통신 방식을 이해하고 활용할 수 있어야 한다. 또 데이터 크기가 커질 경우 hdf5 같은 데이터 저장 형식을 활용하거나, MySQL 같은 RDBMS에 저장하고자 하면 Index를 잘 이해하고 설계해야 한다. Redis와 같은 In-memory DB나 시계열 데이터용 DB를 고려하는 것도 방법이다. 여러 종목을 동시에 수집하는 경우 Multi-thread와 같은 동시성 모델에 대한 이해도 필요하다.
사실 이 부분은 나도 아직 잘 알고 있는 부분이 아니라서, 앞으로 많이 공부하고 구현해봐야 할 것 같다.
또한 데이터 전처리와 feature engineering도 매우 중요하다. 예를 들면 주가 데이터는 low signal-to-noise ratio의 특성을 가지고 있어서, 적절한 전처리를 해주지 않으면 모델이 의미 있는 패턴보다 noise를 학습해 overfitting에 빠지게 될 가능성이 높다. 많은 데이터 사이언스 문제에서 데이터 전처리가 성능 향상의 핵심 열쇠가 되는 것처럼, 금융 머신러닝 프로젝트에서도 데이터 전처리가 중요하다.
Modeling
모델링은 문제를 어떻게 정의하느냐에 따라 시도하는 방법도 달라진다. 앞으로 주가가 상승/하락/보합을 할지 예측하는 Classification을 할 수도 있고, Fundamental data를 활용해 적정 가치를 Valuation하는 Regression 모델링이 가능할 수도 있고, 매수/매도/보유로 action을 정의하여 Reinforcement Learning으로 모델링을 할 수도 있다. 각 방법론에 맞는 머신러닝 모델을 활용하여 전략을 구현할 수 있다.
다만 어떤 모델링 방법을 활용하든, 해당 모델이 왜 이런 결정을 내렸는지 설명할 수 있어야 한다. 그래야 추후 수익이 좋지 않으면 왜 그런지 이해하고 대응할 수가 있다. 최근에는 Explainable AI(XAI) 기법이 활발히 연구되고 있으니 이를 적용해보면 좋을 것 같다. 특히 SHAP(SHapley Additive exPlanations)는 모델의 종류에 상관 없이 적용할 수 있고(model-agnostic) feature dependency까지 고려하는 장점이 있으니 적극적으로 고려해볼만하다.
또 다양한 모델의 Ensemble learning을 활용하여 모델의 overfitting을 막고 예측 정확도를 높이는 것도 고려해보면 좋다. 다른 종류의 모델을 함께 사용하거나, 다른 시간 단위의 학습 데이터를 사용하거나, 다른 factor를 사용하거나, 단기/중기/장기 예측 모델을 함께 사용하는 방식을 활용할 수 있다. (KC Rasekhschaffe, 2019)
Hyperparameter tuning을 위해 일반적인 머신러닝 프로젝트에서는 k-fold Cross Validation을 활용하지만, 금융 머신러닝 프로젝트에서는 다소 다른 방법인 Combinatorial Purged Cross Validation(Prado, 2018)을 사용해야 한다는 것도 유의해야 한다. 이와 관련한 자세한 내용은 추후 별도의 글로 작성하려고 한다.
Evaluation
투자 전략을 평가하는 방법은 주로 과거의 데이터를 중심으로 이루어지며 이를 백테스트(Backtest)라 한다. 백테스팅에서 고려되어야 하는 통계량으로는 승률, 수익률, 최대 낙폭(Maximum drawdown), 보유 기간, 전략으로 운용할 수 있는 자본의 양(Capacity), 포지션 위험 노출 정도, 회전율(Turnover) 등이 있다.
이 백테스트를 할 때 유의해야 할 점은 기존 머신러닝 평가방법과는 다소 다른 평가 기준을 고려해야 하고, 또 기존 평가방법보다 엄격하게 Overfitting을 막을 수 있는 방법을 사용해야 한다는 것이다. 위에서 언급한 Combinatorial Purged Cross Validation도 하나의 방법이다. 또, 반복된 백테스팅에서 발생하는 문제점인 Selection Bias under Multiple Testing을 막기 위해서는 Sharpe Ratio(위험 대비 수익률을 측정하는 지표)를 그대로 사용하기보다는 반복된 시행을 고려하는 deflated Sharpe Ratio(Bailey & Prado, 2014) 등을 사용해야 한다.
또한 시뮬레이션은 내가 만든 모델이 매수 신호를 내자마자 바로 체결된다고 가정할 수 있지만, 실제 트레이딩에서는 그렇지 않을 수 있다. 따라서 슬리피지(Slippage, 원하는 체결가격과 실제 체결된 가격 사이의 괴리)를 추가하여 수익을 계산해야 한다.
마찬가지로 보다 자세한 내용은 추후 별도의 글로 작성할 예정.
Deployment
많은 노력을 통해 백테스팅 검증까지 통과한 투자 전략을 찾았다고 하더라도, 아직 한 단계가 더 남아 있다. 투자전략을 실제 투자할 수 있는 시스템으로 만드는 것이다.
이를 위해서는 실시간 데이터 처리 및 주문 거래 시스템을 구축해야 한다. 백테스트나 페이퍼트레이딩(모의투자)으로 확인했다 하더라도 실제 투자를 하는 것은 다른 상황이기 때문에 어떻게 대처할지에 대한 원칙도 세워야 한다. 처음부터 모든 자본을 투입하는 것이 아니라 일정 비율로 시작한 뒤 수익이 예상대로 나오는 것이 확인되는 경우 점차 증액한다.
로깅 및 모니터링 시스템도 필요하다. 내 전략이 만들어내는 알파가 지속적으로 창출가능한지, 처음에는 수익이 잘 나오다가 어느 순간부터 손실이 나기 시작하면 파라미터를 다시 학습시켜야 할지, 혹은 어느 시점을 기준으로 전략을 중지해야 할지 판단의 기준을 세워야 한다.
마무리
금융 머신러닝 프로젝트의 구성 요소를 이해하기 위해 CRISP data mining process라는 관점을 통해 살펴보았다. 짧게 적는다고 적었는데 워낙에 다룰 내용이 많다보니 좀 길어졌다.
이번 글을 통해 금융 머신러닝 프로젝트가 어떤 구성요소들로 이루어져 있는지, 각 구성요소에서 다른 머신러닝 프로젝트와 달리 유의해야 할 점에 무엇이 있는지를 간단하게나마 전달하고 싶었다.
어떻게 보면 구성요소 하나하나를 모두 정석으로 개발하려고 하면 그 자체로 하나의 머신러닝 헤지펀드 회사가 되는 것이나 다름 없어서 모든 것을 완벽하게 구현하는 것이 굉장히 어려울 수 있다. 그래서 개인 투자자의 입장에서는 가장 간단한 구성 요소들로 먼저 프로젝트를 구성하고, 그 후에 필요할 때마다 하나하나를 고도화시켜나가는 것이 더 중요할 듯 싶다. 또 머신러닝은 결국 패턴 인식 기계이기 때문에(지나친 맹신은 언제나 지양하자) 사실 꼭 머신러닝이 Modeling의 전략 생성에 들어갈 필요도 없다. 일반적인 rule-based 전략으로 시작해서 나중에 해당 부분을 머신러닝으로 자동화하는 방식의 접근도 괜찮다.
다만 전략이 문제에 부딪힐 때 어떤 부분에서 고도화를 시킬 수 있는지, 내 전략 생성 과정 중 어느 부분에서 Overfitting이 발생할 수 있는 위험이 있었는지를 진단할 수 있으면 좋다.
그리고 이 내용들도 개인적으로 학습하면서 알게 된 내용이지, 정답이 아니므로 이 글을 읽는 분들도 적당히 걸러서 읽으시면 좋을 것 같다.
이 주제를 처음 접하게 되었을 때 어떤 구성요소들이 있는지, 어떤 개념이 있는지, 어느 부분부터 어떻게 시작해야 할지 막막했었는데 이 글이 비슷한 고민을 가진 사람들에게 도움이 되었으면 하는 바람이다.