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