/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.fx;
import static com.opengamma.strata.basics.currency.Currency.EUR;
import static com.opengamma.strata.basics.currency.Currency.GBP;
import static com.opengamma.strata.basics.currency.Currency.USD;
import static com.opengamma.strata.basics.date.DayCounts.ACT_360;
import static com.opengamma.strata.basics.date.DayCounts.ACT_ACT_ISDA;
import java.time.LocalDate;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.currency.FxMatrix;
import com.opengamma.strata.basics.index.FxIndex;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.collect.timeseries.LocalDateDoubleTimeSeries;
import com.opengamma.strata.market.curve.CurveMetadata;
import com.opengamma.strata.market.curve.CurveName;
import com.opengamma.strata.market.curve.Curves;
import com.opengamma.strata.market.curve.InterpolatedNodalCurve;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolator;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolators;
import com.opengamma.strata.pricer.datasets.RatesProviderDataSets;
import com.opengamma.strata.pricer.rate.ImmutableRatesProvider;
import com.opengamma.strata.pricer.rate.RatesProvider;
/**
* Sets of market data used in FX tests.
*/
public class RatesProviderFxDataSets {
private static final ReferenceData REF_DATA = ReferenceData.standard();
/** Wednesday. */
public static final LocalDate VAL_DATE_2014_01_22 = RatesProviderDataSets.VAL_DATE_2014_01_22;
private static final Currency KRW = Currency.of("KRW");
private static final double EUR_USD = 1.40;
private static final double USD_KRW = 1111.11;
private static final double GBP_USD = 1.50;
private static final FxMatrix FX_MATRIX =
FxMatrix.builder()
.addRate(EUR, USD, EUR_USD)
.addRate(KRW, USD, 1.0 / USD_KRW)
.addRate(GBP, USD, GBP_USD)
.build();
private static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR;
private static final DoubleArray USD_DSC_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0);
private static final DoubleArray USD_DSC_RATE = DoubleArray.of(0.0100, 0.0120, 0.0120, 0.0140, 0.0140);
private static final DoubleArray USD_DSC_RATE_FLAT = DoubleArray.of(0.0110, 0.0110, 0.0110, 0.0110, 0.0110);
private static final CurveMetadata USD_DSC_METADATA = Curves.zeroRates("USD Dsc", ACT_360);
private static final InterpolatedNodalCurve USD_DSC =
InterpolatedNodalCurve.of(USD_DSC_METADATA, USD_DSC_TIME, USD_DSC_RATE, INTERPOLATOR);
private static final InterpolatedNodalCurve USD_DSC_FLAT =
InterpolatedNodalCurve.of(USD_DSC_METADATA, USD_DSC_TIME, USD_DSC_RATE_FLAT, INTERPOLATOR);
private static final CurveMetadata USD_DSC_METADATA_ISDA = Curves.zeroRates("USD Dsc", ACT_ACT_ISDA);
private static final InterpolatedNodalCurve USD_DSC_ISDA =
InterpolatedNodalCurve.of(USD_DSC_METADATA_ISDA, USD_DSC_TIME, USD_DSC_RATE, INTERPOLATOR);
private static final DoubleArray EUR_DSC_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0);
private static final DoubleArray EUR_DSC_RATE = DoubleArray.of(0.0150, 0.0125, 0.0150, 0.0175, 0.0150);
private static final DoubleArray EUR_DSC_RATE_FLAT = DoubleArray.of(0.0150, 0.0150, 0.0150, 0.0150, 0.0150);
private static final CurveMetadata EUR_DSC_METADATA = Curves.zeroRates("EUR Dsc", ACT_360);
private static final InterpolatedNodalCurve EUR_DSC =
InterpolatedNodalCurve.of(EUR_DSC_METADATA, EUR_DSC_TIME, EUR_DSC_RATE, INTERPOLATOR);
private static final InterpolatedNodalCurve EUR_DSC_FLAT =
InterpolatedNodalCurve.of(EUR_DSC_METADATA, EUR_DSC_TIME, EUR_DSC_RATE_FLAT, INTERPOLATOR);
private static final CurveMetadata EUR_DSC_METADATA_ISDA = Curves.zeroRates("EUR Dsc", ACT_ACT_ISDA);
private static final InterpolatedNodalCurve EUR_DSC_ISDA =
InterpolatedNodalCurve.of(EUR_DSC_METADATA_ISDA, EUR_DSC_TIME, EUR_DSC_RATE, INTERPOLATOR);
private static final DoubleArray GBP_DSC_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0);
private static final DoubleArray GBP_DSC_RATE = DoubleArray.of(0.0160, 0.0135, 0.0160, 0.0185, 0.0160);
private static final CurveMetadata GBP_DSC_METADATA = Curves.zeroRates("GBP Dsc", ACT_360);
private static final InterpolatedNodalCurve GBP_DSC =
InterpolatedNodalCurve.of(GBP_DSC_METADATA, GBP_DSC_TIME, GBP_DSC_RATE, INTERPOLATOR);
private static final DoubleArray KRW_DSC_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0);
private static final DoubleArray KRW_DSC_RATE = DoubleArray.of(0.0350, 0.0325, 0.0350, 0.0375, 0.0350);
private static final CurveMetadata KRW_DSC_METADATA = Curves.zeroRates("KRW Dsc", ACT_360);
private static final InterpolatedNodalCurve KRW_DSC =
InterpolatedNodalCurve.of(KRW_DSC_METADATA, KRW_DSC_TIME, KRW_DSC_RATE, INTERPOLATOR);
/**
* Create a yield curve bundle with three curves.
* One called "Discounting EUR" with a constant rate of 2.50%, one called "Discounting USD"
* with a constant rate of 1.00% and one called "Discounting GBP" with a constant rate of 2.00%;
* "Discounting KRW" with a constant rate of 3.21%;
*
* @return the provider
*/
public static RatesProvider createProvider() {
return ImmutableRatesProvider.builder(VAL_DATE_2014_01_22)
.discountCurve(EUR, EUR_DSC)
.discountCurve(USD, USD_DSC)
.discountCurve(GBP, GBP_DSC)
.discountCurve(KRW, KRW_DSC)
.fxRateProvider(FX_MATRIX)
.build();
}
/**
* Create a yield curve bundle with three curves.
* One called "Discounting EUR" with a constant rate of 2.50%, one called "Discounting USD"
* with a constant rate of 1.00% and one called "Discounting GBP" with a constant rate of 2.00%;
* "Discounting KRW" with a constant rate of 3.21%;
*
* @param valuationDate the valuation date
* @param fxIndex the FX index
* @param spotRate the spot rate for the index
* @return the provider
*/
public static RatesProvider createProvider(LocalDate valuationDate, FxIndex fxIndex, double spotRate) {
return ImmutableRatesProvider.builder(valuationDate)
.discountCurve(EUR, EUR_DSC)
.discountCurve(USD, USD_DSC)
.discountCurve(GBP, GBP_DSC)
.discountCurve(KRW, KRW_DSC)
.fxRateProvider(FX_MATRIX)
.timeSeries(
fxIndex,
LocalDateDoubleTimeSeries.of(fxIndex.calculateFixingFromMaturity(valuationDate, REF_DATA), spotRate))
.build();
}
/**
* Creates rates provider for EUR, USD with FX matrix.
*
* @param valuationDate the valuation date
* @return the rates provider
*/
public static ImmutableRatesProvider createProviderEURUSD(LocalDate valuationDate) {
FxMatrix fxMatrix = FxMatrix.builder().addRate(USD, EUR, 1.0d / EUR_USD).build();
return ImmutableRatesProvider.builder(valuationDate)
.discountCurve(EUR, EUR_DSC)
.discountCurve(USD, USD_DSC)
.fxRateProvider(fxMatrix)
.build();
}
/**
* Creates rates provider for EUR, USD with FX matrix.
* <p>
* The discount curves are based on the day count convention, ACT/ACT ISDA.
*
* @param valuationDate the valuation date
* @return the rates provider
*/
public static ImmutableRatesProvider createProviderEurUsdActActIsda(LocalDate valuationDate) {
FxMatrix fxMatrix = FxMatrix.builder().addRate(USD, EUR, 1.0d / EUR_USD).build();
return ImmutableRatesProvider.builder(valuationDate)
.discountCurve(EUR, EUR_DSC_ISDA)
.discountCurve(USD, USD_DSC_ISDA)
.fxRateProvider(fxMatrix)
.build();
}
/**
* Creates rates provider for EUR, USD with FX matrix.
* <p>
* The discount curves are flat.
*
* @param valuationDate the valuation date
* @return the rates provider
*/
public static ImmutableRatesProvider createProviderEurUsdFlat(LocalDate valuationDate) {
FxMatrix fxMatrix = FxMatrix.builder().addRate(USD, EUR, 1.0d / EUR_USD).build();
return ImmutableRatesProvider.builder(valuationDate)
.discountCurve(EUR, EUR_DSC_FLAT)
.discountCurve(USD, USD_DSC_FLAT)
.fxRateProvider(fxMatrix)
.build();
}
/**
* Get the curve name of the curve for a given currency.
*
* @param currency the currency
* @return the curve name
*/
public static CurveName getCurveName(Currency currency) {
if (currency.equals(EUR)) {
return EUR_DSC.getName();
}
if (currency.equals(USD)) {
return USD_DSC.getName();
}
if (currency.equals(GBP)) {
return GBP_DSC.getName();
}
throw new IllegalArgumentException();
}
/**
* Gets the FX matrix.
*
* @return the FX matrix
*/
public static FxMatrix fxMatrix() {
return FX_MATRIX;
}
}