brunch

You can make anything
by writing

C.S.Lewis

by Wood Jan 24. 2024

코딩으로 전재산 투자하기 - Intro

동적자산배분 계산기와 백테스팅 도구 개발기

지인이 추천해 준 강환국 작가의 ‘거인의 포트폴리오’라는 책을 읽고 자산배분에 관심이 생겼다.

자산배분(Asset Allocation)이란 마코위츠의 포트폴리오 이론에 기초하여, 서로 상관성이 낮고 장기적으로 우상향 하는 자산들에 분산투자하여 변동성을 최소화하고 수익률을 극대화하는 투자 방법을 말한다.


자산배분 전략은 크게 2가지로 분류할 수 있는데, 정적자산배분과 동적자산배분이다.

정적자산배분은 포트폴리오 내 한 번 정한 자산 별 비중을 수정하지 않는 방식이다.

예를 들어, 예로부터 잘 알려진 Classic Portfolio(주로 60/40이라고 부른다)에서는 주식에 60%, 채권에 40% 투자하는 방식이다. 구체적으로는 보통 미국의 대형주를 대표하는 S&P500 ETF 인 SPY에 60%, 미국 재무부 중기채(T-note) ETF 인 IEF에 40% 를 투자하는데, 매년 정해진 날짜에 한 번 리밸런싱을 해준다. 참고로 리밸런싱은, 자산의 가치가 오르락내리락하기 때문에 시간이 지나면 처음에 설정한 비율과 달라지게 되므로 이를 다시 조정해 주는 것을 말한다(오른 자산은 초과한 만큼 팔고, 내린 자산은 부족한 만큼 더 산다).

정적자산배분전략은 1년에 1회 리밸런싱 하는 것이 일반적이다. 어차피 자산의 비중을 변경하지 않는 데다, 자주 리밸런싱할수록 거래 수수료가 발생하여 실질 수익률이 낮아질 수 있으며, 이성에 의한 판단을 하기 어려워질 수 있기 때문이다.

동적자산배분은 정적자산배분에 마켓 타이밍(trend following)이 더해진 방식이라고 볼 수 있다.

보통 오른 주식은 한동안 더 오르고, 내린 주식은 한동안 더 내리는 경향이 있다. 항상 그런 것은 아니지만 그런 경우가 꽤 많다. 그래서 분산 투자하는 자산 중 일부만 이 경향을 보인다면 이 부분을 활용할 수 있는 것이다. 대신 이러한 추세는 오래 지속되지 않기 때문에 동적자산배분 전략에서는 보통 1달에 1번 리밸런싱을 한다.


여기서 나온 개념이 모멘텀(momentum)이라는 개념이다. 모멘텀은 크게 절대모멘텀과 상대모멘텀이 있다(이외에 여기서 파생된 광폭 모멘텀, 카나리아 자산군 등이 있지만 나중에 설명하겠다).

절대 모멘텀(Absolute Momentum)은 특정 하나의 자산이 현재 상승 추세인지 하락 추세인지 가늠하여 이 자산을 계속 보유할지, 아니면 현금으로 전환할지 판단하기 위한 개념이다. 여기서 '추세'를 판단하기 위한 기준은 다양한데, SMA(Simple Moving Average: 단순이동평균)나 최근 n개월 수익률 등이 대표적인 예다.

반면 상대 모멘텀(Relative Momentum)은 여러 자산군들 중에 어떤 자산군이 좀 더 강한 상승 추세인지를 가늠하여 이 중 어떤 자산들을 보유할지를 판단하기 위한 개념이다. 최근에 나온 기술들은 보통 이 2가지를 모두 활용한다. 이 2가지를 묶어 듀얼 모멘텀이라고도 부른다. 동적 자산배분전략 중에는 바우터 켈러(Wouter Keller)가 개발한 전략들이 굉장히 유명하다. 대표적으로는 VAA, PAA, DAA, LAA, HAA, BAA 등이 있다. 켈러의 전략들에 대한 자세한 내용은 논문들을 참고하면 된다.



