package com.opengamma.analytics.financial.interestrate.swap.provider;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.payment.CouponIborAverageIndexDefinition;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborAverage;
import com.opengamma.analytics.financial.provider.description.MulticurveProviderDiscountDataSets;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.financial.schedule.ScheduleCalculator;
import com.opengamma.analytics.util.time.TimeCalculator;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.util.money.Currency;
import com.opengamma.util.time.DateUtils;
public class CouponForwardRateVisitorTest {
private static final ZonedDateTime VALUATION_DATE = DateUtils.getUTCDate(2015, 9, 23);
private static final MulticurveProviderDiscount MULTICURVE =
MulticurveProviderDiscountDataSets.createMulticurveEurUsd();
private static final IborIndex[] INDEX_LIST = MulticurveProviderDiscountDataSets.getIndexesIborMulticurveEurUsd();
private static final IborIndex EURIBOR3M = INDEX_LIST[0];
private static final IborIndex EURIBOR6M = INDEX_LIST[1];
private static final Currency EUR = EURIBOR3M.getCurrency();
private static final Calendar CALENDAR = MulticurveProviderDiscountDataSets.getEURCalendar();
private static final ZonedDateTime FIXING_DATE = DateUtils.getUTCDate(2015, 12, 14);
private static final ZonedDateTime START_DATE = DateUtils.getUTCDate(2015, 12, 16);
private static final ZonedDateTime FIXING_PERIOD_END_3M =
ScheduleCalculator.getAdjustedDate(START_DATE, EURIBOR3M, CALENDAR);
private static final ZonedDateTime FIXING_PERIOD_END_6M =
ScheduleCalculator.getAdjustedDate(START_DATE, EURIBOR6M, CALENDAR);
private static final ZonedDateTime END_DATE_STUB = DateUtils.getUTCDate(2016, 4, 28);
private static final double NOTIONAL = 100000000.0; // 100m
private static final double PAYMENT_AF = 0.40;
private static final double WEIGHT_3M =
((double) (FIXING_PERIOD_END_6M.toLocalDate().toEpochDay() - END_DATE_STUB.toLocalDate().toEpochDay()))
/ (FIXING_PERIOD_END_6M.toLocalDate().toEpochDay() - FIXING_PERIOD_END_3M.toLocalDate().toEpochDay());
private static final double WEIGHT_6M =
((double) (END_DATE_STUB.toLocalDate().toEpochDay() - FIXING_PERIOD_END_3M.toLocalDate().toEpochDay()))
/ (FIXING_PERIOD_END_6M.toLocalDate().toEpochDay() - FIXING_PERIOD_END_3M.toLocalDate().toEpochDay());
private static final CouponIborAverageIndexDefinition CPN_STUB_DEFINITION =
new CouponIborAverageIndexDefinition(EUR, END_DATE_STUB, START_DATE, END_DATE_STUB, PAYMENT_AF, NOTIONAL,
FIXING_DATE, EURIBOR3M, EURIBOR6M, WEIGHT_3M, WEIGHT_6M, CALENDAR, CALENDAR);
private static final CouponIborAverage CPN_STUB = (CouponIborAverage) CPN_STUB_DEFINITION.toDerivative(VALUATION_DATE);
private static final CouponForwardRateVisitor FWD_CALCULATOR = new CouponForwardRateVisitor();
private static final double TOLERANCE_RATE = 1.0E-8;
@Test
public void forward_ibor_average_index() {
double fwdComputed = CPN_STUB.accept(FWD_CALCULATOR, MULTICURVE);
double startTime = TimeCalculator.getTimeBetween(VALUATION_DATE, START_DATE);
double endTime3M = TimeCalculator.getTimeBetween(VALUATION_DATE, FIXING_PERIOD_END_3M);
double endTime6M = TimeCalculator.getTimeBetween(VALUATION_DATE, FIXING_PERIOD_END_6M);
double af3M = EURIBOR3M.getDayCount().getDayCountFraction(START_DATE, FIXING_PERIOD_END_3M);
double af6M = EURIBOR6M.getDayCount().getDayCountFraction(START_DATE, FIXING_PERIOD_END_6M);
double fwd3M = MULTICURVE.getSimplyCompoundForwardRate(EURIBOR3M, startTime, endTime3M, af3M);
double fwd6M = MULTICURVE.getSimplyCompoundForwardRate(EURIBOR6M, startTime, endTime6M, af6M);
double fwdExpected = fwd3M * WEIGHT_3M + fwd6M * WEIGHT_6M;
assertEquals(fwdExpected, fwdComputed, TOLERANCE_RATE);
}
}