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

getRank를 사용한 정렬이 제대로 이루어지지 않습니다

free 2022.10.11 01:40 조회수  107 추천 1
```
function stockPortfolioBuilder(targetSize) {
    var universe = IQStock.filter(stockFilter);
    
    for(var i=0; i<universe.length; i++) {
        var stock = universe[i];
        if(!stock.getScore("marketcap")) {
            stock.setScore("marketcap", stock.getMarketCapital());
        }
    }

    for(var i=0; i<universe.length; i++) {
        var stock = universe[i];
        var totalRank = 0;

        totalRank += stock.getRank(universe, "marketcap", RankOrder.ascending);
        stock.setScore("totalRank", totalRank);
    }

    var sortedByCap = universe.slice().sort(function(a,b){return a.getScore("totalRank") - b.getScore("totalRank");});
    var res = sortedByCap.slice(0, targetSize);  
    
    var resLog = "";
    for(var i=0; i<res.length; i++) {
        var res_stock = res[i];
        resLog += res_stock.name+'(['+res_stock.getScore("totalRank")+'],cap:'+(res_stock.getMarketCapital(0)/100)+'억,per:'+res_stock.getPER().toFixed(2)+',pbr:'+res_stock.getPBR().toFixed(2)+'), ';
    }

    logger.debug(resLog);

    return res;
}
```

기존에 시가총액을 기준으로 정렬을 하는 부분을 위와 같이 랭킹 함수를 가지고 정렬을 했을 때, 다음과 같이 정렬이 제대로 되지 않는 현상이 있었습니다. 

```
[2000-06-07]
고려산업([1],cap:43.62억,per:-0.76,pbr:0.17),
삼양사우([2],cap:42.41억,per:-1.00,pbr:-1.00),
선진금속([3],cap:41.28억,per:-1.63,pbr:-0.12),
동아정기([4],cap:40.88억,per:-1.00,pbr:-1.00),
롯데칠성우([5],cap:51.84억,per:-1.00,pbr:-1.00),
극동제혁([6],cap:51.21억,per:8.76,pbr:0.61),
지코([7],cap:41.63억,per:-1.45,pbr:1.95),
코오롱건설우([8],cap:59.93억,per:-1.00,pbr:-1.00),
...

```

위 예제를 보면, 시가총액을 기준으로 오름차순 정렬을 했기 때문에 동아정기가 1순위가 되어야 하는데, 고려산업이 1순위라고 나오는 상황입니다.

코드에서 제가 작성한 부분은 totalRank를 기준으로 순서를 재배치 한 것 밖에 없고, 실제로 시가총액을 순위로 결정하는 건 getRank 함수이기 때문에 해당 함수의 순위 결정 방식에 의해서 위와 같은 결과가 나온 것 같은데,,,

제가 getRank 함수를 잘못 이해하고 사용하고 있는걸까요 ??

혹시 비슷한 경험을 하신 분들이 계신지 궁금합니다.

댓글 1
자문자답 : 제가 실수한게 맞네요
여러 계좌 테스트 할 때 퍼포먼스 고려해서 getScore로 이미 스코어가 설정되어 있는 경우를 검사하는데,
다음 포트폴리오 빌드시에도 그게 남아 있나보네요
그 부분을 빼고 매번 setScore를 업데이트 해서 해결했습니다
free 2022.10.11 11:41
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글