// 포트폴리오 구성을 위한 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() 함수 작성에서 보여드리겠습니다.
감사합니다.