자산배분 전략 선택 시 주의해야 할 점이 있다. 보통 자산배분 전략들은 과거의 가격 데이터를 활용하여 백테스팅을 한 결과로 전략의 성능을 판단한다. 하지만 과거의 데이터를 기반으로 한 것이기 때문에 미래에도 동일하게 동작할 것이라는 보장은 없다는 리스크가 있다. 그나마 이를 최소화하기 위해서는 과최적화(overfitting)가 되지 않도록 주의해야 한다. 머신러닝(ML)에서의 overfitting과 비슷하다고 생각하면 된다. 즉, 통계를 내는 데 사용한 과거의 데이터에서만 잘 동작하고, 미래의 데이터에서는 오히려 잘 동작하지 못하는 알고리즘을 사용하면 안 된다. 예를 들어 ‘주식의 최근 1년 수익률이 마이너스라면 현재 주식 시장이 좋지 않다고 볼 수 있으므로 주식 보유분을 모두 팔아 현금을 보유한다.’라는 가설은 충분히 논리적으로 납득이 가능하다. 물론 최근 1년 수익률이 마이너스라도 지금이 바닥이라서 바로 한동안 반등할 가능성도 있다. 하지만 결국 확률의 문제이고, 손익을 상계하여 약간이라도 이득이 나서 장기적으로 이기는 싸움이기만 하면 된다. 그나마 ML에서는 모델을 학습한 후에 학습에 사용하지 않은 real world 데이터를 사용하여 이게 잘 만들어진 모델인지 어느 정도 평가가 가능하다. 하지만 자산배분 알고리즘은 평가에 사용할 데이터가 없다. real world 데이터는 이미 백테스팅에 사용한 과거에 있었던 데이터가 전부다. 그래서 딥러닝의 세계에서는 왜 잘 동작하는지 설명이 안 되는 모델들이 비일비재한데, 동적자산배분에서는 알고리즘의 동작 논리가 어느 정도 설명과 납득이 가능해야 그나마 안전한 투자가 가능하다고 생각한다. 제대로 동작하지 않았을 때의 결과는 개와 고양이를 분류하는 모델과는 비교도 안되게 파급효과가 크기 때문에 방어적으로 접근해야 한다고 생각한다(전재산을 날릴 수도 있다).


어쨌든 나는 비교적 최근에 나온 동적자산배분 전략을 사용하여 passive 하게 투자를 하기로 했다. 투자에 들일 노력과 시간으로 본업에 집중하고, 투자는 내 개인적인 판단을 배제하고 일정 주기로 정해진 알고리즘대로만 하는 것이다. 물론 내가 사용하는 자산배분 전략의 근간이 흔들릴 수 있는 큰 이벤트가 발생할 수 있기 때문에 거시적인 글로벌 경제 트렌드에는 관심을 가져야 한다(전략의 근간이 흔들린 대표적인 예로, 여러 자산배분 전략에서 사용되는 원자재 ETF 인 DBC는 23년 1월 1일부터 미국에서 외국투자자가 매매하는 경우 10% 의 세금이 부과되게 되어 수익률에 큰 하락을 야기하게 되었고, 포트폴리오에 DBC 가 포함된 많은 투자자들은 이를 PDBC로 대체하였다).

그중에서도 1971년부터 2023년 1월까지의 CAGR(Compound Annual Growth Rate: 연복리수익률) 15.9%, MDD(Max Drawdown: 최대 하락율) -10% 인 HAA(Hybrid Asset Allocation) 전략을 사용하여 투자를 하기로 했다. 연복리수익률이 16% 면 자산의 가치가 10년 뒤에는 4.4배, 20년 뒤에는 19.4배 30년 뒤에는 86배 상승하는 엄청난 수익률이다(물론 정확히는 여기서 해외주식 양도소득세(22%), 해외주식 거래수수료(내 경우엔 매수/매도마다 0.03%), 환손실, 슬리피지, 인플레이션 등을 고려하면 실질 수익률은 더 낮을 가능성이 높다는 것을 알아야 한다). 조금만 계산해 보면 10% 대의 연복리수익률만 가능해도 FIRE가 그리 먼 이야기처럼 느껴지지 않는다.

