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

3. 지표 함수들 작성 예제

푸른주전자 2024.06.26 13:47 조회수  81 추천 1
// 포트폴리오 구성을 위한 stockPortfolio() 함수에서
// 각 지표별 순서와 가중치를 결정.

// *******************************************************************************
// value 팩터 
// PSR
function getPSR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalRevenue() === 0) {
        return -9999;
    }

    var psr = 1000 * stock.getMarketCapital() / (stock.getFundamentalRevenue() * 4);

    return 1/psr;
}

// POR
function getPOR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalOperatingIncome() === 0) {
        return -9999;
    }

    var por = 1000 * stock.getMarketCapital() / (stock.getFundamentalOperatingIncome() * 4);

    return 1/por;
}

// PER
function getPER(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalNetProfit() === 0) {
        return -9999;
    }

    var per = 1000 * stock.getMarketCapital() / (stock.getFundamentalNetProfit() * 4);

    return 1/per;
}

// PER (당기순이익 4분기 합산)
function getPER_4(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalNetProfit() === 0 ||
        stock.getFundamentalNetProfit(1) === 0 ||
        stock.getFundamentalNetProfit(2) === 0 ||
        stock.getFundamentalNetProfit(3) === 0) {
        return -9999;
    }

    var per = 1000 * stock.getMarketCapital() / 
             (stock.getFundamentalNetProfit() +
              stock.getFundamentalNetProfit(1) +
              stock.getFundamentalNetProfit(2) +
              stock.getFundamentalNetProfit(3));

    return 1/per;
}

// PER (지배주주의 당기순이익)
function getPER_PAR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalProfit_ownersOfParent() === 0) {
        return -9999;
    }

    var per = 1000 * stock.getMarketCapital() / 
              (stock.getFundamentalProfit_ownersOfParent() * 4);

    return 1/per;
}

// PER (지배주주의 당기순이익 4분기 합산)
function getPER_4PAR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalProfit_ownersOfParent() === 0 ||
        stock.getFundamentalProfit_ownersOfParent(1) === 0 ||
        stock.getFundamentalProfit_ownersOfParent(2) === 0 ||
        stock.getFundamentalProfit_ownersOfParent(3) === 0) {
        return -9999;
    }

    var per = 1000 * stock.getMarketCapital() / 
             (stock.getFundamentalProfit_ownersOfParent() +
              stock.getFundamentalProfit_ownersOfParent(1) +
              stock.getFundamentalProfit_ownersOfParent(2) +
              stock.getFundamentalProfit_ownersOfParent(3));

    return 1/per;
}

// EV/EBIT 
function getEVEB(stock) { 
    if (stock.getFundamentalEV() === 0) {
        return -9999;
    }
    if (stock.getFundamentalEBIT() === 0) {
        return -9999;
    }
    
    var eveb = 1000 * stock.getFundamentalEV() / (stock.getFundamentalEBIT()); 

    return 1/eveb;
}

// PBR
function getPBR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalTotalEquity() === 0) {
        return -9999;
    }
    
    var pbr = 1000 * stock.getMarketCapital() / (stock.getFundamentalTotalEquity()); 

    return 1/pbr;
}

// PRR (https://www.intelliquant.ai/article/857?forum=0)
function getPRR(stock) {
    if (stock.getMarketCapital() === 0) {
        return -9999;
    }
    if (stock.getFundamentalRnDExpense() === 0) {
        return -9999;
    }

    var prr = 1000 * stock.getMarketCapital() / (stock.getFundamentalRnDExpense() * 4);

    return 1/prr;
}


// *******************************************************************************
// quality 팩터
// ROA
function getROA(stock) {
    if (stock.getFundamentalTotalAsset() === 0) {
        return -9999;
    }

    return 4 * stock.getFundamentalNetProfit() / stock.getFundamentalTotalAsset();
}

// ROE
function getROE(stock) {
    if (stock.getFundamentalTotalEquity() === 0) {
        return -9999;
    }

    return 4 * stock.getFundamentalNetProfit() / stock.getFundamentalTotalEquity();
}

// GPOA
function getGPOA(stock) {
    if (stock.getFundamentalTotalAsset() === 0) {
        return -9999;
    }
   
    return 4*stock.getFundamentalGrossProfit()/stock.getFundamentalTotalAsset();
}

// *******************************************************************************
// Momentum 팩터
function getMom12(stock) {    
    if (stock.getAdjClose() === 0 || stock.getAdjClose(252) === 0) {
        return -9999;
    }
    
    return stock.getAdjClose() / stock.getAdjClose(252);
} 


value 팩터, quality 팩터, momentum 팩터의 지표 함수들을 구현해보았습니다.
이중 value 팩터의 지표 함수들은 각 지표의 정확한 값을 구현한게 아니라 종목별 순서를 나열하기 위해 계산 값의 역으로 리턴했습니다.

PER를 계산할 때 당기순이익 한 분기 값의 연률화로 계산할 수도 있고, 4분기 합산 값으로 계산 할 수도 있으며 또는 당기순이익을 지배주주분으로 계산 할 수도 있습니다. 다른 지표들 또한 이와 같이 다양하게 계산이 될 수 있습니다.

참고로 지배주주분 재무제표는
지배주주분의 자본총계 getFundamentalEquity_ownersOfParent()
지배주주분의 당기순이익 getFundamentalProfit_ownersOfParent()
2가지가 있습니다.
 
이 지표 함수들을 이용하여 각 종목별 순위를 나열하고, 각 지표 함수별 가중치를 결정해 stockPortfolio() 함수에서 전략을 만듭니다. 지표 함수별로 종목 순위 나열과 가중치를 결정하는 것은 stockPortfolio() 함수 작성에서 보여드리겠습니다.


감사합니다.
댓글 0
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글