/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.examples; import java.time.LocalDate; import java.util.List; import com.google.common.collect.ImmutableList; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.currency.Currency; 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.runner.CalculationFunctions; import com.opengamma.strata.data.MarketData; import com.opengamma.strata.examples.marketdata.ExampleData; import com.opengamma.strata.examples.marketdata.ExampleMarketData; import com.opengamma.strata.examples.marketdata.ExampleMarketDataBuilder; import com.opengamma.strata.examples.marketdata.credit.markit.MarkitRedCode; import com.opengamma.strata.measure.Measures; import com.opengamma.strata.measure.StandardComponents; import com.opengamma.strata.measure.credit.CreditMeasures; import com.opengamma.strata.product.Trade; import com.opengamma.strata.product.common.BuySell; import com.opengamma.strata.product.credit.IndexReferenceInformation; import com.opengamma.strata.product.credit.RestructuringClause; import com.opengamma.strata.product.credit.SeniorityLevel; import com.opengamma.strata.product.credit.SingleNameReferenceInformation; import com.opengamma.strata.product.credit.type.CdsConventions; 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 engine to price a credit default swap. * <p> * This makes use of the example engine and the example market data environment. */ public class CdsPricingExample { /** * 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 = createCdsTrades(); // the columns, specifying the measures to be calculated List<Column> columns = ImmutableList.of( Column.of(Measures.PRESENT_VALUE), Column.of(Measures.PAR_RATE), Column.of(CreditMeasures.RECOVERY01), Column.of(CreditMeasures.JUMP_TO_DEFAULT), Column.of(CreditMeasures.IR01_PARALLEL_PAR), Column.of(CreditMeasures.IR01_PARALLEL_ZERO), Column.of(CreditMeasures.CS01_PARALLEL_PAR), Column.of(CreditMeasures.CS01_PARALLEL_HAZARD), Column.of(CreditMeasures.IR01_BUCKETED_PAR), Column.of(CreditMeasures.IR01_BUCKETED_ZERO), Column.of(CreditMeasures.CS01_BUCKETED_PAR), Column.of(CreditMeasures.CS01_BUCKETED_HAZARD)); // use the built-in example market data LocalDate valuationDate = LocalDate.of(2014, 10, 16); ExampleMarketDataBuilder marketDataBuilder = ExampleMarketData.builder(); MarketData marketData = marketDataBuilder.buildSnapshot(valuationDate); // the complete set of rules for calculating measures CalculationFunctions functions = StandardComponents.calculationFunctions(); CalculationRules rules = CalculationRules.of(functions); // the reference data, such as holidays and securities ReferenceData refData = ReferenceData.standard(); // calculate the results Results results = runner.calculate(rules, trades, columns, marketData, refData); // use the report runner to transform the engine results into a trade report ReportCalculationResults calculationResults = ReportCalculationResults.of(valuationDate, trades, columns, results, functions, refData); TradeReportTemplate reportTemplate = ExampleData.loadTradeReportTemplate("cds-report-template"); TradeReport tradeReport = TradeReport.of(calculationResults, reportTemplate); tradeReport.writeAsciiTable(System.out); } //----------------------------------------------------------------------- // create CDS trades private static List<Trade> createCdsTrades() { return ImmutableList.of( createCompany01Cds(), createCompany02Cds(), createIndex0001()); } //----------------------------------------------------------------------- // create a single name CDS with 100 bps coupon private static Trade createCompany01Cds() { return CdsConventions.USD_NORTH_AMERICAN .toTrade( LocalDate.of(2014, 9, 22), LocalDate.of(2019, 12, 20), BuySell.BUY, 100_000_000d, 0.0100, SingleNameReferenceInformation.of( MarkitRedCode.id("COMP01"), SeniorityLevel.SENIOR_UNSECURED_FOREIGN, Currency.USD, RestructuringClause.NO_RESTRUCTURING_2014), 3_694_117.72d, LocalDate.of(2014, 10, 21)); } // create a single name CDS with 500 bps coupon private static Trade createCompany02Cds() { return CdsConventions.USD_NORTH_AMERICAN .toTrade( LocalDate.of(2014, 9, 22), LocalDate.of(2019, 12, 20), BuySell.BUY, 100_000_000d, 0.0500, SingleNameReferenceInformation.of( MarkitRedCode.id("COMP02"), SeniorityLevel.SENIOR_UNSECURED_FOREIGN, Currency.USD, RestructuringClause.NO_RESTRUCTURING_2014), -1_370_582.00d, LocalDate.of(2014, 10, 21)); } // create a index CDS on with 500 bps coupon private static Trade createIndex0001() { return CdsConventions.USD_NORTH_AMERICAN .toTrade( LocalDate.of(2014, 3, 20), LocalDate.of(2019, 6, 20), BuySell.BUY, 100_000_000d, 0.0500, IndexReferenceInformation.of(MarkitRedCode.id("INDEX0001"), 22, 4), 2_000_000d, LocalDate.of(2014, 10, 21)); } }