안녕하세요. 주식초보입니다.
장기적인 가치투자에 관심이 많아서 알게된 조엘 그린블라트의 "마법공식"을 짧은 지식이지만 저와같은 주식 초보분들에게 조금이나마 도움이 되길 바라면서 도전기를 공유합니다.
4. 마법공식 완성하기
이번 시간에는 자본수익률+이익수익률을 이용하여 마법공식 운용방식을 그대로 구현하겠습니다. 우선, 마법공식 첫번째 시간에 언급한 마법공식 운용방식을 간략하게 다시 정리하면 다음과 같습니다.
마법공식 운용방식 정리
- 마법공식 합산순위가 높은 3종목을 1년차까지 매월 매수
- 13개월부터는 1개월차에 매수했던 3종목만 매도하고 신규로 3종목 추가 매수
- 만약, 13개월의 신규종목이 기존 보유종목에 포함되는 경우 신규종목의 차순위 종목 매수
마법공식 합산순위(자본수익률+이익수익률)가 높은 3종목을 12개월까지만 매월 매수하는데, 이때 종목당 투자금액은 "초기투자금액 / 12개월"로 계산합니다. 그래서 12개월에는 36종목을 초기투자금액의 주식비율(e.g., 0.95) 만큼 모두 매수하게됩니다. 그리고 13개월부터는 보유종목 기간을 1년으로 설정하기 위해서 1개월차에 매수했던 3종목을 무조건 매도하고 신규 3종목을 추가로 매수합니다. 이때 신규 3종목이 기존 보유종목에 이미 있는 경우에는 총 36종목을 유지하기 위해서 신규종목의 차순위 종목을 매수하게 됩니다.
위에서 언급한 마법공식 운용방식을 그대로 구현하기 위해 새로운 'Magic Formula Basket Class'를 만들었습니다. 이 클래스(MagicFormulaBasket)는 아래 '알고리즘'탭의 소스코드 내용중에 맨하단에 있는데, 기존 바스켓(Basket) 사용 방식과 유사한 함수들(setPortfolioBuilder(), buildPortfolio())을 제공합니다. 사용법은 바스켓 방식과 유사하고 간단해서 소스코드 내용을 참고하시면 될거 같구요. 여기서 주의할 점은 기존의 바스켓의 현재 예산을 설정하는 setBudget()은 안해도 되고, 당일종가 매매를 위해 initialize()에서 "IQEnvironment.simulationMethod = SimulationMethod.day;"를 설정하시면 됩니다.
시뮬레이션 설정
- 자본수익률 순위 (높은 순위) + 이익수익률 순위 (높은 순위)
- 마법공식 운용방식 적용
- 초기투자금액 3000만원, 포트폴리오 36종목 구성
- 시가총액 5000억 이상, 일거래 대금 5억 이상
- 코스닥, ETF, 관리종목, 거래정지, 우선주 종목 제외
이제 마법공식 운용방식을 테스트하기 위해 초기 투자금액은 3000만원, 월별 매수(또는 매도)하는 수량은 3종목, 보유종목 유지기간은 12개월로 설정하였습니다. 또한, 기본적인 필터링 조건들도 아래와 같이 이전 테스트 조건과 동일하게 유지하였습니다. 아래 그래프는 마법공식 운용방식 결과(마법공식완성#4 (매월3종목,12개월유지))인데 기존 매년 36종목을 일괄 매수/매도하는 방식(마법공식#3 (ROC+EY,매년36종목))에 비해 수익률이 조금 낮게 나왔습니다.
단순히 결과만 놓고보면, 예상과는 달리 마법공식 운용방식이 1년마다 일괄 36종목 매수/매도하는 방식에 비해 수익률이 높지 않네요. 혹시나 마법공식 바스켓에 문제가 있어서 수익률이 낮은게 아닐까 걱정되서 코드를 살펴보았는데, 아직까지는 논리적 오류를 찾지 못했습니다. 만일 오류를 찾으셨다면 피드백 부탁드립니다. 또한, 마법공식완성#4 (매월6종목,6개월유지), 마법공식완성#4 (매월12종목,3개월유지)도 매년 일괄 36종목 매수/매도 방식에 비해 수익률이 낮게 나왔습니다.