package org.javamoney.calc.securities; import javax.money.MonetaryAmount; import java.math.BigDecimal; import java.math.MathContext; /** * <img src="http://www.financeformulas.net/Formula%20Images/Bond%20Equivalent%20Yield.gif" /> * <p> The bond equivalent yield formula is used to determine the annual yield on a discount, or zero coupon, bond. * * @author Manuela Grindei * @see http://www.financeformulas.net/Bond_Equivalent_Yield.html */ public final class BondEquivalentYield { /** * Private constructor. */ private BondEquivalentYield() { } /** * Calculates the bond equivalent yield. * * @param faceValue the amount paid at maturity * @param priceAmount the amount originally paid * @param numberOfDaysToMaturity days to maturity * @return the bond equivalent yield */ public static BigDecimal calculate(MonetaryAmount faceValue, MonetaryAmount priceAmount, int numberOfDaysToMaturity) { BigDecimal face = new BigDecimal(faceValue.getNumber().doubleValueExact()); BigDecimal price = new BigDecimal(priceAmount.getNumber().doubleValueExact()); BigDecimal returnOnInvestment = (face.subtract(price)).divide(price, MathContext.DECIMAL64); BigDecimal maturity = BigDecimal.valueOf(365).divide(BigDecimal.valueOf(numberOfDaysToMaturity), MathContext.DECIMAL64); return returnOnInvestment.multiply(maturity); } }