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

함수 연습시 계산값 로그 문의

칸트 2021.12.10 18:16 조회수  173 추천 1

함수 계산을 연습 중에 있습니다.


제가 계산하는 값들을 (다를 것 같아) 확인하고 싶어서,

기본 스크립트 샘플에 아래와 같이 함수를 넣어서 그 값들을 비교해보려고 합니다.


function ROE(stock) { stock.loadPrevData(1,6,0);

   return ( (stock.getFundamentalProfit_ownersOfParent() + stock.getFundamentalProfit_ownersOfParent(1)+

           stock.getFundamentalProfit_ownersOfParent(2) + stock.getFundamentalProfit_ownersOfParent(3) )

           / stock.getFundamentalEquity_ownersOfParent() ) *100 ; }



function ROE1(stock) { stock.loadPrevData(1,6,0);

                     for(var i=0; i < 4; i++) {

                         var profit = stock.getFundamentalProfit_ownersOfParent(i);

                         var ownerprofit = stock.getFundamentalProfit_ownersOfParent(0);

                         if (profit < 0 || ownerprofit < 0) { return 0;}

                         var roe = profit / ownerprofit ;

                         return roe;

                     } }


포트폴리오빌더 안에

logger.debug( stock.name + "   " + 'ROE'+ ROE(stock).toFixed(1) + 'ROE1' + ROE1(stock).toFixed(1));

이렇게 로그를 넣었는데 출력이 안 되네요.


또, 전략을 돌려보지 않고도 그냥 간단하게 함수의 계산된 값들을 확인해보는 방법이 있을까요?

고맙습니다.


댓글 9
올려 주신 코드를 복사해서 해 봤는데, 저는 출력이 잘 되는 것 같습니다.
혹시.... 포트폴리오 빌더 안의 어느 부분에 로그출력문을 넣으셨나요? 
혹시라도 logger.debug(...) 문이 return 보다 나중에 있다거나 하면 출력이 안 될 것 같은데요.. 또는 어떤 다른 이유이든 로그 출력문으로 실행 순서가 오지 않았거나 해서 출력이 안 된 것이 아닐까 싶습니다.
Joseph 2021.12.13 19:06
function stockPortfolioBuilder(targetSize) {
    var universe = IQStock.filter(stockFilter);
    var sortedByPer = universe.slice().sort(function(a,b){return getPER(a) - getPER(b);}); 
    var sortedByRoe = universe.slice().sort(function(a,b){return ROE(b) - ROE(a) ;});
    var sortedByRoe1 = universe.slice().sort(function(a,b){return ROE1(b) - ROE1(a) ;});

universe.forEach( function(stock) {
        stock.setScore('rank_sum', 
                       sortedByPer.indexOf(stock)
                       + sortedByRoe.indexOf(stock) 
                       //+ sortedByRoe1.indexOf(stock) 
                       ); 
    });
    
    var Port_Rank = universe.slice().sort( function(a, b) {
        return a.getScore('rank_sum') - b.getScore('rank_sum');  
    
    logger.debug(stock.name + "   " + 'ROE'+ ROE(stock).toFixed(1) + 'ROE1' + ROE1(stock).toFixed(1));
    });  
    
    return Port_Rank.slice(0, targetSize);  
}

이렇게 추가해서 보았습니다.
칸트 2021.12.14 16:30
이렇게 수정하시면 됩니다.

