$r Rate of return * * @return float * * @since 1.0.0 */ public static function getGeometricMeanReturn(array $r) : float { return Average::geometricMean($r); } /** * Growing Annuity - Future Value * * @param float $P First payment * @param float $r Rate of return * @param float $g Growth rate * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getGrowingAnnuityFV(float $P, float $r, float $g, int $n) : float { return $P * (\pow(1 + $r, $n) - \pow(1 + $g, $n)) / ($r - $g); } /** * Growing Annuity - Payment (PV) * * @param float $PV Present value * @param float $r Rate of return * @param float $g Growth rate * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getGrowingAnnuityPaymentPV(float $PV, float $r, float $g, int $n) : float { return $PV * ($r - $g) / (1 - \pow((1 + $g) / (1 + $r), $n)); } /** * Growing Annuity - Payment (FV) * * @param float $FV Present value * @param float $r Rate of return * @param float $g Growth rate * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getGrowingAnnuityPaymentFV(float $FV, float $r, float $g, int $n) : float { return $FV * ($r - $g) / (\pow(1 + $r, $n) - \pow(1 + $g, $n)); } /** * Growing Annuity - Present Value * * @param float $P First payment * @param float $r Rate of return * @param float $g Growth rate * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getGrowingAnnuityPV(float $P, float $r, float $g, int $n) : float { return $P / ($r - $g) * (1 - \pow((1 + $g) / (1 + $r), $n)); } /** * Growing Perpetuity - Present Value * * @param float $D Dividend or coupon at period 1 * @param float $r Rate of return * @param float $g Growth rate * * @return float * * @since 1.0.0 */ public static function getGrowingPerpetuityPV(float $D, float $r, float $g) : float { return $D / ($r - $g); } /** * Interest Coverage Ratio * * @param float $ebit EBIT * @param float $expense Interest expense * * @return float * * @since 1.0.0 */ public static function getInterestCoverageRatio(float $ebit, float $expense) : float { return $ebit / $expense; } /** * Inventory Turnover Ratio * * @param float $sales Sales * @param float $inventory Inventory * * @return float * * @since 1.0.0 */ public static function getInventoryTurnoverRatio(float $sales, float $inventory) : float { return $sales / $inventory; } /** * Net Present Value * * @param array $C Cash flow ($C[0] = initial investment) * @param float $r Discount rate * * @return float * * @throws \UnexpectedValueException Throws this exception if the length of the array is 0 * * @since 1.0.0 */ public static function getNetPresentValue(array $C, float $r) : float { $count = \count($C); if ($count === 0) { return 0.0; } $npv = -$C[0]; for ($i = 1; $i < $count; ++$i) { $npv += $C[$i] / \pow(1 + $r, $i); } return $npv; } /** * Net Profit Margin * * @param float $income Net income * @param float $sales Sales revenue * * @return float * * @since 1.0.0 */ public static function getNetProfitMargin(float $income, float $sales) : float { return $income / $sales; } /** * Net Working Capital * * @param float $assets Current assets * @param float $liabilities Current liabilities * * @return float * * @since 1.0.0 */ public static function getNetWorkingCapital(float $assets, float $liabilities) : float { return $assets - $liabilities; } /** * Number of Periods - PV & FV * * @param float $FV Future value * @param float $PV Present value * @param float $r Rate per period * * @return float * * @since 1.0.0 */ public static function getNumberOfPeriodsPVFV(float $FV, float $PV, float $r) : float { return \log($FV / $PV) / \log(1 + $r); } /** * Payback Period * * @param float $investment Initial investment * @param float $cash Periodic cash flow * * @return float * * @since 1.0.0 */ public static function getPaybackPeriod(float $investment, float $cash) : float { return $investment / $cash; } /** * Perpetuity * * @param float $D Dividend or coupon per period * @param float $r Discount rate * * @return float * * @since 1.0.0 */ public static function getPresentValueOfPerpetuity(float $D, float $r) : float { return $D / $r; } /** * Number of Periods - PV & FV * * @param float $C Cash flow at period 1 * @param float $r Rate of return * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getPresentValue(float $C, float $r, int $n) : float { return $C / \pow(1 + $r, $n); } /** * PV - Continuous Compounding * * @param float $C Cash flow * @param float $r Rate of return * @param int $t Time * * @return float * * @since 1.0.0 */ public static function getPresentValueContinuousCompounding(float $C, float $r, int $t) : float { return $C / \exp($r * $t); } /** * Present Value Factor * * @param float $r Rate of return * @param int $n Number of periods * * @return float * * @since 1.0.0 */ public static function getPresentValueFactor(float $r, int $n) : float { return 1 / \pow(1 + $r, $n); } /** * Quick Ratio * * @param float $assets Quick assets (current assets - inventory) * @param float $liabilities Current liabilities * * @return float * * @since 1.0.0 */ public static function getQuickRatio(float $assets, float $liabilities) : float { return $assets / $liabilities; } /** * Rate of Inflation * * @param float $newCPI Consumer price index new * @param float $oldCPI Consumer price index old * * @return float * * @since 1.0.0 */ public static function getRateOfInflation(float $newCPI, float $oldCPI) : float { return $newCPI / $oldCPI - 1; } /** * Real Rate of Return * * @param float $nominal Nominal rate * @param float $inflation Inflation rate * * @return float * * @since 1.0.0 */ public static function getRealRateOfReturn(float $nominal, float $inflation) : float { return (1 + $nominal) / (1 + $inflation) - 1; } /** * Receivables Turnover Ratio * * @param float $sales Sales revenue * @param float $receivable Avg. accounts receivable * * @return float * * @since 1.0.0 */ public static function getReceivablesTurnoverRatio(float $sales, float $receivable) : float { return $sales / $receivable; } /** * Receivables Turnover Ratio * * @param float $income Net income * @param float $dividends Dividends * * @return float * * @since 1.0.0 */ public static function getRetentionRatio(float $income, float $dividends) : float { return ($income - $dividends) / $income; } /** * Return on Assets (ROA) * * @param float $income Net income * @param float $assets Avg. total assets * * @return float * * @since 1.0.0 */ public static function getReturnOnAssets(float $income, float $assets) : float { return $income / $assets; } /** * Return on Equity (ROE) * * @param float $income Net income * @param float $equity Avg. stockholder's equity * * @return float * * @since 1.0.0 */ public static function getReturnOnEquity(float $income, float $equity) : float { return $income / $equity; } /** * Return on Investment (ROI) * * @param float $earnings Earnings * @param float $investment Initial investment * * @return float * * @since 1.0.0 */ public static function getReturnOnInvestment(float $earnings, float $investment) : float { return $earnings / $investment - 1; } /** * Simple Interest * * @param float $P Principal * @param float $r Rate * @param int $t Time * * @return float * * @since 1.0.0 */ public static function getSimpleInterest(float $P, float $r, int $t) : float { return $P * $r * $t; } /** * Simple Interest Rate * * @param float $I Interest * @param float $P Principal * @param int $t Time * * @return float * * @since 1.0.0 */ public static function getSimpleInterestRate(float $I, float $P, int $t) : float { return $I / ($P * $t); } /** * Simple Interest Principal * * @param float $I Interest * @param float $r Rate * @param int $t Time * * @return float * * @since 1.0.0 */ public static function getSimpleInterestPrincipal(float $I, float $r, int $t) : float { return $I / ($r * $t); } /** * Simple Interest Principal * * @param float $I Interest * @param float $P Principal * @param float $r Rate * * @return int * * @since 1.0.0 */ public static function getSimpleInterestTime(float $I, float $P, float $r) : int { return (int) \round($I / ($P * $r)); } /** * Relative market share by share * * @param float $ownShare Own market share * @param float $competitorShare Largest competitor market share * * @return float * * @since 1.0.0 */ public static function getRelativeMarketShareByShare(float $ownShare, float $competitorShare) : float { return $ownShare / $competitorShare; } /** * Relative market share by sales * * @param float $ownSales Own sales * @param float $competitorSales Largest competitor sales * * @return float * * @since 1.0.0 */ public static function getRelativeMarketShareBySales(float $ownSales, float $competitorSales) : float { return $ownSales / $competitorSales; } }