커뮤니티
내가 만든 전략들과 지식을 공유하고 토론합니다.

절대적 소형주 vs 절대적 가치주 (최적화 시리즈2)

소포클레스 2021.10.27 17:31 조회수  3502 추천 12

참고사항 : 이 글을 보려면 지난글을 보고 오기 바란다. PIR라는 지표를 쓰기 때문이다. 


지인이 열변을 토하다

대략 4~5년 전이었던가? 지인이 퀀트를 한다고 들었다. 그런데 그 지인은 실망스런 이야기를 하고 있었다. 지인 왈 "수익률을 극대화 하기 위해서는 소형주 효과가 있어야 합니다. 그러기 위해서는 시가총액 기준으로 하위 20% 소형주로 제한해야 합니다. 거기서 나온 소형주로 재무팩터(PBR, PER, PSR, PCR, GP/A)등을 조합한 순위로 TOP 20종목을 뽑아서 투자하면 백테스트에서 복리 60% 이상 나오더군요. 또한 ROE, ROA등의 효율성 지표는 수익률이 좋지 않으니 GP/A를 써야 합니다." 폭포수 같이 말들을 쏟아내고 있던 지인이었다. 열변이었지만, 아주 실망스럽고 잘못된 말이다. 나는 지인이 말하는 순간 틀렸다는 것을 알았지만 논쟁을 하기 싫어서 대응하지 않았다. 


절대적 소형주는 수익률이 극대화 된다?

틀린 점이 두 가지나 된다. 첫번째 틀린점은 "시가총액 하위 20% 로 제한 하면 수익률이 극대화 된다" 이다. 그렇게 하면 제대로 된 우량한 가치주를 발굴할 수 없어서 수익률이 떨어진다.  아래 백테스트를 보면 시가총액 기준으로 하위 20%만 짤라버린 전략(절대적 소형주)은 재무팩터 기준으로 상위20%로 제한한 전략(절대적 가치주)에 비해 연수익률이 18% 이상 떨어지고, 누적 수익률도 1/10 토막 났다. 


하는 일은 같다. 하지만 순서가 다르다

얼핏보면 하는 일은 같아보인다. 소형주 중에서 가치주를 뽑는 것과, 가치주 중에 소형주를 뽑는 것은 비슷해 보이지만 큰 차이가 있다. 절대적 소형주 전략으로 투자하면 소외되어 있지만 반짝 반짝 빛나는 중형 가치주에게 기회조차 주어지지 않는다.  이에 반해 절대적 가치주는 극심하게 저평가 되었는 중형 가치주에게 투자기회가 주어진다. 심지어 대형주도 저평가 되어있고(PBR), 우량하고(ROA), 성장성이 높다면(PIR) 포함될 수 있다.    


ROA는 다른 재무팩터에 비해 수익률이 나쁘다? 

아래 백테스트 전략은 ROA를 사용했다. 연수익률이 70%가 넘는데 나쁜가? 나쁘다는 사람도 있을텐데, 그렇다면 ROA 효과를 극대화 하기 위해 공유한 스크립트에서 PIR을 빼고 테스트 해보기 바란다. 아마도 수익률이 더 올라갈 것이다.  ROA는 절대 무시하면 안되는 지표이다. "내가 사업을 하기 위해 이 만큼의 자금을 투입하면 내게 떨어지는 이익은 얼마인가?" 여기에 만족하는 지표는 ROA가 가장 적당하다.


ROE에 대해서는 지인의 말에 동의한다. 데이터를 왜곡하기 때문이다. 예를들어 실재로 투입한 자산은 100억(자본금 50억 + 부채50억)이다. 그런데 자본금 50억만 투자해도 똑같은 이익이 나온다고 착각하게 만들기 때문에 문제가 있는 팩터이다. 실제로 투입한 자산은 100억인데 50억만 투자해도 똑같은 이익이 Return 된다고? 동의하기가 힘들다. ROE가 정당화 되려면 부채가 없는 회사이거나, 이자비용 만큼의 이자수익이 있어야 한다. 


다른 재무팩터로 테스트해도 이렇게 되나?

그렇다. 여기서 사용한 PBR, ROA, PIR을 제외한 다른 지표로 테스트 해도 비슷한 결과가 나온다. 절대적 가치주가 절대적 소형주를 이길 확률은 80%~ 90%  정도였다. 


결론

한국에서 소형주로 퀀트를 하는 사람들에게 당부한다. 시가총액 하위20% 제한해서 투자하기 전에, 항상 절대적 가치주와 수익률을 비교해보길 바란다. 당신의 소중한 돈이 연수익률 18% 씩 계속해서 손해를 봐서야 되겠는가?  시가총액으로 소형주를 제한하면 십중팔구(80~90% 확률로) 절대적 가치주에 비해 손해를 보게 된다.
   

