Логика MDURATION должна быть реализована так же, как реализована в Excel.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Логика MDURATION должна быть реализована так же, как реализована в Excel.

Сообщение Anonymous »

  • Мое требование состоит в том, чтобы я хотел получить тот же результат, что и в Excel для функции MDURATION.

    < li>Я написал класс, который имитирует ту же логику, что и MDURATION. Однако он дает результат, который несколько отличается от фактического результата Excel. Но я хочу, чтобы результат был точно таким же, как в Excel.
Будем признательны, если кто-нибудь сможет помочь с решением этой проблемы.
Кроме того, если есть какие-либо библиотеки, которые предоставляют эту функцию «из коробки», напишите здесь, чтобы я мог посмотреть.

Код: Выделить всё

package com.example.mduration;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class BondDurationCalculator1 {

// Define MathContext for high precision and rounding
private static final MathContext mc = new MathContext(15, RoundingMode.HALF_UP);

/**
* Calculates the Modified Duration (MDURATION equivalent in Excel) for a bond.
*
* @param settlement The settlement date of the bond (when the bond is purchased).
* @param maturity   The maturity date of the bond (when the bond matures).
* @param coupon     The annual coupon rate (as a decimal, e.g., 0.08 for 8%).
* @param yield      The bond's annual yield (as a decimal, e.g., 0.09 for 9%).
* @param frequency  The number of coupon payments per year (1 = annual, 2 = semiannual, 4 = quarterly).
* @param basis      The day count basis (0 = 30/360, 1 = actual/actual, 2 = actual/360, 3 = actual/365, 4 = European 30/360).
* @return The modified duration of the bond.
*/
public static BigDecimal calculateMDuration(LocalDate settlement, LocalDate maturity,
double coupon, double yield, int frequency, int basis) {

// Calculate years to maturity based on the day count basis
BigDecimal yearsToMaturity = calculateYearFraction(settlement, maturity, basis);

// Calculate Macaulay Duration
BigDecimal macaulayDuration = calculateMacaulayDuration(coupon, yield, frequency, yearsToMaturity);

// Modified Duration = Macaulay Duration / (1 + (Yield / Frequency))
BigDecimal one = new BigDecimal(1, mc);
BigDecimal yieldPerFrequency = new BigDecimal(yield, mc).divide(new BigDecimal(frequency, mc), mc);
BigDecimal denominator = one.add(yieldPerFrequency, mc);

return macaulayDuration.divide(denominator, mc);
}

/**
* Calculates the fraction of the year between two dates based on the specified day count basis.
*
* @param settlement The settlement date.
* @param maturity   The maturity date.
* @param basis      The day count basis.
* @return The year fraction.
*/
public static BigDecimal calculateYearFraction(LocalDate settlement, LocalDate maturity, int basis) {
long daysBetween = ChronoUnit.DAYS.between(settlement, maturity);

switch (basis) {
case 0: // US (NASD) 30/360
case 4: // European 30/360
return calculate30_360(settlement, maturity);

case 1: // Actual/Actual
return new BigDecimal(daysBetween, mc).divide(isLeapYear(maturity.getYear()) ? new BigDecimal(366, mc) : new BigDecimal(365, mc), mc);

case 2: // Actual/360
return new BigDecimal(daysBetween, mc).divide(new BigDecimal(360, mc), mc);

case 3: // Actual/365
return new BigDecimal(daysBetween, mc).divide(new BigDecimal(365, mc), mc);

default:
throw new IllegalArgumentException("Invalid basis value.");
}
}

/**
* Helper function to calculate Macaulay Duration (a helper method).
*
* @param coupon          The bond's coupon rate.
* @param yield           The bond's yield to maturity.
* @param frequency       The number of coupon payments per year.
* @param yearsToMaturity The total years to maturity.
* @return The Macaulay duration.
*/
public static BigDecimal calculateMacaulayDuration(double coupon, double yield, int frequency, BigDecimal yearsToMaturity) {
BigDecimal macaulayDuration = BigDecimal.ZERO;
BigDecimal sumDiscountedCashFlows = BigDecimal.ZERO;

// Loop through each coupon period
for (int i = 1; i 

Подробнее здесь: [url]https://stackoverflow.com/questions/79033672/mduration-logic-to-be-implemented-in-the-same-way-as-implemented-in-excel[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»