일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 60 : 40
- 결산
- backtest
- 6040
- 현금비중
- 백테스트
- PBR
- 모멘텀
- pandas_datareader
- 영구포트폴리오
- 퀀트킹
- 레버리지
- 마켓타이밍
- 10월 수익인증
- 파이썬
- 코스피 pbr
- 곰발
- 저점매수
- 하락장
- 리벨런싱
- 슬리피지
- 11월 투자
- FinanceDataReader
- Quantking
- Permanent Portfolio
- MDD
- 현금화
- Classic portfolio
- Python
- 퀀트
- Today
- Total
가치투자퀀트
[퀀트킹] 퀀트킹 백테스트 파헤치기 #1 본문
글에 앞서...
저는 퀀트킹님의 1등 추종자 입니다!
이글은 퀀트킹을 까는것이 아닌 투자자 라면 본인의 로직의 한계를 100% 이해 해야한다는 가정으로
퀀트킹 여러분들의 성공 투자를 위해 작성한 글임을 미리 말씀 드립니다.
퀀트킹 백테스트의 수익률을 보면 70% CAGR 에 20% MDD 가 쉽게 보입니다.
당연히 '이게 말이되는 수치인가' 의문점이 드셨을 겁니다.
결론을 말씀 드리면 '이 CAGR 과 MDD 는 불가능합니다'
왜 검증해야 하나요??? 툴이 다 계산해 주는데??
1. 퀀트킹은 월봉 백테스트 툴 입니다
이게 왜 문제가 되지요? 하신다면 우선 우리가 느끼는 MDD와 괴리가 있습니다.
월봉 기준으로 하기 때문에 실제 일단위로 보면 -20% MDD 가 실제로는 -80% 가 될수도 있고 -90%가 될 수도 있습니다. 따라서 여러분의 전략이 -20%라고 해서 "와 내전략은 MDD 가 -20% 밖에 안돼 하방 경직성 짱짱" 이라고 생각하시면 크나큰 오산입니다. 실제 우리가 매매하면서 느끼는 MDD 를 확인하시려면 일봉 종가로 MDD 를 확인 하셔야 합니다.
2. 퀀트킹은 매월 말일 리벨런싱 기준입니다.
"저는 분기 리벨런싱인데요?" 라고 생각하시는 분들도 있겠습니다만, 월리벨이든 연단위 리벨이든 퀀트킹의 백테스트는 매월 말일 종가로 각 종목을 동일비중 리벨런싱을 해줍니다. 그것도 슬리피지 0% 로 말이죠!
아니 말일 동일비중 리벨런싱 효과가 그렇게 큰가요? 네! 잠시후에 보여 드리겠습니다.
3. 우리가 실제 매매하는 시점과 백테스트 시점이 다릅니다.
공지에도 있었습니다만, 퀀트킹 매수시점은 4월 1일 / 5월 18일 / 8월18일 / 11월 18일 입니다.
하지만 백테스트상의 매수시점은 3월31일 / 5월 31일 / 8월 31일 / 11월 31일 입니다.
여기서 실제 매매결과와 백테스트 상의 괴리가 발생할 수 있습니다.
때에 따라서 하루 이틀정도는 늦게 리벨런싱이 이루어 질 수 있기 때문에 4월 2일 / 5월 19일 / 8월 19일 / 11월 19일
기준으로 백테스트 해 보았습니다.
어떻게 검증하나요?
저는 히스토리에 매수한 종목을 기준으로 파이썬 일봉 백테스트를 직접 돌렸습니다.
파이썬을 활용하면 티커를 기준으로 손쉽게 일별 종가를 가져올 수 있습니다.
이를 바탕으로 실제 일 단위로 매매 과정을 파이썬으로 백테스팅 해 보았습니다.
파이썬 코드에 오류는 없나요??
제가 돌린 결과물과 퀀트킹의 결과물을 비교해 보도록 하겠습니다.
시작은 2012 년 3월 종료 시점은 2022년 7월 입니다.
슬리피지는 0%로 설정하였습니다.
아래 전략은 시총 하위 20% 분기 리벨런싱 전략입니다.