PS : 글을 가져가서 이용해도 좋지만, 이 내용으로 대중에게 글을 쓰거나 방송을 할 경우 출처를 밝혀주기 바란다.

댓글 26
좋은 내용 감사합니다.
푸른주전자 2021.10.27 17:53
저역시 당연하다고 믿었던 내용들이였는대..이렇게 증명까지 해주시니 투자에 많은 도움에 될거 같습니다. 
감사합니다. 
GDragon 2021.10.27 20:26
푸른주 전자님 감사드립니다 
소포클레스 2021.10.27 23:30
GDragon님 도움이 된다면 다행입니다 ^^
소포클레스 2021.10.27 23:31
매우매우 훌륭합니다! 응용 어떻게 해봐야될지 두근거리네요
슈퍼공돌맨 2021.10.28 14:49
항상 좋은 글 써주셔서 감사합니다. 
외람된 말씀이지만, 혹시 MDD를 줄이기 위해 따로 하시는 최적화나 방법들이 있을까요?  알려주시면 감사하겠습니다!
이현준 2021.10.28 15:14
'절대적 가치주'의 경우, 먼저 per, pbr등의 지표로 종목을 뽑은 후 그중에서 규모가 작은 종목들을 골라내는 건가요?
그럼 처음 per, pbr등으로 종목을 뽑을때 몇개나 뽑으시는건가요?
LimSung Hyun 2021.10.28 17:26
슈퍼 공동맨님 감사드립니다^^ 좋은 성과 거두세요
소포클레스 2021.10.28 17:57
 이현준님 안녕하세요. koa55님께서 작성한글을 참고하세요. https://www.intelliquant.co.kr/article/563?forum=8
