/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.examples.blog.multicurve1;
import static com.opengamma.strata.product.swap.type.FixedIborSwapConventions.GBP_FIXED_6M_LIBOR_6M;
import java.time.LocalDate;
import java.time.Period;
import java.util.Map;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.MultiCurrencyAmount;
import com.opengamma.strata.basics.date.Tenor;
import com.opengamma.strata.collect.io.ResourceLocator;
import com.opengamma.strata.data.ImmutableMarketData;
import com.opengamma.strata.examples.data.export.ExportUtils;
import com.opengamma.strata.loader.csv.QuotesCsvLoader;
import com.opengamma.strata.loader.csv.RatesCalibrationCsvLoader;
import com.opengamma.strata.market.curve.CurveGroupDefinition;
import com.opengamma.strata.market.curve.CurveGroupName;
import com.opengamma.strata.market.observable.QuoteId;
import com.opengamma.strata.market.param.CurrencyParameterSensitivities;
import com.opengamma.strata.market.sensitivity.PointSensitivities;
import com.opengamma.strata.pricer.curve.CalibrationMeasures;
import com.opengamma.strata.pricer.curve.CurveCalibrator;
import com.opengamma.strata.pricer.rate.ImmutableRatesProvider;
import com.opengamma.strata.pricer.sensitivity.MarketQuoteSensitivityCalculator;
import com.opengamma.strata.pricer.swap.DiscountingSwapTradePricer;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.swap.ResolvedSwapTrade;
/**
* Calibrates one set of curve, computes sensitivity (Bucketed PV01) and exports results in Excel for visualization.
* <p>
* Code used for the blog "Strata and multi-curve - Blog 1: Curve calibration and bucketed PV01" available at
* XXX
*/
public class CalibrationPV01Example {
/* Reference data contains calendar. Here we use build-in holiday calendar.
* It is possible to override them with customized versions.*/
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final LocalDate VALUATION_DATE = LocalDate.of(2016, 8, 1);
// Configuration with discounting curve using OIS up to final maturity; Libor forward curve using IRS.
private static final String CONFIG_STR = "GBP-DSCONOIS-L6MIRS-FRTB";
private static final CurveGroupName CONFIG_NAME = CurveGroupName.of(CONFIG_STR);
/* Swap description. */
private static final Period SWAP_TENOR = Period.ofYears(7);
private static final Period SWAP_PERIOD_TO_START = Period.ofMonths(3);
private static final double SWAP_COUPON = 0.025;
private static final double SWAP_NOTIONAL = 10_000_000;
/* Path to files */
private static final String PATH_CONFIG = "src/main/resources/example-calibration/curves/";
private static final String PATH_QUOTES = "src/main/resources/example-calibration/quotes/";
private static final String PATH_RESULTS = "target/example-output/";
/* Files utilities */
private static final String SUFFIX_CSV = ".csv";
private static final String GROUPS_SUFFIX = "-group";
private static final String NODES_SUFFIX = "-nodes";
private static final String SETTINGS_SUFFIX = "-settings";
private static final ResourceLocator GROUP_RESOURCE =
ResourceLocator.of(PATH_CONFIG + CONFIG_STR + "/" + CONFIG_STR + GROUPS_SUFFIX + SUFFIX_CSV);
private static final ResourceLocator SETTINGS_RESOURCE =
ResourceLocator.of(PATH_CONFIG + CONFIG_STR + "/" + CONFIG_STR + SETTINGS_SUFFIX + SUFFIX_CSV);
private static final ResourceLocator NODES_RESOURCE =
ResourceLocator.of(PATH_CONFIG + CONFIG_STR + "/" + CONFIG_STR + NODES_SUFFIX + SUFFIX_CSV);
/* Raw data */
private static final String QUOTES_FILE = PATH_QUOTES + "MARKET-QUOTES-GBP-20160801.csv";
private static final Map<QuoteId, Double> MAP_MQ = QuotesCsvLoader.load(VALUATION_DATE, ResourceLocator.of(QUOTES_FILE));
private static final ImmutableMarketData MARKET_QUOTES =
ImmutableMarketData.builder(VALUATION_DATE).values(MAP_MQ).build();
private static final CalibrationMeasures CALIBRATION_MEASURES = CalibrationMeasures.PAR_SPREAD;
private static final CurveCalibrator CALIBRATOR = CurveCalibrator.of(1e-9, 1e-9, 100, CALIBRATION_MEASURES);
private static final DiscountingSwapTradePricer PRICER_SWAP = DiscountingSwapTradePricer.DEFAULT;
private static final MarketQuoteSensitivityCalculator MQC = MarketQuoteSensitivityCalculator.DEFAULT;
private static final double BP1 = 1.0E-4; // Scaling by 1 bp.
public static void main(String[] arg) {
/* Load the curve configurations from csv files */
Map<CurveGroupName, CurveGroupDefinition> configs =
RatesCalibrationCsvLoader.load(GROUP_RESOURCE, SETTINGS_RESOURCE, NODES_RESOURCE);
/* Calibrate curves */
ImmutableRatesProvider multicurve = CALIBRATOR.calibrate(configs.get(CONFIG_NAME), MARKET_QUOTES, REF_DATA);
/* Construct a swap */
ResolvedSwapTrade swap = GBP_FIXED_6M_LIBOR_6M.createTrade(
VALUATION_DATE, SWAP_PERIOD_TO_START, Tenor.of(SWAP_TENOR), BuySell.BUY, SWAP_NOTIONAL, SWAP_COUPON, REF_DATA)
.resolve(REF_DATA);
/* Computes PV and bucketed PV01 */
MultiCurrencyAmount pv = PRICER_SWAP.presentValue(swap, multicurve);
PointSensitivities pts = PRICER_SWAP.presentValueSensitivity(swap, multicurve);
CurrencyParameterSensitivities ps = multicurve.parameterSensitivity(pts);
CurrencyParameterSensitivities mqs = MQC.sensitivity(ps, multicurve);
/* Export to csv files. */
ExportUtils.export(mqs, BP1, PATH_RESULTS + CONFIG_STR + "-delta" + SUFFIX_CSV);
ExportUtils.export(pv, PATH_RESULTS + CONFIG_STR + "-pv" + SUFFIX_CSV);
System.out.println("Calibration and export finished: " + CONFIG_STR);
}
}