다음은 파이썬 월봉 백테스트 결과입니다. (최대한 퀀트킹과 동일하게 설정하였습니다)
*매도수수료 0%로 설정한 이유는 제가 계산하는 방식과 퀀킹님의 방식이 뭔가 좀 다른것 같아 괴리가 발생했기 때문입니다.
슬리피지 0% 월말 동일비중 리벨런싱 수행 (슬리피지 0%)
매수일 3/31, 5/31, 8/31, 11/31 로 설정 백테스트를 수행하였습니다.
매수종목은 퀀트킹 히스토리 종목으로 설정하였습니다 (여기에 미래참조가 있긴 합니다만 이건 어쩔 수 없습니다 ㅎ)
결과를 비교해 보겠습니다.

퀀트킹 결과값 32930.7% (CAGR : 75.2%) vs 백테스트 결과값 32988.97% (CAGR : 75.37%) 으로
0.1% 차이 정도의 정합성을 확인 하였습니다.
*좀더 정확히 월별 수익률을 비교해 보았는데 전체가 동일하였습니다.
*차이는 퀀트킹은 소수점 1자리, 파이썬 코드는 소수점2자리 까지 계산한 차이인 것으로 보여집니다.
따라서 제가 만든 코드는 나름 정확성을 가지고 있다고 판단하였습니다.
보다 현실화된 백테스트 결과는?
제작한 코드를 가지고 아래와 같이 조건을 변경하여 테스트 해보았습니다.
사실 퀀트킹 백테스트에서 슬리피지 계산법이 저와 좀 다른것 같긴 합니다만, 이부분은 따로 퀀트킹님께 질문을 드려보아야 할것 같습니다.
일단 리벨런싱이 이루어지는 날짜에 슬리피지 1% 라면 전체 주식 평가금의 1%를 손실 처리하였습니다.
(실제 퀀트킹 백테스트의 슬리피지1%의 개념은 이보다 더 작은 개념인것으로 보입니다)
결과를 보시죠
|
퀀트킹
|
Py#Original
|
Py#1
|
Py#2
|
Py#3
|
Py#4
|
Py#5
|
Py#6
|
Py#7
|
월말 동일비중 리벨런싱
* O : 매 월말 개별주식 비중을 동일하게 설정 * X : 리벨런싱 없음 |
O
|
O
|
O
|
O
|
O
|
X
|
O
|
O
|
X
|
동일 비중 리벨런싱 슬리피지
* 1% : 리벨런싱 날짜에 전체 자산의 1% 손실처리 |
0%
|
0%
|
0%
|
0%
|
1%
|
0%
|
1%
|
1%
|
0%
|
월말 종가 분기 리벨런싱
* O : 월말 리벨런싱 (3/31, 5/31, 8/31, 11/31) * X1 : 실제 리벨런싱 (4/1, 5/18, 8/18, 11/18) * X2 : 보수적 실제 리벨런싱 (4/2, 5/19, 8/19, 11/19) |
O
|
O
|
X1
|
X2
|
X2
|
X2
|
X2
|
X2
|
X2
|
분기 리벨런싱 슬리피지
* 1% : 리벨런싱 날짜에 전체 자산의 1% 손실처리 * 2% : 리벨런싱 날짜에 전체 자산의 2% 손실처리 |
0%
|
0%
|
0%
|
0%
|
0%
|
0%
|
1%
|
2%
|
2%
|
결과 값
|
|
|
|||||||
CAGR
|
75.30%
|
75.37%
|
73.08%
|
70.93%
|
61.39%
|
67.95%
|
55.08%
|
48.94%
|
55.00%
|
MDD
|
-24.30%
|
-42.76%
|
-42.80%
|
-42.70%
|
-42.70%
|
-42.70%
|
-43.24%
|
-45.50%
|
43.64%
|
MDD 반토막, 주식으로 MDD 줄이는 작업이 의미가 있는가? - 글쎄..
일단 일봉 백테스트 시 CAGR 은 동일하나 실제 MDD 는 두배 정도 확대된 것으로 볼수 있습니다.
이는 우리가 뭘하든 주식비중 100% 인 이상 MDD 50% 반토막 나는것은 각오해야 한다는 의미입니다.
이 결과로 보면 우리가 퀀트킹 백테스트로 MDD 1% 줄이려고 노력하는것이 과연 의미가 있는가 하는 의문이 생깁니다.
리벨런싱의 함정 - 75% CAGR 이 실제 40% 대 로 추락 가능하다.
월말 동일비중 리벨런싱의 슬리피지를 1%만 추가하여도 분기 거래슬리피지 2% 기준으로 40대의 CAGR 로 내려갔습니다.
보수적으로 월말 동일비중 리벨런싱 1% 수수료 + 분기 리벨런싱 3% 슬리피지 계산시 아래와 같습니다.