이것보다 더 좋은 것이 있긴 하지만, 위의 글에 있는 데로 mdd 13%면 훌륭하다고 생각합니다. 
소포클레스 2021.10.28 18:14
LimSung Hyun 님 안녕하세요. 말씀하신대로 가치주중 제일 상위 20% 를 먼저 뽑고, 그 중에서 소형주를 뽑습니다. 소스를 볼 수 있게 풀어놨으니 보시면 됩니다.  백테스트시 20.30,50종목 으로 테스트 하였습니다. 성과지표 탭을 눌러서 확인하시면 됩니다.
소포클레스 2021.10.28 18:17
블록코딩으로 비슷한 전략을 짜볼수 있을까요? 전에 팩터유니버스로 50종목, 100종목을 팩터로 뽑아서 유니버스를 만든 적은 있는데, 퍼센티지 비율로 유니버스를 만들 생각은 못해봤네요
LimSung Hyun 2021.10.28 20:55
제가 블럭코딩은 잘 모릅니다. 다른 분들이 도움을 주셨으면 합니다 
소포클레스 2021.10.28 20:59
코드관련 질문드릴게 몇가지 있습니다
1. 리밸런싱날짜와 관련된 코드에서 날짜가 딱히 명시가 되어 있지 않은데 왜 1일로 리밸런싱이 되는건가요?
2. 다음 코드 의미가 뭔지 알고 싶습니다
function port_Value(universe, stock_number) {
    var sortedByroa    = universe.slice().sort( function(a, b) { return roa(b)  - roa(a);   }); 
    var sortedBybp     = universe.slice().sort( function(a, b) { return bp(b)   - bp(a);    });     
    var sortedBypir    = universe.slice().sort( function(a, b) { return pir(b)  - pir(a);   });     
    
위에서 return pir(b) - pir(a)를 해준 이유가 뭔지 알수 있을까요? 그리고 function에서 매개변수를 a, b 두개를 취한 이유도 알고 싶습니다.

3. 다음 코드에서 시장 모멘텀 관련 내용이 들어갔는데 이 부분이 왜 들어갔는지 알고싶습니다
//시장 절대 모멘텀 측정 (1년)
function Momentum_Universe(Universe) {
    var momentumPort = Universe.slice().filter(function(stock) {
        stock.loadPrevData(0, 16, 0);
        if (stock.getAdjClose(0) >= stock.getAdjClose(250) ) { return true; }     // 1년 모멘텀 음수 제외 혹은 1년 이내 신규종목 제외
        return false; } );          
    return momentumPort.length/Universe.length;

위 코드에서 stock.loadPrevData(0, 16, 0) 부분이 있는데 이것의 의미도 질문드립니다

한번에 너무 많이 질문드려서 죄송합니다; 제가 자바스크립트에 문외한이라서..;
LimSung Hyun 2021.10.29 11:47
임성현님 답변 드리겠습니다. 
1. initialize 초기화 함수에 마지막에 월리발란싱을 설정했습니다. 그리고 onDayClose 함수에서 처음에 호출해서 사용합니다.
2.우량하고(roa), 저평가되었고(bp = pbr을 1로 나눔), 성장성 있는(pir) 회사들의 랭킹을 3가지로 매겨서 제일 큰순으로 TOP 20개를 뽑는 과정입니다. b-a로 하면 큰것 부터 나오게 됩니다. 
3.다음 강의에 들어갈 내용인데 미리 들어간 것입니다. 실행할때 사용하지 않기 때문에 신경 안써도 됩니다. 
그리고 저도 자바스크립트 초보 입니다 ^^
소포클레스 2021.10.29 13:03
질문드릴게 있는데요

function port_Small(universe, stock_number) {
    var sortedBySmallCap = universe.slice().sort(function(a,b){return cap(a) - cap(b);});  // 종목들을 시가총액 값의 오름차순으로 정렬
    var smallCap = sortedBySmallCap.slice(0, Math.floor(sortedBySmallCap.length/5));       // 시가총액 하위 20% 
    var sortedByroa    = smallCap.slice().sort( function(a, b) { return roa(b)  - roa(a);   }); 
    var sortedBypir    = smallCap.slice().sort( function(a, b) { return pir(b)  - pir(a);   }); 
    var sortedBypsr    = smallCap.slice().sort( function(a, b) { return psr(b)  - psr(a);   }); 
    
    smallCap.forEach( function(stock) {
        stock.setScore('rank_sum',  
                       + sortedByroa.indexOf(stock)  
                       + sortedBypir.indexOf(stock)  
                       + sortedBypsr.indexof(stock)
                      ); 
    });

    var Port_Rank = smallCap.slice().sort( function(a, b) {
        return a.getScore('rank_sum') - b.getScore('rank_sum');  });  
    return  Port_Rank.slice(0, stock_number );    
}


위 코드에서 psr이란 팩터를 추가해서 새로이 전략을 짜려고 해봤는데요. 아래같은 에러가 뜨네요;

sortedByprr.indexof is not a function in <eval> at line number 71

물론 psr에 대해 정의해놓은 상태입니다.

function psr(stock) { 
    return ( stock.getFundamentalRevenue()  )/ stock.getMarketCapital(); }
LimSung Hyun 2021.10.30 16:06
임승현님 안녕하세요. 
에러 내용을 보면 psr이 아니라 prr 함수가 없는 것 같습니다. 71라인 으로 가보세요.

그리고 앞으로 오류처리와 같은 개인적인 코딩자문은 어려우니 이해바랍니다. 프리미엄 가입하시면 인텔리퀀트에서 개인적인 코딩자문을 받으실 수 있습니다. 인텔리퀀트에서 일대일로 코딩자문을 받는걸 추천드립니다. 
소포클레스 2021.10.31 14:31
좋은 글 공유 감사합니다. 저도 지인분처럼 소형주 -> 저평가로 종목 선정을 하곤 했는데 저평가 -> 소형주로 해볼 생각은 해보질 못했네요 ㅎㅎ; 소형주 위주로 전략을 짜다보니 알짜 중형주를 놓치는 것과 종목 수를 무한정 늘릴 수 없는게 아쉬웠는데 이 아이디어로 해보면 보다 효과적이고 유연한 전략을 만들 수 있을 것 같네요. 다시 한번 좋은 인사이트 공유해주셔서 감사합니다!
Mota 2021.10.31 20:21
Mota님 안녕하세요. 말씀하신대로 해보시면 좋은 성과 기대됩니다^^
소포클레스 2021.11.01 00:29
좋은 인사이트 공유 감사합니다.
Europa 2021.11.02 15:49
Europa님 또뵙네요. 감사합니다. 참 제가 제일 좋아하는 jazz 곡이 Gato barbieri의 Europa 입니다^^
소포클레스 2021.11.02 19:06
큰가르침 받고 갑니다
정말 감사합니다 
funk0 2021.11.03 06:56
funk0님 처음뵙겠습니다. 도움이 된다면 다행입니다.
소포클레스 2021.11.03 08:31
좋은 인사이트 고맙습니다. 저평가->소형주! 달리 생각해보게 되네요.
칸트 2021.12.15 18:58
칸트님 오랜만에 뵙습니다. 감사합니다^^
소포클레스 2021.12.15 19:38
소형주 중에서 가치주를 뽑는 것과, 가치주 중에 소형주를 뽑는 것은 비슷해 보이지만 큰 차이가 있다.
전자의 경우 무럭무럭 자라날 수 있는 튼튼한 새싹을 미리 잘라 버리는 경우가 생기겠네요.
정말 좋은 내용이네요~
데이빗 2022.05.03 19:20
데이빗님 감사드립니다^^
소포클레스 2022.05.04 22:44
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글