Как я могу реализовать функцию в Java, которая выполняет тот же самый расчет, что и функция урожайности Excel (документы). Я посмотрел на спецификацию функции урожайности и попытался реализовать ее сам, но я получаю разные результаты при использовании следующих входов:
Урегулирование: 21/04/2025
Зрелость: 08/12/2027
0.06875
Цена: 94,28
Redemption: 100
Частота: 1
9.499084%. 9.723637 %
Вот my код:
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public static BigDecimal rendementTitre(
LocalDate settlementDate,
LocalDate maturityDate,
BigDecimal taux,
BigDecimal prix,
BigDecimal valeurNominale,
int frequence,
MathContext mc,
BigDecimal tol,
int maxIter
) {
long daysBetween = ChronoUnit.DAYS.between(settlementDate, maturityDate);
BigDecimal years = new BigDecimal(daysBetween).divide(BigDecimal.valueOf(365), mc);
int n = years.multiply(BigDecimal.valueOf(frequence)).setScale(0, RoundingMode.HALF_UP).intValue();
BigDecimal coupon = valeurNominale.multiply(taux).divide(BigDecimal.valueOf(frequence), mc);
// Initial guess
BigDecimal y = taux;
for (int iter = 0; iter < maxIter; iter++) {
BigDecimal f = bondPrice(y, n, coupon, valeurNominale, frequence, mc).subtract(prix, mc);
BigDecimal fPrime = bondPriceDerivative(y, n, coupon, valeurNominale, frequence, mc);
if (fPrime.abs().compareTo(new BigDecimal("1E-10")) < 0) break;
BigDecimal yNew = y.subtract(f.divide(fPrime, mc), mc);
if (y.subtract(yNew).abs().compareTo(tol) < 0) {
System.out.println("Rendement : " + yNew + " YY%");
return yNew.multiply(BigDecimal.valueOf(100)).setScale(6, RoundingMode.HALF_UP); // % avec 6 décimales
}
y = yNew;
}
throw new RuntimeException("La convergence n'a pas été atteinte");
}
private static BigDecimal bondPrice(BigDecimal y, int n, BigDecimal C, BigDecimal V, int f, MathContext mc) {
BigDecimal total = BigDecimal.ZERO;
BigDecimal onePlusRate = BigDecimal.ONE.add(y.divide(BigDecimal.valueOf(f), mc));
for (int i = 1; i
Подробнее здесь: https://stackoverflow.com/questions/795 ... on-results