호돌찌의 AI 연구소
article thumbnail

젠포트 전략 구현하기 두 번째 Topic으로는 마법공식입니다. 마법공식으로 유명한 사람은 역시 조엘 그린블라트입니다. 여기서 핵심 컨셉으로는 저평가(가치 지표)와 고수익(수익성 지표)을 basis로 한다는 점입니다. 

 

 

조엘 그린블라트의 마법공식 자세한 내용은 여기를 참고해보시는 게 좋을 것 같고, 저는 강환국 작가님의 영상에서 이야기하는 '신 마법공식' 관련해서 젠포트로 구현해보겠습니다. 

 

전략 소개


다루고자 하는 전략은 아래 영상을 바탕으로 작성하고자 합니다. 아래 영상은 21년 6월에 나온 영상임을 참고해주시길 바랍니다. 이 글을 읽고 따라 하기 전에 한번 보시는 것을 추천드립니다. (썸네일이 상당하다는 것은 덤입니다.)

https://youtu.be/_q1PF8liP48

 

 

팩터 및 논문 간단 소개


영상 내에서 Wahal 교수님과 Repetto 박사님이 EV/EBIT 대신 가치지표로는 PBR, 수익성 지표로는 ROC나 GP/A 대신 영업활동현금흐름에 순자산을 나눈 것을 제안하고 있습니다. 

 

 

논문 제목은 대충 직역해보면 "가치와 수익성 결합 분포"인 것처럼 두 지표를 활용했다는 것을 직관적으로 알 수 있습니다. (참고로 통계학에서 Joint Distribution은 2개 이상 확률 변수에 대한 확률 분포를 뜻합니다.)

 

 

논문은 2020년 12월에 출간되었으며 논문 출처는 아래와 같습니다. 영상에 나오는 Table들 결과도 전부 있습니다. 

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3739571 

 

The Joint Distribution of Value and Profitability: International Evidence

Abstract We examine the joint distribution of value and profitability in international markets. Over the 1990-2020 sample period, portfolios formed at the intersection of value and profitability generate systematic return patterns: value and high-profitabi

papers.ssrn.com

 

논문 내에서 테이블들을 들고 오면 아래와 같습니다. 선진국, 이머징마켓, 선진국-북미, 전세계-미국 대상으로 4등분을 하였고, 1990년부터 2020년까지 실험하였습니다. 표의 가로/세로축에서 value는 PBR(growth 쪽으로 갈수록 value가 높음) , profitability(오른쪽으로 현금흐름이 높음)으로 구성되어있고 값은 return이라고 생각하시면 됩니다. 현금흐름이 높으면서 저평가일수록 효과가 있다는 것을 알 수 있습니다. 

 

 

소형주와 대형주 결과도 마찬가지로 효과가 있음을 알 수 있고, 소형주와 대형주 큰 차이가 없다는 것을 논문에서 보여줍니다.

위의 논문에서 같은 영역들 사이에 있는 값들 하나하나 면밀히 보면 엄청나게 차이는 나지 않지만 다른 영역들끼리 비교를 하면 차이가 남을 볼 수 있습니다. 이제 가치지표와 수익성 지표를 바탕으로 전략을 만들면 되겠다는 생각이 드실 겁니다. 이제 컨셉도 알았고 논문에서의 Wahal 교수님과 Repetto 박사님이 제시한 팩터가 마침 젠포트에 있기 때문에 구현을 한번 해보도록 하겠습니다. 마찬가지로 소형주와 함께 적용해보는 대신 이전 글과 다른 마켓타이밍과 타점을 활용해보겠습니다. 

 

이전 글은 아래를 참고하시면 됩니다. 

2022.09.16 - [Investment - Stock & Crypto/Quant Strategy] - [젠포트 전략 구현하기] 소형주 & 유진 파마(Eugene Fama) - 호돌찌의Asset연구소

 

[젠포트 전략 구현하기] 소형주 & 유진 파마(Eugene Fama) - 호돌찌의Asset연구소

개인 투자자가 퀀트 투자를 시작하는 데 있어 제일 난이도가 높은 부분은 양질의 주식 종목의 데이터 수집과 품질 검수 부분이라고 생각합니다. 이 부분에 있어 양질의 데이터와 백테스팅을 하

hotorch.tistory.com

 

 

