/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.solutions.util; import com.google.common.collect.ImmutableList; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.link.ConfigLink; import com.opengamma.core.position.Counterparty; import com.opengamma.core.position.impl.SimpleCounterparty; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.financial.analytics.curve.exposure.ExposureFunctions; import com.opengamma.financial.convention.daycount.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.financial.convention.frequency.Frequency; import com.opengamma.financial.convention.frequency.PeriodFrequency; import com.opengamma.financial.convention.yield.SimpleYieldConvention; import com.opengamma.financial.convention.yield.YieldConvention; import com.opengamma.financial.currency.CurrencyMatrix; import com.opengamma.financial.security.bond.BondSecurity; import com.opengamma.financial.security.bond.GovernmentBondSecurity; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.sesame.DefaultCurveNodeConverterFn; import com.opengamma.sesame.DefaultDiscountingIssuerProviderBundleFn; import com.opengamma.sesame.ExposureFunctionsIssuerProviderFn; import com.opengamma.sesame.IssuerProviderBundleFn; import com.opengamma.sesame.IssuerProviderFn; import com.opengamma.sesame.MarketExposureSelector; import com.opengamma.sesame.RootFinderConfiguration; import com.opengamma.sesame.bond.BondFn; import com.opengamma.sesame.bond.DiscountingBondFn; import com.opengamma.sesame.component.RetrievalPeriod; import com.opengamma.sesame.component.StringSet; import com.opengamma.sesame.config.ViewColumn; import com.opengamma.sesame.marketdata.DefaultHistoricalMarketDataFn; import com.opengamma.sesame.marketdata.DefaultMarketDataFn; import com.opengamma.sesame.trade.BondTrade; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.time.DateUtils; import com.opengamma.util.time.Expiry; import org.threeten.bp.LocalDate; import org.threeten.bp.LocalTime; import org.threeten.bp.OffsetTime; import org.threeten.bp.Period; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import java.math.BigDecimal; import java.util.List; import static com.opengamma.sesame.config.ConfigBuilder.argument; import static com.opengamma.sesame.config.ConfigBuilder.arguments; import static com.opengamma.sesame.config.ConfigBuilder.column; import static com.opengamma.sesame.config.ConfigBuilder.config; import static com.opengamma.sesame.config.ConfigBuilder.function; import static com.opengamma.sesame.config.ConfigBuilder.implementations; /** * Utility class for bond views */ public final class BondViewUtils { private BondViewUtils() { /* private constructor */ } /** * Utility for creating a fra specific view column * @param columnName column output name, not null * @param output output name, not null * @param exposureConfig exposure function config, not null * @param currencyMatrixLink currency matrix config, not null */ public static ViewColumn createBondViewColumn(String columnName, String output, ConfigLink<ExposureFunctions> exposureConfig, ConfigLink<CurrencyMatrix> currencyMatrixLink) { ArgumentChecker.notNull(columnName, "column name"); ArgumentChecker.notNull(output, "output"); ArgumentChecker.notNull(exposureConfig, "exposureConfig"); ArgumentChecker.notNull(currencyMatrixLink, "currencyMatrixLink"); return column( columnName, output, config( arguments( function( MarketExposureSelector.class, argument("exposureFunctions", exposureConfig)), function( RootFinderConfiguration.class, argument("rootFinderAbsoluteTolerance", 1e-10), argument("rootFinderRelativeTolerance", 1e-10), argument("rootFinderMaxIterations", 1000)), function( DefaultCurveNodeConverterFn.class, argument("timeSeriesDuration", RetrievalPeriod.of(Period.ofYears(1)))), function( DefaultHistoricalMarketDataFn.class, argument("dataSource", "BLOOMBERG"), argument("currencyMatrix", currencyMatrixLink)), function( DefaultMarketDataFn.class, argument("dataSource", "BLOOMBERG"), argument("currencyMatrix", currencyMatrixLink)), function( DefaultDiscountingIssuerProviderBundleFn.class, argument("impliedCurveNames", StringSet.of()))), implementations( BondFn.class, DiscountingBondFn.class, IssuerProviderBundleFn.class, DefaultDiscountingIssuerProviderBundleFn.class, IssuerProviderFn.class, ExposureFunctionsIssuerProviderFn.class))); } /** List of Bond inputs */ public static final List<Object> BOND_INPUTS = ImmutableList.<Object>of(createGovernmentBondTradeSpot(), createGovernmentBondTradePast(), createGovernmentBondTradeFwd()); private static BondTrade createGovernmentBondTradeSpot() { Counterparty counterparty = new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "COUNTERPARTY")); BigDecimal tradeQuantity = BigDecimal.valueOf(10_000_000); LocalDate tradeDate = LocalDate.of(2014, 7, 11); OffsetTime tradeTime = OffsetTime.of(LocalTime.of(0, 0), ZoneOffset.UTC); SimpleTrade trade = new SimpleTrade(createGovernmentBondSecurityUK(), tradeQuantity, counterparty, tradeDate, tradeTime); trade.setPremium(0.99); trade.setPremiumDate(LocalDate.of(2014, 7, 16)); trade.setPremiumCurrency(Currency.GBP); return new BondTrade(trade); } private static BondTrade createGovernmentBondTradePast() { Counterparty counterparty = new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "COUNTERPARTY")); BigDecimal tradeQuantity = BigDecimal.valueOf(10_000_000); LocalDate tradeDate = LocalDate.of(2014, 7, 9); OffsetTime tradeTime = OffsetTime.of(LocalTime.of(0, 0), ZoneOffset.UTC); SimpleTrade trade = new SimpleTrade(createGovernmentBondSecurityUK(), tradeQuantity, counterparty, tradeDate, tradeTime); trade.setPremium(0.99); trade.setPremiumDate(LocalDate.of(2014, 7, 10)); trade.setPremiumCurrency(Currency.GBP); return new BondTrade(trade); } private static BondTrade createGovernmentBondTradeFwd() { Counterparty counterparty = new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "COUNTERPARTY")); BigDecimal tradeQuantity = BigDecimal.valueOf(10_000_000); LocalDate tradeDate = LocalDate.of(2014, 7, 11); OffsetTime tradeTime = OffsetTime.of(LocalTime.of(0, 0), ZoneOffset.UTC); SimpleTrade trade = new SimpleTrade(createGovernmentBondSecurityUK(), tradeQuantity, counterparty, tradeDate, tradeTime); trade.setPremium(0.99); trade.setPremiumDate(LocalDate.of(2014, 7, 25)); trade.setPremiumCurrency(Currency.GBP); return new BondTrade(trade); } private static BondSecurity createGovernmentBondSecurityUK() { // TODO: only 1 security for 3 trade? String issuerName = "UK TREASURY"; String issuerDomicile = "GB"; String issuerType = "Sovereign"; Currency currency = Currency.GBP; YieldConvention yieldConvention = SimpleYieldConvention.UK_BUMP_DMO_METHOD; DayCount dayCountConvention = DayCounts.ACT_ACT_ICMA; Period couponPeriod = Period.parse("P6M"); String couponType = "Fixed"; double couponRate = 8.0; Frequency couponFrequency = PeriodFrequency.of(couponPeriod); ZonedDateTime maturityDate = DateUtils.getUTCDate(2021, 6, 7); ZonedDateTime firstCouponDate = DateUtils.getUTCDate(2011, 12, 7); ZonedDateTime interestAccrualDate = DateUtils.getUTCDate(2011, 6, 7); ZonedDateTime settlementDate = DateUtils.getUTCDate(2011, 6, 7); Expiry lastTradeDate = new Expiry(maturityDate); double issuancePrice = 100; double totalAmountIssued = 32980000000.0; double minimumAmount = 100; double minimumIncrement = 100; double parAmount = 100; double redemptionValue = 100; GovernmentBondSecurity bond = new GovernmentBondSecurity(issuerName, issuerType, issuerDomicile, issuerType, currency, yieldConvention, lastTradeDate, couponType, couponRate, couponFrequency, dayCountConvention, interestAccrualDate, settlementDate, firstCouponDate, issuancePrice, totalAmountIssued, minimumAmount, minimumIncrement, parAmount, redemptionValue); ExternalId isinId = ExternalSchemes.isinSecurityId("GB0009997999"); ExternalId bloombergId = ExternalSchemes.bloombergTickerSecurityId("UKT 8 2021-06-07 Govt"); bond.setExternalIdBundle(ExternalIdBundle.of(isinId, bloombergId)); return bond; } private static BondSecurity createGovernmentBondSecurityUS() { String issuerName = "US TREASURY N/B"; String issuerDomicile = "US"; String issuerType = "Sovereign"; Currency currency = Currency.USD; YieldConvention yieldConvention = SimpleYieldConvention.US_STREET; DayCount dayCountConvention = DayCounts.ACT_ACT_ICMA; Period couponPeriod = Period.parse("P6M"); String couponType = "Fixed"; double couponRate = 5.0; Frequency couponFrequency = PeriodFrequency.of(couponPeriod); ZonedDateTime maturityDate = DateUtils.getUTCDate(2014, 8, 15); ZonedDateTime firstCouponDate = DateUtils.getUTCDate(2012, 2, 15); ZonedDateTime interestAccrualDate = DateUtils.getUTCDate(2011, 8, 15); ZonedDateTime settlementDate = DateUtils.getUTCDate(2014, 8, 17); Expiry lastTradeDate = new Expiry(maturityDate); double issuancePrice = 100; double totalAmountIssued = 32980000000.0; double minimumAmount = 100; double minimumIncrement = 100; double parAmount = 100; double redemptionValue = 100; GovernmentBondSecurity bond = new GovernmentBondSecurity(issuerName, issuerType, issuerDomicile, issuerType, currency, yieldConvention, lastTradeDate, couponType, couponRate, couponFrequency, dayCountConvention, interestAccrualDate, settlementDate, firstCouponDate, issuancePrice, totalAmountIssued, minimumAmount, minimumIncrement, parAmount, redemptionValue); ExternalId isinId = ExternalSchemes.isinSecurityId("US912828RB87"); ExternalId bloombergId = ExternalSchemes.bloombergTickerSecurityId("T 0.5 08/15/14 Govt"); bond.setExternalIdBundle(ExternalIdBundle.of(isinId, bloombergId)); return bond; } }