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

할 수 있다 알고투자 503번 - 강환국 슈퍼 퀄리티 전략 업그레이드 (+ 소형주 테스트 추가)

Knuth 2021.04.01 16:36 조회수  3607 추천 8

할 수 있다 알고투자 503번에서 강환국님이 소개하신


강환국 슈퍼 퀄리티 전략 업그레이드 버전을 인텔리퀀트에서 백테스트 해보았습니다.


강환국 슈퍼 퀄리티 전략은 할 수 있다 퀀트투자에서 소개된, "우량주"를 선별하여 투자하는 퀀트 전략입니다.


이 전략은 F-score에서 수익률에 가장 영향이 큰 3개의 지표만을 선별한 "신 F-score"와, 기업의 수익성을 가장 잘 측정하는 지표로 알려진 GP/A (매출총이익 / 총자산)을 활용한 전략입니다.


전략의 골자는 아래와 같습니다


- 신 F-score가 3점인 종목만 필터

   -순이익이 0 이상 (흑자기업)

   -영업현금흐름이 0 이상 (현금흐름 양호 기업)

   -유상증자를 하지 않은 기업

- 위 조건을 만족하는 기업들에 GP/A 순위를 부여

- GP/A 순으로 20-30개 종목을 매수

- 1년 단위 리밸런싱


이상의 전략을 2004년 1월 1일부터 2021년 4월 1일까지 백테스트 해보면 다음과 같은 결과를 얻을 수 있습니다.

이 전략이 소개된 "할 수 있다 퀀트투자" 원문에서는, 이 전략의 기대수익률을 연평균 20%로 소개했었습니다만,

영상에서도 언급되듯 이 전략은 2016년 이후 성과가 그리 좋지 못했기에, 안타깝게도 연평균 16.97% 수준에 그치는 모습을 보여줍니다.

해당 백테스트 자료가 더 궁금하신 분들은 (https://www.intelliquant.co.kr/article/591) 이 글을 참조하시는 것을 권해드립니다 (영상에서 소개한 백테스트 출처가 여기인듯 함)


강환국 슈퍼퀄리티 전략은 신 F-score와 GPA라는 강력한 팩터를 쓰긴 하지만, 팩터를 2개 밖에 쓰지 않았다는 태생적인 한계가 있습니다.


이에 영상에서는 강환국 슈퍼퀄리티 전략에 3개의 퀄리티 지표를 추가한 "강환국 슈퍼퀄리티 업그레이드" 전략을 소개합니다.


강환국 슈퍼퀄리티 업그레이드 전략은 기존 신 F-score와 GPA에 더해, 다음 3개의 지표가 추가됩니다.

- 자산성장률 - 낮을수록(!) 좋음. 자산성장률이 낮은 기업은 배당 / 재투자 등을 한 기업일 확률이 높은 반면, 높은 기업은 부채를 늘렸을 가능성이 큼

- 영업이익 / 차입금 (=안정성) 성장률 - 높을수록 좋음

- 주가변동성 - 낮을수록 좋음 (LowVol 전략)


이상의 3개 지표를 추가한 강환국 슈퍼퀄리티 업그레이드 전략의 골자는 아래와 같습니다.

- 신 F-score가 3점인 종목만 필터

    - 순이익이 0 이상 (흑자기업)

    - 영업현금흐름이 0 이상 (현금흐름 양호 기업)

    - 유상증자를 하지 않은 기업

- 위 조건을 만족하는 기업들에 GP/A, 자산성장률,안정성 성장률, 주가변동성 순위를 부여

- 합산 순위 순으로 20-30개 종목을 매수

- 1년 단위 리밸런싱


이상의 전략을 2004년 1월 1일부터 2021년 4월 1일까지 백테스트 해보면 다음과 같은 결과를 얻을 수 있습니다.



연평균 수익률은 16.97% → 23.76%로 개선되고,

MDD 역시 52.01% → 49.74%로 개선되는 것을 확인할 수 있습니다.

이상의 전략을 할 수 있다 퀀트투자에서 소개된 강환국 슈퍼퀄리티 2.0 (소형주 20% 조건 추가)에 적용하면 아래와 같은 성과를 얻을 수 있습니다


전체 종목 대상 대비, MDD는 49.74% → 56.23%로 소폭 증가했지만,


연평균 수익률은 23.76%에서 46.07%로 무려 2배에 가까운 상승폭을 보이는 것을 확인할 수 있습니다.


역시 팩터 기반 퀀트 전략은 기승전"소형주"다.. 라는 것을 다시 한 번 느끼게 되는 결과였습니다.

물론 현실에선 슬리피지를 감안해야 하기에 저렇게 드라마틱한 수익률을 기대하기는 어려울 것입니다.


+ 참고용으로 소형주 버전 업그레이드 전략의 백테스트 결과와 전략 스크립트를 본문에 첨부했습니다 (라이브에 바로 적용도 가능하니 많이들 참고해주시면 좋을 것 같습니다)

댓글 4
인텔리퀀린인데 감사합니다. 많이 보고 배웠습니다.
박건률 2021.08.15 11:35
좋은 자료 감사합니다. 혹시 해당 알고리즘에서 일 거래량을 필터링으로 추가하려면 어떻게 해야할까요??
정권이내 2021.09.01 17:16
정권이내 님 //

"일 거래량이 일정 수준 이하"인 종목을 거르는 것으로 이해하고 답변드립니다.

stockFilter 함수에

if (stock.getTradingValue() <= 거래량) return false; 

거래량 부분에 원하시는 거래량을 숫자로 기입하시면, 일 거래량이 일정 수준 이하인 종목들을 거를 수 있습니다.
Knuth 2021.09.01 20:52
정권이내 님 //

혹시나 하여 댓글 추가합니다. 인텔리퀀트에서 제공하는 "거래량" 관련 함수는 크게 

getTradingVolume() => 주 단위 일거래량을 가져오는 함수
getTradingValue() => 일 거래대금을 가져오는 함수

댓글에서 질문주신 "일 거래량" 필터의 사용목적이 유동성 확보를 위해 "거래대금"이 일정 수준 이하인 종목들을 거르려는 것으로 이해하고 "일 거래대금"으로 답변을 달아드렸는데요,

혹시 "주 단위 일 거래량"으로 뭔가 필터를 하고 싶으시다면,

if (stock.getTradingVolume() <= 거래량) return false; 

로 필터를 하시면 되겠습니다. 

다만 위에서 적어드린대로, 유동성 확보를 위해 어느정도 활발히 거래가 이루어지는 종목을 필터링 하시는게 목적이라면, 모든 주식에 대해 상대적인 비교 단위로 "발행주식수" 보다는 "거래대금"이 보다 직관적이고 정확한 지표이기에, 거래대금으로 필터링을 하시는 것을 권해드립니다
Knuth 2021.09.03 09:42
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글