/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.measure.curve;
import static com.opengamma.strata.basics.date.BusinessDayConventions.FOLLOWING;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.GBLO;
import java.time.Period;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.StandardId;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.date.BusinessDayAdjustment;
import com.opengamma.strata.basics.date.DayCounts;
import com.opengamma.strata.basics.date.Tenor;
import com.opengamma.strata.basics.index.IborIndices;
import com.opengamma.strata.basics.schedule.Frequency;
import com.opengamma.strata.data.ObservableId;
import com.opengamma.strata.market.ValueType;
import com.opengamma.strata.market.curve.CurveName;
import com.opengamma.strata.market.curve.CurveNode;
import com.opengamma.strata.market.curve.InterpolatedNodalCurveDefinition;
import com.opengamma.strata.market.curve.interpolator.CurveExtrapolators;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolators;
import com.opengamma.strata.market.curve.node.FixedIborSwapCurveNode;
import com.opengamma.strata.market.curve.node.FraCurveNode;
import com.opengamma.strata.market.observable.QuoteId;
import com.opengamma.strata.product.fra.type.FraTemplate;
import com.opengamma.strata.product.swap.type.FixedIborSwapConvention;
import com.opengamma.strata.product.swap.type.FixedIborSwapTemplate;
import com.opengamma.strata.product.swap.type.FixedRateSwapLegConvention;
import com.opengamma.strata.product.swap.type.IborRateSwapLegConvention;
import com.opengamma.strata.product.swap.type.ImmutableFixedIborSwapConvention;
/**
* Helper methods for testing curves.
*/
final class CurveTestUtils {
private static final String TEST_SCHEME = "test";
private static final BusinessDayAdjustment BDA_FOLLOW = BusinessDayAdjustment.of(FOLLOWING, GBLO);
private static final IborRateSwapLegConvention FLOATING_CONVENTION =
IborRateSwapLegConvention.of(IborIndices.USD_LIBOR_3M);
private static final FixedRateSwapLegConvention FIXED_CONVENTION =
FixedRateSwapLegConvention.of(Currency.USD, DayCounts.ACT_360, Frequency.P6M, BDA_FOLLOW);
private static final FixedIborSwapConvention SWAP_CONVENTION =
ImmutableFixedIborSwapConvention.of("USD-Swap", FIXED_CONVENTION, FLOATING_CONVENTION);
private CurveTestUtils() {
}
static InterpolatedNodalCurveDefinition fraCurveDefinition() {
String fra1x4 = "fra1x4";
String fra2x5 = "fra2x5";
String fra3x6 = "fra3x6";
String fra6x9 = "fra6x9";
String fra9x12 = "fra9x12";
String fra12x15 = "fra12x15";
String fra18x21 = "fra18x21";
FraCurveNode fra1x4Node = fraNode(1, fra1x4);
FraCurveNode fra2x5Node = fraNode(2, fra2x5);
FraCurveNode fra3x6Node = fraNode(3, fra3x6);
FraCurveNode fra6x9Node = fraNode(6, fra6x9);
FraCurveNode fra9x12Node = fraNode(9, fra9x12);
FraCurveNode fra12x15Node = fraNode(12, fra12x15);
FraCurveNode fra18x21Node = fraNode(18, fra18x21);
CurveName curveName = CurveName.of("FRA Curve");
List<CurveNode> nodes =
ImmutableList.of(fra1x4Node, fra2x5Node, fra3x6Node, fra6x9Node, fra9x12Node, fra12x15Node, fra18x21Node);
return InterpolatedNodalCurveDefinition.builder()
.name(curveName)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ZERO_RATE)
.dayCount(DayCounts.ACT_ACT_ISDA)
.nodes(nodes)
.interpolator(CurveInterpolators.DOUBLE_QUADRATIC)
.extrapolatorLeft(CurveExtrapolators.FLAT)
.extrapolatorRight(CurveExtrapolators.FLAT)
.build();
}
static InterpolatedNodalCurveDefinition fraSwapCurveDefinition() {
String fra3x6 = "fra3x6";
String fra6x9 = "fra6x9";
String swap1y = "swap1y";
String swap2y = "swap2y";
String swap3y = "swap3y";
FraCurveNode fra3x6Node = CurveTestUtils.fraNode(3, fra3x6);
FraCurveNode fra6x9Node = CurveTestUtils.fraNode(6, fra6x9);
FixedIborSwapCurveNode swap1yNode = fixedIborSwapNode(Tenor.TENOR_1Y, swap1y);
FixedIborSwapCurveNode swap2yNode = fixedIborSwapNode(Tenor.TENOR_2Y, swap2y);
FixedIborSwapCurveNode swap3yNode = fixedIborSwapNode(Tenor.TENOR_3Y, swap3y);
CurveName curveName = CurveName.of("FRA and Fixed-Float Swap Curve");
List<CurveNode> nodes = ImmutableList.of(fra3x6Node, fra6x9Node, swap1yNode, swap2yNode, swap3yNode);
return InterpolatedNodalCurveDefinition.builder()
.name(curveName)
.xValueType(ValueType.YEAR_FRACTION)
.yValueType(ValueType.ZERO_RATE)
.dayCount(DayCounts.ACT_ACT_ISDA)
.nodes(nodes)
.interpolator(CurveInterpolators.DOUBLE_QUADRATIC)
.extrapolatorLeft(CurveExtrapolators.FLAT)
.extrapolatorRight(CurveExtrapolators.FLAT)
.build();
}
static FraCurveNode fraNode(int startMonths, String id) {
Period periodToStart = Period.ofMonths(startMonths);
QuoteId quoteId = QuoteId.of(StandardId.of(TEST_SCHEME, id));
return FraCurveNode.of(FraTemplate.of(periodToStart, IborIndices.USD_LIBOR_3M), quoteId);
}
static FixedIborSwapCurveNode fixedIborSwapNode(Tenor tenor, String id) {
QuoteId quoteId = QuoteId.of(StandardId.of(TEST_SCHEME, id));
FixedIborSwapTemplate template = FixedIborSwapTemplate.of(Period.ZERO, tenor, SWAP_CONVENTION);
return FixedIborSwapCurveNode.of(template, quoteId);
}
static ObservableId id(String nodeName) {
return QuoteId.of(StandardId.of(TEST_SCHEME, nodeName));
}
static ObservableId key(CurveNode node) {
if (node instanceof FraCurveNode) {
return ((FraCurveNode) node).getRateId();
} else if (node instanceof FixedIborSwapCurveNode) {
return ((FixedIborSwapCurveNode) node).getRateId();
} else {
throw new IllegalArgumentException("Unsupported node type " + node.getClass().getName());
}
}
}