데이터의 양이 적은 시계열 데이터의 모델링 과정을 찾다가 같은 고민으로 인해 해결방법을 찾고 실험적으로 시도해본 내용이 있어서 하나 하나 이해하는 관점으로 정리해보았습니다.
(※ 유튜브 naver d2 포스팅을 참고하였습니다. URL : https://youtu.be/dB8cpsnZ5FA)
영상에서는 예시로 시계열 Feature 자체에 노이즈가 굉장히 심한 금융데이터를 사용하여 어떤 문제점이 있고 이를 어떤 식으로 해결했는지 설명하고 있습니다.
문제점 1. 시계열 Feature 자체의 노이즈
기본적으로 주가를 예측하는 모델링을 하는 경우 다음 주가는 현재주가를 기반으로 하며 딥러닝 모형이 찾아야 하는 정보와 노이즈를 함께 반영합니다. 상대적으로 정보보다 큰 노이즈 때문에 AR(1) 모형이랑 유사하다고 할 수 있습니다.
위와 같은 상황에서 모델링을 하는 경우 현재 주가가 그대로 반영이 되기 때문에 아래 그림처럼 오른쪽으로 Lagging 되는 예측값을 생성하는 결과를 보이게 됩니다.
문제점 2. 시계열 Feature 종류 대비 짧은 시계열 길이
예를들어 자산을 주식60%, 채권30%, 금10%로 분배하여 관리하기 위한 정보를 얻기 위해서 참고해야할 요소들이 굉장히 많을 것입니다. 금, 채권, 주식 등 과 같은 자산군 데이터 뿐만 아니라 자산군 데이터에 영향을 미치는 금리, 인플레이션 등 많은 매크로 데이터들도 함께 고려되야합니다.
하지만 Raw 데이터가 아닌 우리에게 필요한 주요 변수는 단기부채사이클의 위치, 장기부채사이클의 위치 등 High Level Feature들입니다. 이런 High Level Feature들은 daily로 뽑을 수 없고, 긴 시간을 통해서 뽑을 수 있는 값이기 때문에 주로 Monthly Frequency를 사용하게 되는데 현재 사용가능한 기간이 길어야 40년이고 약 480개의 데이터밖에 없습니다. 고려할 수 있는 Feature 데이터는 많지만 실제 길이는 많지 않기 때문에 차원의 저주가 생기게 됩니다.
문제점 3. 문제점1과 문제점2로 인한 Overfitting
문제점1 해결책. 시계열 Feature 자체의 노이즈 → Time-series denoising
가장 흔하게 사용되는 이동평균법을 사용하게 되면 오른쪽으로 스무딩되는 Lagging 현상을 보입니다. 시계열 데이터의 경우 한 시퀀스를 사용해서 모델링을 하고 시퀀스 내에서 앞의 데이터를 사용할 수 있기 때문에 Bilateral Filter를 사용하면 Lagging 없이 denoising이 가능해집니다.
이동평균이나 Bilateral Filter 방법으로 전처리 후 모델링을 하게 되면 분명 학습 개선 효과를 볼 수 있지만 어느정도의 스무딩을 해야 좋을지 결정하는 조건이 생깁니다. 그래서 학습과정에서 노이즈를 제거하고, 어느정도 수준에서 denoising을 해야하는지 자동적으로 해결할 수 있도록 CNN Stacked AutoEncoder 기반 Denoising Module을 개발해서 시도해봤습니다.
전체 성능을 보기 전에 AutoEncoder 부분의 성능을 먼저 확인해봅시다. 위의 그림은 환율(하늘색) Feature를 20일 이동평균(초록색)으로 스무딩 된 결과와 AE의(주황색) 스무딩 결과로 AE 방법이 학습이 진행됨에 따라 원활하게 스무딩이 되고 있는 것을 보여줍니다.
문제점2 해결책. 시계열 Feature 종류 대비 짧은 시계열 길이 → 기존 도메인 지식 활용하여 모델 최적화
부족한 데이터를 생성하기 위해 초기에 GAN 기반의 데이터 생성을 하였으나 10개 이하의 데이터 포인트까지로는 생성이 되지만 10개 이상만 되도 서로 상관성이 고려된 데이터를 생성하기엔 어려움이 따릅니다. 그래서 기존의 퀀트와 같은 모델들은 어떻게 만들었는지 고민해보았습니다.
기존 퀀트모델은 데이터에서 경험적으로 얻은 경제적 함의점을 내포하여 모델 포트폴리오를 생성하는데 실제로 경제적 함의점까지 고려하는 직관 자체를 모델링하는 것은 불가능하기 때문에 모델 부분을 타겟으로 잡았습니다. 기존의 모델은 주로 선형적인 12-1M 모델을 사용하는데 이 부분을 딥러닝 모형으로 최적화 시키는 것을 목표로 잡았습니다.
(12-1M : 1년의 데이터로 수익률을 계산할 때 최근 1개월의 수익률을 차감하는 방법)
factor investing을 사례로 동적배분이 가능하도록 실험적으로 시도해봤습니다. 학습이 진행됨에 따라 factor에 대한 동적배분이 원활하게 이루어지고 있음을 볼 수있습니다. 결론적으로 데이터의 길이가 짧다보니 상대적으로 도메인 지식이 많이 필요하게 되고 기존 모델을 이용해서 최적화 시키는 것이 적합한 방법이라고 할 수 있을 것 같습니다.
(상세내용은 영상 참고 바랍니다. 이부분은 잘 이해하지 못함....ㅠㅠ)
문제점3 해결책. 그럼에도 불구하고 발생하는 Overfitting
1) Asynchronous Multi Network Learning
아래 그림의 검정관측치를 대상으로 regression을 하게 되면 수행할 때마다 각각 다른 모델이 생성되고 지금처럼 데이터가 많지 않을때는 cost는 비슷하겠지만 initialization을 어떻게 하는지에 따라 다르게 수렴될 것 입니다. 일반적으로 오버피팅을 방지하기 위해 dropout과 같은 regularization을 해주는데 그렇게 되면 일반적인 regression에서 L2 norm과 큰 차이가 없게됩니다. 파란색과 같은 형태의 모델은 데이터가 많아짐에 따라 최적의 모델이 되지 않을 수도 있기 때문에 데이터가 적은 상황에서 L2 norm을 적용시키는 것은 부적합하다고 생각해서 thread별로 초기화된 네트워크를 가지고 여러 네트워크를 동시에 병렬적으로 학습시켰습니다.
N개의 thread에서 개별 네트워크를 초기화해서 iteration을 시킨 후 validation set으로 오버피팅을 검증하여 하위x개를 제거하고 제거된 만큼 다시 새로운 네트워크를 추가하여 validation을 기준으로 원하는 수준까지 반복 후 최종적으로 남은 모델들의 앙상블 결과로 test set을 검증하였고 이를 통해 어느정도 오버피팅을 방지한 효과를 볼 수 있었습니다.
2) Bayesian Inference
여전히 관찰되지 못한 구간에 대한 문제가 있지만 이를 오버피팅 시키는 것 보다 모른다고 결과를 내는 것이 오히려 효과적입니다. 기존에 주로 사용하는 방법으로 MC Dropout, MC batch normalizaion이 있고, 아래 오른쪽 그림은 그 중에 MC Dropout을 적용한 방법으로 예측 변동성이 커지는 구간의 신뢰구간이 커지는 것을 볼 수 있는데 불확실한 상황에서 불확실한 결과를 줌으로써 보수적으로 투자할 수 있도록 할 수 있습니다.
MC Drop의 경우 Tau, Dropout rate, Activation에 따른 영향이 높은 단점이 있기 때문에 기존 딥러닝 회귀에 Gaussian process regression을 한번 더 학습시키는 방법을 제안합니다.
혼자 공부하면서 정리하는 개념으로 작성하여 많이 부족합니다 ㅠ_ㅠ
틀린부분이나 첨언해주실 내용 있으시면 댓글 부탁드려요 ^^