public void test_dkkOis() { OvernightIndex test = OvernightIndex.of("DKK-TNR"); assertEquals(test.getName(), "DKK-TNR"); assertEquals(test.getCurrency(), DKK); assertEquals(test.isActive(), true); assertEquals(test.getFixingCalendar(), DKCO); assertEquals(test.getPublicationDateOffset(), 1); assertEquals(test.getEffectiveDateOffset(), 1); assertEquals(test.getDayCount(), ACT_360); assertEquals(test.getDefaultFixedLegDayCount(), ACT_360); assertEquals(test.toString(), "DKK-TNR"); }
/** * Creates an {@code IborRateObservation} from an index and fixing date. * <p> * The reference data is used to find the maturity date from the fixing date. * * @param index the index * @param fixingDate the fixing date * @param refData the reference data to use when resolving holiday calendars * @return the rate observation */ public static OvernightIndexObservation of(OvernightIndex index, LocalDate fixingDate, ReferenceData refData) { LocalDate publicationDate = index.calculatePublicationFromFixing(fixingDate, refData); LocalDate effectiveDate = index.calculateEffectiveFromFixing(fixingDate, refData); LocalDate maturityDate = index.calculateMaturityFromEffective(effectiveDate, refData); return OvernightIndexObservation.builder() .index(index) .fixingDate(fixingDate) .publicationDate(publicationDate) .effectiveDate(effectiveDate) .maturityDate(maturityDate) .yearFraction(index.getDayCount().yearFraction(effectiveDate, maturityDate)) .build(); }
/** * Obtains an instance from an index and period dates. * * @param index the index * @param startDate the first date of the accrual period * @param endDate the last date of the accrual period * @param refData the reference data to use when resolving holiday calendars * @return the rate computation */ public static OvernightCompoundedAnnualRateComputation of( OvernightIndex index, LocalDate startDate, LocalDate endDate, ReferenceData refData) { return OvernightCompoundedAnnualRateComputation.builder() .index(index) .fixingCalendar(index.getFixingCalendar().resolve(refData)) .startDate(index.calculateFixingFromEffective(startDate, refData)) .endDate(index.calculateFixingFromEffective(endDate, refData)) .build(); }
public void test_getFloatingRateName() { for (OvernightIndex index : OvernightIndex.extendedEnum().lookupAll().values()) { assertEquals(index.getFloatingRateName(), FloatingRateName.of(index.getName())); } }
public void test_gbpSonia_dates() { OvernightIndex test = OvernightIndex.of("GBP-SONIA"); assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 13), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 13), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 13), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 13), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 13), REF_DATA), date(2014, 10, 14)); // weekend assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 10)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 10)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 10), REF_DATA), date(2014, 10, 10)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 10), REF_DATA), date(2014, 10, 13)); // input date is Sunday assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 12), REF_DATA), date(2014, 10, 13)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 12), REF_DATA), date(2014, 10, 14)); }
double afNonCutoff = 0.0; for (int i = 1; i < 5; i++) { LocalDate endDate = USD_FED_FUND.calculateMaturityFromEffective(FIXING_DATES[i], REF_DATA); double af = USD_FED_FUND.getDayCount().yearFraction(FIXING_DATES[i], endDate); afNonCutoff += af; investmentFactor *= 1.0d + af * FORWARD_RATES[i]; when(mockRates.periodRate(USD_OBS[1], FIXING_FINAL_DATE)).thenReturn(rateCmp); LocalDate fixingCutOff = FIXING_DATES[5]; LocalDate endDate = USD_FED_FUND.calculateMaturityFromEffective(fixingCutOff, REF_DATA); double afCutOff = USD_FED_FUND.getDayCount().yearFraction(fixingCutOff, endDate); double rateExpected = ((1.0 + rateCmp * afNonCutoff) * (1.0d + FORWARD_RATES[4] * afCutOff) - 1.0d) / (afNonCutoff + afCutOff);
when(mockRatesPeriodUp.rate(USD_OBS[i])).thenReturn(FORWARD_RATES[i]); when(mockRatesPeriodDw.rate(USD_OBS[i])).thenReturn(FORWARD_RATES[i]); LocalDate fixingStartDate = USD_FED_FUND.calculateEffectiveFromFixing(FIXING_DATES[i], REF_DATA); LocalDate fixingEndDate = USD_FED_FUND.calculateMaturityFromEffective(fixingStartDate, REF_DATA); PointSensitivityBuilder rateSensitivity = OvernightRateSensitivity.ofPeriod(USD_OBS[i], fixingEndDate, 1.0); when(mockRates.ratePointSensitivity(USD_OBS[i])).thenReturn(rateSensitivity); double afNonCutoff = 0.0; for (int i = 1; i < 5; i++) { LocalDate endDate = USD_FED_FUND.calculateMaturityFromEffective(FIXING_DATES[i], REF_DATA); double af = USD_FED_FUND.getDayCount().yearFraction(FIXING_DATES[i], endDate); afNonCutoff += af; investmentFactor *= 1.0d + af * FORWARD_RATES[i]; double rateDw = OBS_FWD_ONCMP.rate(ro, DUMMY_ACCRUAL_START_DATE, DUMMY_ACCRUAL_END_DATE, simpleProvDw[i]); double cutoffSensitivity = 0.5 * (rateUp - rateDw) / EPS_FD; // [4] is nonzero LocalDate fixingStartDate = USD_FED_FUND.calculateEffectiveFromFixing(FIXING_DATES[i], REF_DATA); LocalDate fixingEndDate = USD_FED_FUND.calculateMaturityFromEffective(fixingStartDate, REF_DATA); sensitivityBuilderExpected1 = cutoffSensitivity == 0.0 ? sensitivityBuilderExpected1 : sensitivityBuilderExpected1.combinedWith(
OvernightCompoundedRateComputation ro = OvernightCompoundedRateComputation.of( CHF_TOIS, CHF_TOIS.calculateEffectiveFromFixing(FIXING_START_DATE, REF_DATA), CHF_TOIS.calculateEffectiveFromFixing(FIXING_END_DATE, REF_DATA), 0, REF_DATA); for (int i = 1; i < lastFixing; i++) { LocalDate fixingknown = FIXING_DATES[i]; LocalDate startDateKnown = CHF_TOIS.calculateEffectiveFromFixing(fixingknown, REF_DATA); LocalDate endDateKnown = CHF_TOIS.calculateMaturityFromEffective(startDateKnown, REF_DATA); double af = CHF_TOIS.getDayCount().yearFraction(startDateKnown, endDateKnown); afKnown += af; investmentFactorKnown *= 1.0d + af * FIXING_RATES[i]; for (int i = lastFixing; i < 6; i++) { LocalDate fixing = FIXING_DATES[i]; LocalDate startDate = CHF_TOIS.calculateEffectiveFromFixing(fixing, REF_DATA); LocalDate endDate = CHF_TOIS.calculateMaturityFromEffective(startDate, REF_DATA); double af = CHF_TOIS.getDayCount().yearFraction(startDate, endDate); afNoCutoff += af; investmentFactorNoCutoff *= 1.0d + af * FORWARD_RATES[i]; LocalDate dateMat = CHF_TOIS.calculateMaturityFromFixing(FIXING_DATES[5], REF_DATA); OvernightIndexObservation obs = OvernightIndexObservation.of(CHF_TOIS, FIXING_DATES[lastFixing], REF_DATA); when(mockRates.periodRate(obs, dateMat)).thenReturn(rateCmp);
/** * Gets the currency of the Overnight index. * * @return the currency of the index */ public Currency getCurrency() { return index.getCurrency(); }
/** * Gets the day count convention applicable, * providing a default result if no override specified. * <p> * This is used to convert dates to a numerical value. * The data model permits the day count to differ from that of the index, * however the two are typically the same. * <p> * This will default to the day count of the index if not specified. * * @return the day count, not null */ public DayCount getDayCount() { return dayCount != null ? dayCount : index.getDayCount(); }
@Test(dataProvider = "name") public void test_name(OvernightIndex convention, String name) { assertEquals(convention.getName(), name); }
/** * Gets the business day adjustment to apply to accrual schedule dates, * providing a default result if no override specified. * <p> * Each date in the calculated schedule is determined without taking into account weekends and holidays. * The adjustment specified here is used to convert those dates to valid business days. * The start date and end date have their own business day adjustment rules. * <p> * This will default to 'ModifiedFollowing' using the index fixing calendar if not specified. * * @return the business day adjustment, not null */ public BusinessDayAdjustment getAccrualBusinessDayAdjustment() { return accrualBusinessDayAdjustment != null ? accrualBusinessDayAdjustment : BusinessDayAdjustment.of(MODIFIED_FOLLOWING, index.getFixingCalendar()); }
@Override public OvernightIndex toOvernightIndex() { if (!type.isOvernight()) { throw new IllegalStateException("Incorrect index type, expected Overnight: " + externalName); } if (indexName.endsWith(AVERAGE_SUFFIX)) { return OvernightIndex.of(indexName.substring(0, indexName.length() - 4)); } return OvernightIndex.of(indexName); }
public void test_usdFedFund_dates() { OvernightIndex test = OvernightIndex.of("USD-FED-FUND"); assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 27), REF_DATA), date(2014, 10, 28)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 27), REF_DATA), date(2014, 10, 27)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 27), REF_DATA), date(2014, 10, 28)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 27), REF_DATA), date(2014, 10, 27)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 27), REF_DATA), date(2014, 10, 28)); // weekend and US holiday assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 10)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 10), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 10), REF_DATA), date(2014, 10, 10)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 10), REF_DATA), date(2014, 10, 14)); // input date is Sunday, 13th is US holiday assertEquals(test.calculatePublicationFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 15)); assertEquals(test.calculateEffectiveFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 12), REF_DATA), date(2014, 10, 15)); assertEquals(test.calculateFixingFromEffective(date(2014, 10, 12), REF_DATA), date(2014, 10, 14)); assertEquals(test.calculateMaturityFromEffective(date(2014, 10, 12), REF_DATA), date(2014, 10, 15)); }
double afApprox = 0.0; for (int i = 1; i < 5; i++) { LocalDate endDate = USD_FED_FUND.calculateMaturityFromEffective(FIXING_DATES[i], REF_DATA); double af = USD_FED_FUND.getDayCount().yearFraction(FIXING_DATES[i], endDate); afApprox += af; investmentFactor *= 1.0d + af * FORWARD_RATES[i]; when(mockRates.periodRate(obs, FIXING_FINAL_DATE)).thenReturn(rateCmp); LocalDate fixingCutOff = FIXING_DATES[5]; LocalDate endDate = USD_FED_FUND.calculateMaturityFromEffective(fixingCutOff, REF_DATA); double afCutOff = USD_FED_FUND.getDayCount().yearFraction(fixingCutOff, endDate); double rateExpected = (Math.log(1.0 + rateCmp * afApprox) + FORWARD_RATES[4] * afCutOff) / (afApprox + afCutOff); for (int loopvaldate = 0; loopvaldate < 2; loopvaldate++) {
LocalDate fixingStartDate = GBP_SONIA.calculateEffectiveFromFixing(FIXING_DATES[i], REF_DATA); LocalDate fixingEndDate = GBP_SONIA.calculateMaturityFromEffective(fixingStartDate, REF_DATA); PointSensitivityBuilder pointSensitivity = OvernightRateSensitivity.ofPeriod(GBP_OBS[i], fixingEndDate, 1d); when(mockRates.ratePointSensitivity(GBP_OBS[i])).thenReturn(pointSensitivity); double afApprox = 0.0; for (int i = lastFixing; i < 5; i++) { LocalDate endDate = GBP_SONIA.calculateMaturityFromEffective(FIXING_DATES[i], REF_DATA); double af = GBP_SONIA.getDayCount().yearFraction(FIXING_DATES[i], endDate); afApprox += af; investmentFactor *= 1.0d + af * FORWARD_RATES[i]; double rateDw = OBS_FN_APPROX_FWD.rate(ro, DUMMY_ACCRUAL_START_DATE, DUMMY_ACCRUAL_END_DATE, simpleProvDw[i]); double res = 0.5 * (rateUp - rateDw) / EPS_FD; LocalDate fixingStartDate = GBP_SONIA.calculateEffectiveFromFixing(FIXING_DATES[i], REF_DATA); LocalDate fixingEndDate = GBP_SONIA.calculateMaturityFromEffective(fixingStartDate, REF_DATA); sensitivityBuilderExpected1 = res == 0.0 ? sensitivityBuilderExpected1 : sensitivityBuilderExpected1 .combinedWith(OvernightRateSensitivity.ofPeriod(GBP_OBS[i], fixingEndDate, res));
OvernightCompoundedRateComputation ro = OvernightCompoundedRateComputation.of( CHF_TOIS, CHF_TOIS.calculateEffectiveFromFixing(FIXING_START_DATE, REF_DATA), CHF_TOIS.calculateEffectiveFromFixing(FIXING_END_DATE, REF_DATA), 0, REF_DATA); for (int i = lastFixing; i < 6; i++) { LocalDate fixing = FIXING_DATES[i]; LocalDate startDate = CHF_TOIS.calculateEffectiveFromFixing(fixing, REF_DATA); LocalDate endDate = CHF_TOIS.calculateMaturityFromEffective(startDate, REF_DATA); double af = CHF_TOIS.getDayCount().yearFraction(startDate, endDate); afNoCutoff += af; investmentFactorNoCutoff *= 1.0d + af * FORWARD_RATES[i]; LocalDate dateMat = CHF_TOIS.calculateMaturityFromFixing(FIXING_DATES[5], REF_DATA); OvernightIndexObservation obs = OvernightIndexObservation.of(CHF_TOIS, FIXING_DATES[lastFixing], REF_DATA); when(mockRates.periodRate(obs, dateMat)).thenReturn(rateCmp);
/** * Gets the leg currency, optional with defaulting getter. * <p> * This is the currency of the swap leg and the currency that payment is made in. * The data model permits this currency to differ from that of the index, * however the two are typically the same. * <p> * This will default to the currency of the index if not specified. * * @return the start date business day adjustment, not null */ public Currency getCurrency() { return currency != null ? currency : index.getCurrency(); }
@ImmutablePreBuild private static void preBuild(Builder builder) { if (builder.index != null) { if (builder.dayCount == null) { builder.dayCount = builder.index.getDayCount(); } } }
private static ImmutableMap<String, OvernightIndex> loadFromCsv() { List<ResourceLocator> resources = ResourceConfig.orderedResources("OvernightIndexData.csv"); Map<String, OvernightIndex> map = new HashMap<>(); // files are ordered lowest priority to highest, thus Map::put is used for (ResourceLocator resource : resources) { try { CsvFile csv = CsvFile.of(resource.getCharSource(), true); for (CsvRow row : csv.rows()) { OvernightIndex parsed = parseOvernightIndex(row); map.put(parsed.getName(), parsed); map.put(parsed.getName().toUpperCase(Locale.ENGLISH), parsed); } } catch (RuntimeException ex) { log.log(Level.SEVERE, "Error processing resource as Overnight Index CSV file: " + resource, ex); return ImmutableMap.of(); } } return ImmutableMap.copyOf(map); }