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

종목별 랭킹함수 추가

IntelliQuant 2019.08.05 13:33 조회수  313

안녕하세요. 인텔리퀀트 팀입니다!


포트폴리오 구성시 종목별 상대평가를 할 때 동점자 처리 등 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);  
}