/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.examples.finance;
import static com.opengamma.strata.measure.StandardComponents.marketDataFactory;
import java.io.File;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.StandardId;
import com.opengamma.strata.calc.CalculationRules;
import com.opengamma.strata.calc.CalculationRunner;
import com.opengamma.strata.calc.Column;
import com.opengamma.strata.calc.Results;
import com.opengamma.strata.calc.marketdata.MarketDataConfig;
import com.opengamma.strata.calc.marketdata.MarketDataRequirements;
import com.opengamma.strata.calc.runner.CalculationFunctions;
import com.opengamma.strata.collect.io.ResourceLocator;
import com.opengamma.strata.collect.timeseries.LocalDateDoubleTimeSeries;
import com.opengamma.strata.data.MarketData;
import com.opengamma.strata.data.ObservableId;
import com.opengamma.strata.examples.marketdata.ExampleData;
import com.opengamma.strata.loader.csv.FixingSeriesCsvLoader;
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.measure.AdvancedMeasures;
import com.opengamma.strata.measure.Measures;
import com.opengamma.strata.measure.StandardComponents;
import com.opengamma.strata.measure.rate.RatesMarketDataLookup;
import com.opengamma.strata.product.Trade;
import com.opengamma.strata.product.TradeAttributeType;
import com.opengamma.strata.product.TradeInfo;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.swap.type.FixedIborSwapConventions;
import com.opengamma.strata.report.ReportCalculationResults;
import com.opengamma.strata.report.trade.TradeReport;
import com.opengamma.strata.report.trade.TradeReportTemplate;
/**
* Example to illustrate using the calculation API to price a swap.
* <p>
* This makes use of the example market data environment.
*/
public class SwapPricingWithCalibrationExample {
/**
* The valuation date.
*/
private static final LocalDate VAL_DATE = LocalDate.of(2015, 7, 21);
/**
* The curve group name.
*/
private static final CurveGroupName CURVE_GROUP_NAME = CurveGroupName.of("USD-DSCON-LIBOR3M");
/**
* The location of the data files.
*/
private static final String PATH_CONFIG = "src/main/resources/";
/**
* The location of the curve calibration groups file.
*/
private static final ResourceLocator GROUPS_RESOURCE =
ResourceLocator.ofFile(new File(PATH_CONFIG + "example-calibration/curves/groups.csv"));
/**
* The location of the curve calibration settings file.
*/
private static final ResourceLocator SETTINGS_RESOURCE =
ResourceLocator.ofFile(new File(PATH_CONFIG + "example-calibration/curves/settings.csv"));
/**
* The location of the curve calibration nodes file.
*/
private static final ResourceLocator CALIBRATION_RESOURCE =
ResourceLocator.ofFile(new File(PATH_CONFIG + "example-calibration/curves/calibrations.csv"));
/**
* The location of the market quotes file.
*/
private static final ResourceLocator QUOTES_RESOURCE =
ResourceLocator.ofFile(new File(PATH_CONFIG + "example-calibration/quotes/quotes.csv"));
/**
* The location of the historical fixing file.
*/
private static final ResourceLocator FIXINGS_RESOURCE =
ResourceLocator.ofFile(new File(PATH_CONFIG + "example-marketdata/historical-fixings/usd-libor-3m.csv"));
/**
* Runs the example, pricing the instruments, producing the output as an ASCII table.
*
* @param args ignored
*/
public static void main(String[] args) {
// setup calculation runner component, which needs life-cycle management
// a typical application might use dependency injection to obtain the instance
try (CalculationRunner runner = CalculationRunner.ofMultiThreaded()) {
calculate(runner);
}
}
// obtains the data and calculates the grid of results
private static void calculate(CalculationRunner runner) {
// the trades that will have measures calculated
List<Trade> trades = createSwapTrades();
// the columns, specifying the measures to be calculated
List<Column> columns = ImmutableList.of(
Column.of(Measures.LEG_INITIAL_NOTIONAL),
Column.of(Measures.PRESENT_VALUE),
Column.of(Measures.LEG_PRESENT_VALUE),
Column.of(Measures.PV01_CALIBRATED_SUM),
Column.of(Measures.PAR_RATE),
Column.of(Measures.ACCRUED_INTEREST),
Column.of(Measures.PV01_CALIBRATED_BUCKETED),
Column.of(AdvancedMeasures.PV01_SEMI_PARALLEL_GAMMA_BUCKETED));
// load quotes
ImmutableMap<QuoteId, Double> quotes = QuotesCsvLoader.load(VAL_DATE, QUOTES_RESOURCE);
// load fixings
ImmutableMap<ObservableId, LocalDateDoubleTimeSeries> fixings = FixingSeriesCsvLoader.load(FIXINGS_RESOURCE);
// create the market data
MarketData marketData = MarketData.of(VAL_DATE, quotes, fixings);
// the reference data, such as holidays and securities
ReferenceData refData = ReferenceData.standard();
// load the curve definition
Map<CurveGroupName, CurveGroupDefinition> defns =
RatesCalibrationCsvLoader.load(GROUPS_RESOURCE, SETTINGS_RESOURCE, CALIBRATION_RESOURCE);
CurveGroupDefinition curveGroupDefinition = defns.get(CURVE_GROUP_NAME).filtered(VAL_DATE, refData);
// the configuration that defines how to create the curves when a curve group is requested
MarketDataConfig marketDataConfig = MarketDataConfig.builder()
.add(CURVE_GROUP_NAME, curveGroupDefinition)
.build();
// the complete set of rules for calculating measures
CalculationFunctions functions = StandardComponents.calculationFunctions();
RatesMarketDataLookup ratesLookup = RatesMarketDataLookup.of(curveGroupDefinition);
CalculationRules rules = CalculationRules.of(functions, ratesLookup);
// calibrate the curves and calculate the results
MarketDataRequirements reqs = MarketDataRequirements.of(rules, trades, columns, refData);
MarketData calibratedMarketData = marketDataFactory().create(reqs, marketDataConfig, marketData, refData);
Results results = runner.calculate(rules, trades, columns, calibratedMarketData, refData);
// use the report runner to transform the engine results into a trade report
ReportCalculationResults calculationResults =
ReportCalculationResults.of(VAL_DATE, trades, columns, results, functions, refData);
TradeReportTemplate reportTemplate = ExampleData.loadTradeReportTemplate("swap-report-template");
TradeReport tradeReport = TradeReport.of(calculationResults, reportTemplate);
tradeReport.writeAsciiTable(System.out);
}
//-----------------------------------------------------------------------
// create swap trades
private static List<Trade> createSwapTrades() {
return ImmutableList.of(createVanillaFixedVsLibor3mSwap());
}
//-----------------------------------------------------------------------
// create a vanilla fixed vs libor 3m swap
private static Trade createVanillaFixedVsLibor3mSwap() {
TradeInfo tradeInfo = TradeInfo.builder()
.id(StandardId.of("example", "1"))
.addAttribute(TradeAttributeType.DESCRIPTION, "Fixed vs Libor 3m")
.counterparty(StandardId.of("example", "A"))
.settlementDate(LocalDate.of(2014, 9, 12))
.build();
return FixedIborSwapConventions.USD_FIXED_6M_LIBOR_3M.toTrade(
tradeInfo,
LocalDate.of(2014, 9, 12), // the start date
LocalDate.of(2021, 9, 12), // the end date
BuySell.BUY, // indicates wheter this trade is a buy or sell
100_000_000, // the notional amount
0.015); // the fixed interest rate
}
}