/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.examples; import static com.opengamma.strata.basics.currency.Currency.GBP; import static com.opengamma.strata.basics.currency.Currency.USD; 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.StandardId; import com.opengamma.strata.basics.currency.CurrencyAmount; import com.opengamma.strata.basics.currency.FxRate; import com.opengamma.strata.basics.date.AdjustableDate; 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.measure.Measures; import com.opengamma.strata.measure.StandardComponents; import com.opengamma.strata.product.Trade; import com.opengamma.strata.product.TradeAttributeType; import com.opengamma.strata.product.TradeInfo; import com.opengamma.strata.product.common.PayReceive; import com.opengamma.strata.product.fx.FxSingle; import com.opengamma.strata.product.fx.FxSingleTrade; import com.opengamma.strata.product.fx.FxSwap; import com.opengamma.strata.product.fx.FxSwapTrade; import com.opengamma.strata.product.payment.BulletPayment; import com.opengamma.strata.product.payment.BulletPaymentTrade; 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 FX trades. * <p> * This makes use of the example engine and the example market data environment. * A bullet payment trade is also included. */ public class FxPricingExample { /** * 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 = ImmutableList.of(createTrade1(), createTrade2(), createTrade3(), createTrade4()); // the columns, specifying the measures to be calculated List<Column> columns = ImmutableList.of( Column.of(Measures.PRESENT_VALUE), Column.of(Measures.PV01_CALIBRATED_SUM), Column.of(Measures.PV01_CALIBRATED_BUCKETED)); // use the built-in example market data LocalDate valuationDate = LocalDate.of(2014, 1, 22); 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, marketDataBuilder.ratesLookup(valuationDate)); // 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("fx-report-template"); TradeReport tradeReport = TradeReport.of(calculationResults, reportTemplate); tradeReport.writeAsciiTable(System.out); } //----------------------------------------------------------------------- // create an FX Forward trade private static Trade createTrade1() { FxSingle fx = FxSingle.of(CurrencyAmount.of(GBP, 10000), FxRate.of(GBP, USD, 1.62), LocalDate.of(2014, 9, 14)); return FxSingleTrade.builder() .product(fx) .info(TradeInfo.builder() .id(StandardId.of("example", "1")) .addAttribute(TradeAttributeType.DESCRIPTION, "GBP 10,000/USD @ 1.62 fwd") .counterparty(StandardId.of("example", "BigBankA")) .settlementDate(LocalDate.of(2014, 9, 15)) .build()) .build(); } // create an FX Forward trade private static Trade createTrade2() { FxSingle fx = FxSingle.of(CurrencyAmount.of(USD, 15000), FxRate.of(GBP, USD, 1.62), LocalDate.of(2014, 9, 14)); return FxSingleTrade.builder() .product(fx) .info(TradeInfo.builder() .id(StandardId.of("example", "2")) .addAttribute(TradeAttributeType.DESCRIPTION, "USD 15,000/GBP @ 1.62 fwd") .counterparty(StandardId.of("example", "BigBankB")) .settlementDate(LocalDate.of(2014, 9, 15)) .build()) .build(); } // create an FX Swap trade private static Trade createTrade3() { FxSwap swap = FxSwap.ofForwardPoints( CurrencyAmount.of(GBP, 10000), FxRate.of(GBP, USD, 1.62), 0.03, LocalDate.of(2014, 6, 14), LocalDate.of(2014, 9, 14)); return FxSwapTrade.builder() .product(swap) .info(TradeInfo.builder() .id(StandardId.of("example", "3")) .addAttribute(TradeAttributeType.DESCRIPTION, "GBP 10,000/USD @ 1.62 swap") .counterparty(StandardId.of("example", "BigBankA")) .settlementDate(LocalDate.of(2014, 9, 15)) .build()) .build(); } // create a Bullet Payment trade private static Trade createTrade4() { BulletPayment bp = BulletPayment.builder() .payReceive(PayReceive.PAY) .value(CurrencyAmount.of(GBP, 20_000)) .date(AdjustableDate.of(LocalDate.of(2014, 9, 16))) .build(); return BulletPaymentTrade.builder() .product(bp) .info(TradeInfo.builder() .id(StandardId.of("example", "4")) .addAttribute(TradeAttributeType.DESCRIPTION, "Bullet payment GBP 20,000") .counterparty(StandardId.of("example", "BigBankC")) .settlementDate(LocalDate.of(2014, 9, 16)) .build()) .build(); } }