在JAVA中使用StratforBonds复制excel收益率结果
在计算债券收益率时,我尝试使用OpenGamma开发的Strata软件包复制使用excel的收益率函数计算的结果。然而,对比使用excel和strata计算的数字,我注意到有一个小的差异,随着债券期限的延长,这种差异会增加 这是我在excel中计算的一个示例: 计算结果为6.5% 当我在地层中进行相同的计算时:在JAVA中使用StratforBonds复制excel收益率结果,java,excel,finance,quantitative-finance,Java,Excel,Finance,Quantitative Finance,在计算债券收益率时,我尝试使用OpenGamma开发的Strata软件包复制使用excel的收益率函数计算的结果。然而,对比使用excel和strata计算的数字,我注意到有一个小的差异,随着债券期限的延长,这种差异会增加 这是我在excel中计算的一个示例: 计算结果为6.5% 当我在地层中进行相同的计算时: DiscountingFixedCouponBondPaymentPeriodPricer paymentPeriodPricer = new DiscountingFixed
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%
我想知道我是否错误地配置了任何参数,因为地层屈服函数包含了一些其他参数
谢谢。看来你可能会从一个干净的价格开始?试试这个:
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