젠포트로 전략 구현하기


1. 테스팅 기간 설정 및 기본 조건

아래 그림과 같이 세팅을 하였습니다. 2007년 1월 2일부터 2022년 9월 30일까지 테스팅 기간으로 선정하였습니다. 

 

2. 매수 타점 및 종목 비중 설정

타점은 전일 종가 그대로 활용하였고 20 종목을 매수하도록 하였습니다. 복리로 불어난 수익은 최대 100 종목까지 보유하여 예수금을 최대한 쓰도록 하였습니다. 참고로 종목수는 최대 50개(매수 비중 2%)까지 지정이 가능합니다. 종목수가 늘어나면 mdd가 상대적으로 줄어들지만 수익률도 떨어질 수 있습니다. 또한 백테스트 소요 시간이 길어지는 점 참고하시면 되겠습니다. 

 

 

3. 매도 타점 설정 및 종목 보유일 설정

종목 최대 보유일을 999일로 세팅하였습니다. 이 뜻은 무조건 조건식에 매도하겠다는 뜻으로 간주하셔도 됩니다. 조건 부합 시 매도 가격 기준은 전일 종가가 아닌, 고가, 종가, 저가의 산술평균인 피벗 기준선으로 설정하였습니다.  

 

 

4. 매매대상 유니버스 설정

이전 글과 마찬가지로 은행, 지주사, 인터넷은행, 중국기업을 제외하여 세팅을 하였습니다. (개인 취향에 가깝다고 생각하시면 됩니다. 반대로 제가 유니버스에서 제외한 영역에서 알파가 있을 수 있으니 취향 존중해주시면 감사하겠습니다.)

 

 

 

5. 매수 조건 식

아래와 같이 세팅을 하였습니다. 설명하면 다음과 같습니다. 따로 다른 조건식마다 함수를 적용하지 않고 AND 조건으로 연결하였습니다. 단 이전 글에서의 마켓타이밍은 코스닥 종가가 20일 이동평균선 상회할 때에만 매수를 했었지만 이번 마켓타이밍으로는 소형 지수를 활용하여 F, G, H 부분을 구현하였고, 부분은 or로 엮었습니다. (참고로 필자는 코스닥 소형지수 마켓타이밍만 활용을 했었지만 저는 Doodly님 블로그 글(강추)에서 영감을 받아 따라 해 보았습니다.)

 

A : {영업이익} > 0
B : {트레일링매출} > 3,000,000,000
C : {시가총액} > 40
D : {일별주가상승률}*{일별주가상승률} <= 625
E : {종가} > 1,000
F : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{3일})+이동평균({KOSDAQ_소형지수_종가},{3일})) > 1
G : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{5일})+이동평균({KOSDAQ_소형지수_종가},{5일})) > 1
H : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{10일})+이동평균({KOSDAQ_소형지수_종가},{10일})) > 1
I : 비율('{총발행주식수}*{종가}',{오름차순}) < 20

A ~ C : 직전 분기 영업이익이 나면서, 상장폐지 종목을 최소화시키기 위한 매수 조건식입니다.

D : 전일 +/- 25% 이상의 변동성을 보인 종목을 제외하였습니다. 간단하게 이야길 하면 전일 상한가, 하한가 간 종목을 제외하였다고 생각하면 됩니다. 

E : 동전주를 제거하기 위함입니다.

F~H : 코스피와 코스닥 소형 지수 종가를 합한 것이 이동평균선 3, 5, 10일 각각 합한 것보다 상회할 때에만 매수를 하겠다는 뜻입니다.

I : 시가총액 하위 20% 종목을 보겠다는 뜻입니다. 

 

 

6. 우선순위

가장 중요한 부분이라고 할 수 있는 우선순위입니다. 아래 식 전체로는 내림차순으로 정하였습니다. 4번에서 유니버스로 설정한 2200여 개의 종목들 중에서 5번의 매수 조건식으로 필터링 후, 우선순위를 적용하여 20 종목을 사서 20일 보유한다는 뜻입니다. 비율 함수를 적용시켰는데, 개인적으로 작은 정수 값으로 떨어지는 순위 함수보다 정도의 개념을 더 선호하기 때문에 비율 함수로 적용하였습니다. 참고로 아래 우선순위에서 순위로 전부 바꾸고, 전체 오름차순으로 백테스팅을 하면 결과는 비슷하게 나타남을 확인이 가능합니다. 또한 비율 함수 내에 두 개 이상의 팩터를 쓰기 때문에 따옴표를 활용하여 묶어 줍니다. 