function stockPortfolioBuilder(targetSize) {
    var universe = IQStock.filter(stockFilter);
    var sortedByPer = universe.slice().sort(function(a,b){return getPER(a) - getPER(b);}); 
    var sortedByRoe = universe.slice().sort(function(a,b){return ROE(b) - ROE(a) ;});
    var sortedByRoe1 = universe.slice().sort(function(a,b){return ROE1(b) - ROE1(a) ;});

universe.forEach( function(stock) {
        stock.setScore('rank_sum', 
                       sortedByPer.indexOf(stock)
                       + sortedByRoe.indexOf(stock) 
                       //+ sortedByRoe1.indexOf(stock) 
                       );     
    });    
    
    var Port_Rank = universe.slice().sort( function(a, b) {
        return a.getScore('rank_sum') - b.getScore('rank_sum');  
    });     
    
    for (var i = 1; i < Port_Rank.length; i++)
        logger.debug(Port_Rank[i].name + "   " + 'ROE'+ ROE(Port_Rank[i]).toFixed(1) + 'ROE1' + ROE1(Port_Rank[i]).toFixed(1));
    
    return Port_Rank.slice(0, targetSize);  
}
푸른주전자 2021.12.14 16:51
푸른주전자님 고맙습니다. stock을 유니버스명(Port_Rank)으로 바꿔야 하는군요.
그런데, 실제 담기는 포트폴리오(10종목)의 종목들이 로그 되는게 아니고, 전종목이 뜨네요. ㅠㅠ
칸트 2021.12.14 17:37
칸트님, 조세프님이 지적했던것처럼 리턴 뒤쪽에 로깅을 둔 것이 출력이 안되었던 직접적인 이유. 그리고 푸른주전자님이 지적한것에서 10개 종목만 출력하려면 Port_Rank.length를 targetSize로 바꿔주시면 됩니다.
Europa 2021.12.14 20:33
Europa 님 말씀처럼 for문에 Port_Rank.length를 targetSize로 변경하시면 됩니다
그리고, 제가 위문장에 실수한게 있는데 for문 var i = 0으로 정정하셔야 됩니다.
아래와 같습니다.
for (var i = 0; i < targetSize; i++)
        logger.debug(Port_Rank[i].name + "   " + 'ROE'+ ROE(Port_Rank[i]).toFixed(1) + 'ROE1' + ROE1(Port_Rank[i]).toFixed(1));
푸른주전자 2021.12.15 11:06
그렇게 해도 안 되네요. ㅎㅎ 
하여튼 성심으로 답변주신 요셉님, 유로파님, 푸른주전자님 모두 고맙습니다.
칸트 2021.12.15 14:24
function stockPortfolioBuilder(targetSize) {
    var universe = IQStock.filter(stockFilter);
    var sortedByPer = universe.slice().sort(function(a,b){return getPER(a) - getPER(b);}); 
    var sortedByRoe = universe.slice().sort(function(a,b){return ROE(b) - ROE(a) ;});
    var sortedByRoe1 = universe.slice().sort(function(a,b){return ROE1(b) - ROE1(a) ;});

universe.forEach( function(stock) {
        stock.setScore('rank_sum', 
                       sortedByPer.indexOf(stock)
                       + sortedByRoe.indexOf(stock) 
                       //+ sortedByRoe1.indexOf(stock) 
                       );     
    });    
    
    var Port_Rank = universe.slice().sort( function(a, b) {
        return a.getScore('rank_sum') - b.getScore('rank_sum');  
    });     
    
   for (var i = 0; i < targetSize; i++)
        logger.debug(i+1 + " : " + Port_Rank[i].name + "   " + 'ROE'+ ROE(Port_Rank[i]).toFixed(1) + 'ROE1' + ROE1(Port_Rank[i]).toFixed(1));
    
    return Port_Rank.slice(0, targetSize);  
}

이렇게 해보세요.
돌아가는거 확인하고 올립니다.
꼭 되어야 합니다.
푸른주전자 2021.12.15 14:51
푸른주전자님 고맙습니다. 이제 되네요. ㅎㅎㅎ
여러 분들의 말씀하신대로 결론은, 로그(logger.debug)는 리턴 이전에 해야 하며,
유니버스의 전체 객체의 지표를 보려면 for문으로 .length를 설정하고,
포트폴리오에 담긴 지표들을 보려면 for문으로 빌더의 인자(여기에선 targetSize)를 지정하는거네요.
말로는 쉬운데.. ㅎㅎ 참 헤맸네요. 속은 시원하네요. 제가 쓴 함수식이 맞는지 점검도 되고..

참, 본문 ROE1의 for문은 오류이니, 저같은 초보분들은 참고하시면 안 됩니다. ^^;
어서 코로나가 풀려서 대면강좌도 다시 열리고, 유투브 강좌도 나와서 인텔리퀀트가 더 알려지면 좋겠습니다.
칸트 2021.12.15 17:58
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글