안녕하세요. 인텔리퀀트 팀입니다!
포트폴리오 구성시 종목별 상대평가를 할 때 동점자 처리 등 sort함수를 사용하는데 따른 한계를 극복하고 보다 간편하게 평가결과를 얻을 수 있도록 종목별 랭킹함수를 추가했습니다.
랭킹함수에 대한 더 자세한 설명은 이곳 에서 확인하실 수 있습니다.
아래의 코드는 랭킹함수를 전략에 적용한 예제 코드입니다.
// PER function getPER(stock) {
if (stock.getFundamentalNetProfit() === 0) {
return -1000;
}
return 1000 * stock.getMarketCapital() / (stock.getFundamentalNetProfit() * 4); } // PBR function getPBR(stock) { if (stock.getFundamentalTotalEquity() == 0) { return -1000; } return 1000 * stock.getMarketCapital() / stock.getFundamentalTotalEquity(); } // TSM12 function getTSM12(stock) { stock.loadPrevData(0, 15, 0); if (stock.getAdjClose(21) == 0 || stock.getAdjClose(252) == 0) { return 0; } return stock.getAdjClose(21) / stock.getAdjClose(252); } // FactorIndex : factor 지표별 가중치를 설정하기 위한 사용자 정의 객체 var FactorIndex = { per: 1, pbr: 0, tsm12: 1 }; function stockPortfolioBuilder(targetSize) {
var universe = IQStock.filter(stockFilter);
// 랭킹계산 전 팩터의 값들을 미리 setScore를 사용하여 넣어줍니다. for (var i = 0; i < universe.length; i++) { var stock = universe[i]; // universe의 i번째 종목 stock.setScore("per", getPER(stock)) stock.setScore("pbr", getPBR(stock)) stock.setScore("tsm12", getTSM12(stock)) } for (var i = 0; i < universe.length; i++) { var stock = universe[i]; var total_rank = 0; for (var ind in FactorIndex) {
if (FactorIndex[ind] == 0) { continue; } // factor 지표 값이 0이면 계산하지 않고 넘어갑니다. if (ind == "per"){ var per_rank = stock.getRank(universe, "per", RankOrder.ascending); total_rank += FactorIndex[ind]*per_rank; } else if(ind == "pbr"){ var pbr_rank = stock.getRank(universe, "pbr", RankOrder.ascending); total_rank += FactorIndex[ind]*pbr_rank; } else if(ind == "tsm12"){ var tsm12_rank = stock.getRank(universe, "tsm12", RankOrder.descending); total_rank += FactorIndex[ind]*tsm12_rank } } stock.setScore("total_rank", total_rank); } var sortedByRank = universe.slice().sort(function(a,b){return a.getScore("total_rank") - b.getScore("total_rank");}); return sortedByRank.slice(0, targetSize); }