package org.javamoney.calc.securities;
import org.javamoney.calc.common.Rate;
import java.math.BigDecimal;
import java.util.List;
/**
* <img src="http://www.financeformulas.net/Formula%20Images/Holding%20Period%20Return%201.gif" />
* <p> The formula for the holding period return is used for calculating the return on an investment over multiple periods.
*
* @author Manuela Grindei
* @see http://www.financeformulas.net/Holding_Period_Return.html
*/
public class HoldingPeriodReturn {
/**
* Private constructor.
*/
private HoldingPeriodReturn() {
}
/**
* Calculates the holding period return.
*
* @param returns the list of returns per periods
* @return the holding period return
*/
public static BigDecimal calculate(List<Rate> returns) {
BigDecimal product = BigDecimal.ONE;
for (Rate rateOfReturn : returns) {
if (rateOfReturn == null) {
throw new IllegalArgumentException("The list of returns cannot contain null elements");
}
product = product.multiply(rateOfReturn.get().add(BigDecimal.ONE));
}
return product.subtract(BigDecimal.ONE);
}
/**
* Calculates the holding period return.
*
* @param periodicRate the return per period
* @param numberOfPeriods the number of periods
* @return the holding period return
*/
public static BigDecimal calculateForSameReturn(Rate periodicRate, int numberOfPeriods) {
if (periodicRate == null) {
throw new IllegalArgumentException("The list of returns cannot contain null elements");
}
if (numberOfPeriods <= 0) {
throw new IllegalArgumentException("The number of periods should be positive");
}
BigDecimal product = BigDecimal.ONE;
final BigDecimal multiplicand = periodicRate.get().add(BigDecimal.ONE);
for (int i = 0; i < numberOfPeriods; i++) {
product = product.multiply(multiplicand);
}
return product.subtract(BigDecimal.ONE);
}
}