결과적으로 월말 동일 비중리벨런싱은 상당히 모험적인 부분일 수 있습니다.
(1%가 좀 과하게 잡은 감도 있긴합니다만.. 적어도 분기 리벨런싱 슬리피지 3%는 절대 과하지 않습니다.)
약간 현실과 타협하여 보면 아래와 같습니다.
|
퀀트킹
|
Py#Original
|
Py#9
|
Py#10
|
월말 동일비중 리벨런싱
* O : 매 월말 개별주식 비중을 동일하게 설정 * X : 리벨런싱 없음 |
O
|
O
|
O
|
X
|
동일 비중 리벨런싱 슬리피지
* 1% : 리벨런싱 날짜에 전체 자산의 1% 손실처리 |
0%
|
0%
|
0.50%
|
0.00%
|
월말 종가 분기 리벨런싱
* O : 월말 리벨런싱 (3/31, 5/31, 8/31, 11/31) * X1 : 실제 리벨런싱 (4/1, 5/18, 8/18, 11/18) * X2 : 보수적 실제 리벨런싱 (4/2, 5/19, 8/19, 11/19) |
O
|
O
|
X2
|
X2
|
분기 리벨런싱 슬리피지
* 1% : 리벨런싱 날짜에 전체 자산의 1% 손실처리 * 2% : 리벨런싱 날짜에 전체 자산의 2% 손실처리 |
0%
|
0%
|
3%
|
3%
|
결과 값
|
|
|
||
CAGR
|
75.30%
|
75.37%
|
47.18%
|
48.82%
|
MDD
|
-24.30%
|
-42.76%
|
46.63%
|
45.90%
|
제 결론은
1. 월말 동일 비중 리벨런싱할 경우 슬리피지 0.5% 미만으로 막을 수 있다면 하는게 좋다.
2, 0.5% 미만으로 할 자신 없다면 동일비중 리벨런싱은 독이 될 수 있다. 차리리 안하는게 낮다.
정리!!
- 퀀트킹의 백테스트 상의 MDD 는 월봉 종가의 데이터로 실제로는 훨씬 클 가능성이 존재한다.
실제 일봉 기준 MDD 가 -50% 인 경우라도 MDD 시기가 월말에 있으면 백테스트상의 수치는 높고 MDD 시기가 월초에 있을 경우 매우 낮게 인식될 수 있습니다. - 개인적인 견해로 퀀트킹 백테스트 전략 수립시 MDD 를 낮추는 작업은 과 체적화일 가능성이 매우 높다.
- 소형주는 슬리피지 싸움이다. 백테스트의 CAGR 을 밎지 말자.
결과값의 -20 ~ -30%는 감안하고 시작해야 한다. - 월말 동일비중 리벨런싱은 CAGR 향상에 도움이 되나 슬리피지 감안할 경우 득보다 실이 많을 수 있다.
대략 0.5% 슬리피지가 손익 분기점으로 매매 노력을 생각하면 안하는게 낮다.
'퀀트 투자' 카테고리의 다른 글
가치기반 퀀트 + 모멘텀 전략 검증 (0) | 2022.11.21 |
---|---|
한국 시장 PBR 점검 (분산데이터 분석) (2/2) (0) | 2022.10.04 |
한국 시장 PBR 점검 (매수 타이밍인가) (1/2) (0) | 2022.10.04 |