게다가 MDD 가 -10% 라는 건 내가 10억을 투자했을 때 최대로 잃어도 고작(?) -1억이라는 것이다. 참고로 S&P500의 MDD는 -50% 가 넘고(2007~2009년), 전고점을 회복되는 데까지 6년이 걸렸다. 즉 내가 10억을 투자했을 때 5억 넘게 잃는 시기가 있고, 불안한 마음을 떨쳐내기까지 6년이 걸릴 수 있다는 것이다. 이것은 하나의 포트폴리오를 장기적으로 지속하지 못하게 되는 원인이 된다. 우리가 기대하는 높은 CAGR 은 오랜 기간의 데이터로 백테스팅을 해서 나온 결과이므로, 이에 근사한 수치가 나오려면 오랜 기간 동안 같은 전략을 유지하는 것이 중요하다. 그렇기 때문에 S&P500 ETF를 적립식으로 매수하는 전략의 경우 기대 수익률은 높겠지만 리스크가 크기 때문에 장기투자의 관점에서는 사람에 따라 맞지 않는 투자 전략일 수 있다.


하지만 막상 HAA로 투자를 하려고 하니 비중을 계산하는 게 꽤나 번거로웠다. HAA는 8개의 공격자산, 2개의 안전자산, 1개의 카나리아 자산으로 이루어져 있는데, 총 10개 자산에 대해 상승/하강 강도를 보기 위해 모멘텀 스코어를 계산해야 한다. 그리고 이 스코어가 어떻게 나오느냐에 따라 어떤 자산군을 얼마나 사야 되는지를 결정한다. 모멘텀 스코어로는 13612U라는 것을 사용하는데, 최근 1개월, 3개월, 6개월, 12개월 수익률을 평균 내는 방식(U=Unweighted. Weighted 방식도 있음)이기 때문에 1달에 한 번 스프레드 시트로 모든 값들을 직접 계산하려니 굉장히 번거로웠다.  그래서 이를 자동으로 계산해 주는 코드를 작성해야겠다고 마음먹은 게 ‘리밸런싱 계산기(Rebalancing Calculator)’ 프로젝트의 시작이었다.

실제 개발 중인IDE(통합 개발 환경) 스크린샷

하다 보니 시중에 있는 유료 백테스팅 도구 대신 내가 직접 만들어서 마음껏 백테스팅해야겠다는 생각이 들었고, 최근에 나온 기능인 Kotlin Notebook을 활용하여 백테스팅 스크립트도 작성하기로 했다. 사실 이런 곳에는 주로 파이썬을 많이 사용하지만 업무에서 사용하는 언어인 코틀린에 가장 익숙하기 때문에 코틀린을 사용하기로 했다. 실제로 전략을 구현하다 보니 전략에 대해 애매하게 이해했던 부분이 확실하게 이해가 되었고, 개발 도중 드는 의문점들을 검색을 통해 해결해나가다 보니 지식의 공백이 채워져서 좋았다. 내 대부분의 자산을 몰빵 하는 데 사용할 전략이라면 깊게 이해할 필요가 있다고 생각한다. 그래서 논문도 모두 읽고, 직접 구현하는 과정은 필수라고 생각했다.


다음편부터는 어떻게 ‘리밸런싱 계산기’ 프로젝트를 개발했고, 어떤 식으로 사용 중인지, 그리고 앞으로의 업데이트 계획은 어떻게 되는지 적어보려고 한다.


소스코드(Github): https://github.com/sgc109/quant-rebalancing-calculator


작가의 이전글 이제 AI 가 전화영어를 완전히 대체할 수 있을까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari