/** * Test for the case where publication lag=0, effective offset=1 (CHF conventions) and no cutoff * period. The arithmetic average coupons are used mainly in USD. This test is more for * completeness than a real case. */ public void rateChfNoCutOffSensitivity() { OvernightIndexRates mockRates = mock(OvernightIndexRates.class); when(mockRates.getIndex()).thenReturn(CHF_TOIS); SimpleRatesProvider simpleProv = new SimpleRatesProvider(mockRates); for (int i = 0; i < FIXING_DATES.length; i++) { when(mockRates.rate(FIXING_DATES[i])).thenReturn(FIXING_RATES[i]); LocalDate fixingStartDate = CHF_TOIS.calculateEffectiveFromFixing(FIXING_DATES[i]); LocalDate fixingEndDate = CHF_TOIS.calculateMaturityFromEffective(fixingStartDate); OvernightRateSensitivity sensitivity = OvernightRateSensitivity.of( CHF_TOIS, FIXING_DATES[i], fixingEndDate, CHF_TOIS.getCurrency(), 1d); when(mockRates.ratePointSensitivity(FIXING_DATES[i])).thenReturn(sensitivity); } OvernightAveragedRateObservation ro = OvernightAveragedRateObservation.of(CHF_TOIS, FIXING_START_DATE, FIXING_END_DATE, 0); ForwardOvernightAveragedRateObservationFn obsFn = ForwardOvernightAveragedRateObservationFn.DEFAULT; PointSensitivityBuilder sensitivityBuilderComputed = obsFn.rateSensitivity(ro, DUMMY_ACCRUAL_START_DATE, DUMMY_ACCRUAL_END_DATE, simpleProv); PointSensitivities sensitivityComputed = sensitivityBuilderComputed.build().normalized(); Double[] sensitivityExpected = computedSensitivityFD(ro, CHF_TOIS); assertEquals(sensitivityComputed.getSensitivities().size(), sensitivityExpected.length); for (int i = 0; i < sensitivityExpected.length; ++i) { assertEquals( sensitivityComputed.getSensitivities().get(i).getSensitivity(), sensitivityExpected[i], EPS_FD); } }
/** * Test for the case where publication lag=0, effective offset=1 (CHF conventions) and no cutoff * period. The arithmetic average coupons are used mainly in USD. This test is more for * completeness than a real case. */ public void rateChfNoCutOff() { OvernightIndexRates mockRates = mock(OvernightIndexRates.class); when(mockRates.getIndex()).thenReturn(CHF_TOIS); SimpleRatesProvider simpleProv = new SimpleRatesProvider(mockRates); for (int i = 0; i < FIXING_DATES.length; i++) { when(mockRates.rate(FIXING_DATES[i])).thenReturn(FIXING_RATES[i]); } OvernightAveragedRateObservation ro = OvernightAveragedRateObservation.of(CHF_TOIS, FIXING_START_DATE, FIXING_END_DATE, 0); ForwardOvernightAveragedRateObservationFn obsFn = ForwardOvernightAveragedRateObservationFn.DEFAULT; double accrualFactorTotal = 0.0d; double accruedRate = 0.0d; int indexLast = 5; // Fixing in the observation period are from 1 to 5 (inclusive) for (int i = 1; i <= indexLast; i++) { LocalDate startDate = CHF_TOIS.calculateEffectiveFromFixing(FIXING_DATES[i]); LocalDate endDate = CHF_TOIS.calculateMaturityFromEffective(startDate); double af = CHF_TOIS.getDayCount().yearFraction(startDate, endDate); accrualFactorTotal += af; accruedRate += FIXING_RATES[i] * af; } double rateExpected = accruedRate / accrualFactorTotal; double rateComputed = obsFn.rate(ro, DUMMY_ACCRUAL_START_DATE, DUMMY_ACCRUAL_END_DATE, simpleProv); assertEquals(rateExpected, rateComputed, TOLERANCE_RATE); }