public static final long getMonthsDifference(Date date1, Date date2) { YearMonth m1 = YearMonth.from(date1.toInstant()); YearMonth m2 = YearMonth.from(date2.toInstant()); return m1.until(m2, ChronoUnit.MONTHS) + 1; }
private static long getEpochMonth(YearMonth yearMonth){ return EPOCH_YEAR_MONTH.until(yearMonth, ChronoUnit.MONTHS); }
public static void main(String[] args) { test("June, 1999", "April, 2002"); } private static void test(String fromMonthYear, String toMonthYear) { DateTimeFormatter monthYearFormat = DateTimeFormatter.ofPattern("MMMM, uuuu"); YearMonth from = YearMonth.parse(fromMonthYear, monthYearFormat); YearMonth to = YearMonth.parse(toMonthYear , monthYearFormat); long months = from.until(to, ChronoUnit.MONTHS); System.out.printf("%d years and %d months%n", months / 12, months % 12); }
private double numberOfMonths(YearMonth month) { return YearMonth.from(valuationDate).until(month, MONTHS); }
private DoubleArray buildNodeTimes(LocalDate valuationDate, CurveMetadata metadata) { if (metadata.getXValueType().equals(ValueType.YEAR_FRACTION)) { return DoubleArray.of(getParameterCount(), i -> { LocalDate nodeDate = ((DatedParameterMetadata) metadata.getParameterMetadata().get().get(i)).getDate(); return getDayCount().get().yearFraction(valuationDate, nodeDate); }); } else if (metadata.getXValueType().equals(ValueType.MONTHS)) { return DoubleArray.of(getParameterCount(), i -> { LocalDate nodeDate = ((DatedParameterMetadata) metadata.getParameterMetadata().get().get(i)).getDate(); return YearMonth.from(valuationDate).until(YearMonth.from(nodeDate), MONTHS); }); } else { throw new IllegalArgumentException("Metadata XValueType should be YearFraction or Months in curve definition"); } }
public void value_multiplicative() { InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_MULTIPLICATIVE_DEF); for (int i = 1; i < TEST_MONTHS.length; i++) { double nbMonths = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS); double valueComputed = curveComputed.yValue(nbMonths); int x = (int) ((nbMonths + 12) % 12); double valueNoAdj = EXTENDED_CURVE_2.yValue(nbMonths); double adj = SEASONALITY_MULTIPLICATIVE_COMP_2.get(x); double valueExpected = valueNoAdj * adj; assertEquals(valueExpected, valueComputed, TOLERANCE_VALUE); } }
public void test_value() { for (int i = 0; i < TEST_MONTHS.length; i++) { double valueComputed = INSTANCE.value(TEST_OBS[i]); YearMonth fixingMonth = TEST_OBS[i].getFixingMonth(); double valueExpected; if (USCPI_TS.containsDate(fixingMonth.atEndOfMonth())) { valueExpected = USCPI_TS.get(fixingMonth.atEndOfMonth()).getAsDouble(); } else { double x = YearMonth.from(VAL_DATE).until(fixingMonth, MONTHS); valueExpected = CURVE_INFL.yValue(x); } assertEquals(valueComputed, valueExpected, TOLERANCE_VALUE, "test " + i); } }
public void value_additive() { InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF); for (int i = 1; i < TEST_MONTHS.length; i++) { double nbMonths = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS); double valueComputed = curveComputed.yValue(nbMonths); int x = (int) ((nbMonths + 12) % 12); double valueNoAdj = EXTENDED_CURVE_2.yValue(nbMonths); DoubleArray seasonalityAdditiveCompounded = seasonalityCompounded(VAL_DATE_2, LAST_FIX_MONTH_2, SEASONALITY_ADDITIVE, (v, a) -> v + a); double adj = seasonalityAdditiveCompounded.get(x); double valueExpected = valueNoAdj + adj; assertEquals(valueExpected, valueComputed, TOLERANCE_VALUE); } }
public void test_value_futfixing() { for (int i = 0; i < TEST_MONTHS.length; i++) { double valueComputed = INSTANCE_WITH_FUTFIXING.value(TEST_OBS[i]); YearMonth fixingMonth = TEST_OBS[i].getFixingMonth(); double valueExpected; if (fixingMonth.isBefore(YearMonth.from(VAL_DATE_2)) && USCPI_TS.containsDate(fixingMonth.atEndOfMonth())) { valueExpected = USCPI_TS.get(fixingMonth.atEndOfMonth()).getAsDouble(); } else { double x = YearMonth.from(VAL_DATE_2).until(fixingMonth, MONTHS); valueExpected = CURVE_INFL2.yValue(x); } assertEquals(valueComputed, valueExpected, TOLERANCE_VALUE, "test " + i); } }
private static DoubleArray seasonalityCompounded( LocalDate valDate, YearMonth fixingMonth, DoubleArray seasonality, DoubleBinaryOperator adjustmentFunction) { double nbMonths = YearMonth.from(valDate).until(fixingMonth, MONTHS); double[] seasonalityCompoundedArray = new double[12]; int lastMonthIndex = fixingMonth.getMonth().getValue() - 2; seasonalityCompoundedArray[(int) ((nbMonths + 12 + 1) % 12)] = seasonality.get((lastMonthIndex + 1) % 12); for (int i = 1; i < 12; i++) { int j = (int) ((nbMonths + 12 + 1 + i) % 12); seasonalityCompoundedArray[j] = adjustmentFunction.applyAsDouble( seasonalityCompoundedArray[(j - 1 + 12) % 12], seasonality.get((lastMonthIndex + 1 + i) % 12)); } return DoubleArray.ofUnsafe(seasonalityCompoundedArray); }
public void test_value_parameter_sensitivity() { for (int i = 0; i < TEST_MONTHS.length; i++) { YearMonth fixingMonth = TEST_OBS[i].getFixingMonth(); if (!USCPI_TS.containsDate(fixingMonth.atEndOfMonth())) { InflationRateSensitivity ptsExpected = (InflationRateSensitivity) InflationRateSensitivity.of(TEST_OBS[i], 1d); CurrencyParameterSensitivities psComputed = INSTANCE.parameterSensitivity(ptsExpected); double x = YearMonth.from(VAL_DATE).until(fixingMonth, MONTHS); UnitParameterSensitivities sens1 = UnitParameterSensitivities.of(CURVE_INFL.yValueParameterSensitivity(x)); CurrencyParameterSensitivities psExpected = sens1.multipliedBy(ptsExpected.getCurrency(), ptsExpected.getSensitivity()); assertTrue(psComputed.equalWithTolerance(psExpected, TOLERANCE_DELTA), "test " + i); } } }
public void parameter_sensitivity_additive() { InflationNodalCurve curve = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF); double shift = 1.0E-2; for (int i = 1; i < TEST_MONTHS.length; i++) { double nbMonths = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS); UnitParameterSensitivity psComputed = curve.yValueParameterSensitivity(nbMonths); for (int j = 0; j < TIMES.size(); j++) { double[] valuePM = new double[2]; for (int pm = 0; pm < 2; pm++) { DoubleArray shiftedValues = VALUES.with(j, VALUES.get(j) + (1 - 2 * pm) * shift); InterpolatedNodalCurve intCurveShifted = InterpolatedNodalCurve.of(METADATA, TIMES, shiftedValues, INTERPOLATOR); InflationNodalCurve seaCurveShifted = InflationNodalCurve.of(intCurveShifted, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF); valuePM[pm] = seaCurveShifted.yValue(nbMonths); } assertEquals(psComputed.getSensitivity().get(j), (valuePM[0] - valuePM[1]) / (2 * shift), TOLERANCE_DELTA); } } }
public void test_value_parameter_sensitivity_futfixing() { for (int i = 0; i < TEST_MONTHS.length; i++) { YearMonth fixingMonth = TEST_OBS[i].getFixingMonth(); if (!fixingMonth.isBefore(YearMonth.from(VAL_DATE_2)) && !USCPI_TS.containsDate(fixingMonth.atEndOfMonth())) { InflationRateSensitivity ptsExpected = (InflationRateSensitivity) InflationRateSensitivity.of(TEST_OBS[i], 1d); CurrencyParameterSensitivities psComputed = INSTANCE_WITH_FUTFIXING.parameterSensitivity(ptsExpected); double x = YearMonth.from(VAL_DATE_2).until(fixingMonth, MONTHS); UnitParameterSensitivities sens1 = UnitParameterSensitivities.of(CURVE_INFL2.yValueParameterSensitivity(x)); CurrencyParameterSensitivities psExpected = sens1.multipliedBy(ptsExpected.getCurrency(), ptsExpected.getSensitivity()); assertTrue(psComputed.equalWithTolerance(psExpected, TOLERANCE_DELTA), "test " + i); } } }
public void parameter_sensitivity_multiplicative() { InflationNodalCurve curve = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_MULTIPLICATIVE_DEF); double shift = 1.0E-2; for (int i = 1; i < TEST_MONTHS.length; i++) { double nbMonths = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS); UnitParameterSensitivity psComputed = curve.yValueParameterSensitivity(nbMonths); for (int j = 0; j < TIMES.size(); j++) { double[] valuePM = new double[2]; for (int pm = 0; pm < 2; pm++) { DoubleArray shiftedValues = VALUES.with(j, VALUES.get(j) + (1 - 2 * pm) * shift); InterpolatedNodalCurve intCurveShifted = InterpolatedNodalCurve.of(METADATA, TIMES, shiftedValues, INTERPOLATOR); InflationNodalCurve seaCurveShifted = InflationNodalCurve.of(intCurveShifted, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_MULTIPLICATIVE_DEF); valuePM[pm] = seaCurveShifted.yValue(nbMonths); } assertEquals(psComputed.getSensitivity().get(j), (valuePM[0] - valuePM[1]) / (2 * shift), TOLERANCE_DELTA); } } }
double nbMonth = valuationMonth.until(lastMonth, MONTHS); DoubleArray x = curveWithoutFixing.getXValues(); ArgChecker.isTrue(nbMonth < x.get(0), "The first estimation month should be after the last known index fixing");