안녕하세요!
인텔리퀀트 푸른주전자 입니다.
지난 글 "2021년 value 팩터 중 가장 빛나는 성과를 낸 지표 어떤 것일까?" 쓰면서 들었던 생각이
"지표 중에서 지난 한달 동안 수익률이 가장 좋은 지표를 이번 리밸런싱에 이용하면 수익률이 더 좋아 지지 않을까"
라고 생각 했습니다.
즉, PER, PBR, PSR, POR, PCR, PRR 각각의 지표 수익률을 측정하고 이중 가장 수익률이 높았던 지표를
선택해서 그 지표로 뽑힌 종목으로 리밸런싱을 하는 것입니다.
바로, 팩터 로테이션 전략을 구현하는 것입니다.
제가 생각한 코드는
먼저, onDayClose()에서
diffValue[0] = (totalEquity - ReValue)/ReValue;
PER, PBR, PSR, POR, PCR, PRR 각 지표의 수익률을 순차적으로 diffValue 배열에 저장합니다.
팩터 로테이션 전략에서
var pointsort = diffValue.slice().sort(function(a, b) { return b - a; });
var pointsortNUM = pointsort.slice(0, 1);
수익률이 가장 높은 수치를 찾아서 저장하고
for (var i = 0; i < pointsortNUM.length; i++) {
point[diffValue.indexOf(pointsortNUM[i])] = 1;
logger.debug(diffValue.indexOf(pointsortNUM[i]));
}
해당하는 위치에 point 배열에 1을 입력
for (var i = 0; i < diffValue.length; i++) {
if (point[i] != 1)
point[i] = 0;
}
그외 0으로 입력합니다.
for (var i = 0; i < universe.length; i++) {
var stock = universe[i];
stock.setScore("combi_rank",
point[0]*sortedByPer.indexOf(stock)
+ point[1]*sortedByPbr.indexOf(stock)
+ point[2]*sortedByPsr.indexOf(stock)
+ point[3]*sortedByPor.indexOf(stock)
+ point[4]*sortedByPcr.indexOf(stock)
+ point[5]*sortedByPrr.indexOf(stock)
);
}
이런식으로 point 배열에 해당 지표는 1로 활성화, 나머지는 0으로 비활성화 됩니다.
테스트 조건은
2010-01-01~2022-04-29 까지
전체 종목중에서 ETF, 우선주 만 제외하고, 매월 1일 20종목 래밸런싱합니다. (시총, 거래대금 제한 없음)
성과를 보면
단일 지표로 PER의 수익률이 가장 높고, 샤프지수도 높지만
팩터 로테이션 전략이 PER보다 수익률, 샤프지수, MDD 모두 더 좋아지는 것을 알 수 있습니다.
이런, 팩터 로테이션 전략을 응용하면 더 다양한 전략을 구현 할 수 있을 것 같습니다.
예를 들어 단순 PER+PBR+GPoA 전략에서 PER 지표를 다른 지표로 유동적으로 변경하는 전략도 가능하고
아니면 여러 전략들 중에서 기간 수익률이 높은 전략으로 변경하는 전략도 구현 가능 할 것입니다.
정말 활용도가 높은 인텔리퀀트 백테스트입니다. ^^
혹시 이상한 부분이 있으면 말씀해주세요.
감사합니다,