According to Bloomberg the INT_RATE_FUT_END_DT value for EDGF17 is 2017-04-18 and EDG17 is 2017-05-17 however the following test case seems to suggest that Strata thinks the second date is 2017-05-15 which leads to the situation where you cannot fit a USD 3M curve as of 2017-02-09 with both 3M LIBOR and EDG17 in the curve.
@Test
public void testCurveNodes() {
final LocalDate valuationDate = LocalDate.of(2017, 2, 9);
final ReferenceData referenceData = ReferenceData.standard();
final IborFixingDepositCurveNode fixing = IborFixingDepositCurveNode.of(
IborFixingDepositTemplate.of(IborIndices.USD_LIBOR_3M),
QuoteId.of(StandardId.of("Bloomberg-Ticker", "US0003 Index"), FieldName.of("VALUE"))
);
final IborFutureCurveNode edf7 = IborFutureCurveNode.of(
IborFutureTemplate.of(YearMonth.of(2017, 1), ImmutableIborFutureConvention.of(IborIndices.USD_LIBOR_3M, DateSequences.MONTHLY_IMM)),
QuoteId.of(StandardId.of("Bloomberg-Ticker", "EDF17 Index"), FieldName.of("MID"))
);
final IborFutureCurveNode edg7 = IborFutureCurveNode.of(
IborFutureTemplate.of(YearMonth.of(2017, 2), ImmutableIborFutureConvention.of(IborIndices.USD_LIBOR_3M, DateSequences.MONTHLY_IMM)),
QuoteId.of(StandardId.of("Bloomberg-Ticker", "EDG17 Index"), FieldName.of("MID"))
);
assertEquals(LocalDate.of(2017, 5, 15), fixing.date(valuationDate, referenceData));
assertEquals(LocalDate.of(2017, 4, 18), edf7.date(valuationDate, referenceData));
assertEquals(LocalDate.of(2017, 5, 17), edg7.date(valuationDate, referenceData));
}
Is this expected behavior? e.g.
fixing.date(LocalDate.of(2017, 2, 15), referenceData) returns 2017-05-17
but
IborIndices.USD_LIBOR_3M.calculateMaturityFromEffective(LocalDate.of(2017, 2, 15), referenceData) returns 2017-05-15