# 전체 내림차순 정렬
비율({주가순자산률(PBR)},{내림차순})+비율('{영업현금흐름}/{자산}',{오름차순})

 

7. 매도 조건 식

5번 매수 조건 식에서 F~H에서 부호만 바꾸었습니다. 

A : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{3일})+이동평균({KOSDAQ_소형지수_종가},{3일})) < 1
B : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{5일})+이동평균({KOSDAQ_소형지수_종가},{5일})) < 1
C : ({KOSPI_소형지수_종가}+{KOSDAQ_소형지수_종가}) / (이동평균({KOSPI_소형지수_종가},{10일})+이동평균({KOSDAQ_소형지수_종가},{10일})) < 1

 

전략 Performance


다들 궁금해할 퍼포먼스 부분입니다. 위와 같이 구현했을 때 결과는 아래와 같습니다. 

 
이전 글에서 20일 이동평균선 상회/하회 했을 때 매수/매도하는 마켓타이밍을 적용했을 때 평균 보유일이 9일이 조금 넘었는데 이 마켓타이밍은 조금 짧습니다. 매매 Cost가 조금 든다고 생각이 들법하지만 8.45일 정도면 상당히 좋다고 할 수 있는 것 같습니다. cpc index와 Sharpe Ratio도 좋은 것 같습니다. 

 

 

 

위의 전략에서 저번 글과 마찬가지로 소형주의 효과를 조금 더 극대화시켜보도록 하겠습니다. 위의 5번 매수 조건식에서 시가총액 하위 20% 추출하는 I 조건식을 빼고 아래와 같이 2차 정렬을 활용해보겠습니다. 

{시가총액} (오름차순)
[2차: 비율({주가순자산률(PBR)},{내림차순})+비율('{영업현금흐름}/{자산}',{오름차순}) (내림차순)]

이 뜻은 지정한 유니버스 내에서 매수 조건식을 적용 후 시가총액 하위 50개의 종목을 고른 후, 2차 정렬을 적용해 재 정렬 후 20개의 종목을 매수한다는 뜻입니다. (개인적으로는 50개 대신 n개로 사용자가 선택할 수 있으면 또 다른 결과를 얻을 것 같아 좋을 것 같습니다.) 그 결과는 아래와 같습니다. 

 

 

 

앞선 전략과 비교를 해보았을 때 올해 최근 퍼포먼스는 2차 정렬 없는 것이 손실이 더 적습니다. 또한 처음 전략이 MDD가 20%로 더 적습니다. 하지만 누적 6자리 수익률에 평균 8일 보유하면서 Sharpe Ratio가 3 이상 & CPC Index가 1.2가 넘는 전략은 만들기가 쉽지 않습니다. 

 

강환국 작가님의 영상 끝 부분에 여러 가지 아이디어가 나오는데, 콘셉트는 동일하게 가면서 팩터를 여러 개 섞어서 해보는 것도 좋을 것 같습니다.

 

참고로 두 전략을 비교한 상관성과 매매 일치성 결과는 아래 캡처를 확인해 주시면 되겠습니다.

 

더 좋은 아이디어가 떠오르고 내용이 괜찮으면 글을 올리도록 해보겠습니다. 틀린 점이나 궁금한 점이 있으면 댓글 달아주시면 감사하겠습니다. 

 

 

*추가 1)

대형주의 결과를 보면 투입하고 싶지 않음을 알 수 있습니다. 로직은 우선순위는 그대로 두고, 시총 상위 30% 필터, 마켓타이밍을 전부 대형 지수로 바꾸었음을 알립니다. 

 

*추가 2)

이전 글의 유진 파마 전략과 비교한 결과입니다. (매매 일치성이 작아 좋아 보이긴 하나 마켓타이밍이 다른 것도 고려해주셔야 합니다.)

 


아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 너무 너무 도움되거나 흡족스러웠다면 후원해주시면 감사하겠습니다.

https://toss.me/hotorch

 

hotorch님에게 보내주세요

토스아이디로 안전하게 익명 송금하세요.

toss.me

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!