Воспроизведение результатов Excel YIELD с использованием Strata для облигаций в JAVA - PullRequest
0 голосов
/ 04 мая 2018

При расчете доходности облигации я пытаюсь воспроизвести результаты, рассчитанные с использованием функции YIELD в Excel, с использованием пакета Strata, разработанного OpenGamma. Однако, сравнивая цифры, рассчитанные с использованием Excel и Strata, я замечаю, что есть небольшое расхождение, которое увеличивается, когда продолжительность облигации больше.

Это пример моего расчета в Excel: Расчет Excel

Расчетный результат составляет 6,5%

Когда я делаю тот же расчет в стратах, как таковой:

    DiscountingFixedCouponBondPaymentPeriodPricer paymentPeriodPricer = new DiscountingFixedCouponBondPaymentPeriodPricer();
    DiscountingPaymentPricer discountingPaymentPricer = new DiscountingPaymentPricer();
    DiscountingFixedCouponBondProductPricer pricer = new DiscountingFixedCouponBondProductPricer(paymentPeriodPricer,discountingPaymentPricer);

    LocalDate settlementDate = LocalDate.of(2008, 2, 15);
    LocalDate maturityDate = LocalDate.of(2016,11,15);
    double couponRate = 0.0575;
    double dirtyPrice=0.9504287;

    com.opengamma.strata.basics.currency.Currency bondcurrency = com.opengamma.strata.basics.currency.Currency.of("USD");
    BusinessDayAdjustment businessDayAdj =
            BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, HolidayCalendarIds.USNY );
    PeriodicSchedule definition = PeriodicSchedule.builder()
            .startDate(settlementDate)
            .endDate(maturityDate)
            .businessDayAdjustment(businessDayAdj)
            .frequency(Frequency.P6M)
            .stubConvention(StubConvention.SHORT_INITIAL)
            .rollConvention(RollConventions.EOM)
            .build();
    FixedCouponBond bond = FixedCouponBond.builder()
            .currency(bondcurrency)
            .notional(1)
            .fixedRate(couponRate)
            .accrualSchedule(definition)
            .securityId(SecurityId.of("WHATISTHIS","FOR"))
            .dayCount(DayCounts.THIRTY_360_ISDA)
            .yieldConvention(FixedCouponBondYieldConvention.JP_SIMPLE)
            .legalEntityId(StandardId.of("WHATISTHIS","FOR"))
            .settlementDateOffset(DaysAdjustment.ofBusinessDays(2,HolidayCalendarIds.SAT_SUN))
            .build();

    double yieldOfBond = pricer.yieldFromDirtyPrice(bond.resolve(ReferenceData.standard()),settlementDate,dirtyPrice);
    System.out.println(String.valueOf(yieldOfBond*100));

Напечатанная цифра доходности составляет 6,645978959660144%.

Могу ли я узнать, мог ли я неправильно сконфигурировать какой-либо из параметров, так как функция доходности страт принимает некоторые другие параметры.

Спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Похоже, вы начинаете с чистой цены? попробуйте это:

DiscountingFixedCouponBondProductPricer pricer =
        DiscountingFixedCouponBondProductPricer.DEFAULT;
LocalDate settlementDate = LocalDate.of(2008, 2, 15);
LocalDate startDate = LocalDate.of(2007, 11, 15);
LocalDate maturityDate = LocalDate.of(2016, 11, 15);
double couponRate = 0.0575;
double cleanPrice = 0.9504287;

Currency bondcurrency = Currency.USD;
BusinessDayAdjustment businessDayAdj = BusinessDayAdjustment.of(
        BusinessDayConventions.FOLLOWING, HolidayCalendarIds.USNY);
PeriodicSchedule definition = PeriodicSchedule.builder()
    .startDate(startDate)
    .endDate(maturityDate)
    .businessDayAdjustment(businessDayAdj)
    .frequency(Frequency.P6M)
    .stubConvention(StubConvention.SHORT_INITIAL)
    .rollConvention(RollConventions.DAY_15)
    .build();
FixedCouponBond bond = FixedCouponBond.builder()
    .currency(bondcurrency)
    .notional(1)
    .fixedRate(couponRate)
    .accrualSchedule(definition)
    .securityId(SecurityId.of("WHATISTHIS", "FOR"))
    .dayCount(DayCounts.THIRTY_360_ISDA)
    .yieldConvention(FixedCouponBondYieldConvention.US_STREET)
    .legalEntityId(StandardId.of("WHATISTHIS", "FOR"))
    .settlementDateOffset(DaysAdjustment.ofBusinessDays(2, HolidayCalendarIds.USNY))
    .build();

double dirtyPrice = pricer.dirtyPriceFromCleanPrice(bond.resolve(ReferenceData.standard()), settlementDate, cleanPrice);
double yield = pricer.yieldFromDirtyPrice(bond.resolve(ReferenceData.standard()), settlementDate, dirtyPrice);
System.out.println(String.valueOf(yield * 100d)); 

securityId и legalEntityId используются при взаимодействии с магазинами или справочными и рыночными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...