/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.bond; import static com.opengamma.strata.basics.currency.Currency.EUR; import static com.opengamma.strata.basics.currency.Currency.USD; import static com.opengamma.strata.basics.date.BusinessDayConventions.FOLLOWING; import static com.opengamma.strata.product.common.PutCall.CALL; import java.time.LocalDate; import java.time.LocalTime; import java.time.Period; import java.time.ZoneId; import com.opengamma.strata.basics.StandardId; import com.opengamma.strata.basics.date.BusinessDayAdjustment; import com.opengamma.strata.basics.date.DayCount; import com.opengamma.strata.basics.date.DayCounts; import com.opengamma.strata.basics.date.DaysAdjustment; import com.opengamma.strata.basics.date.HolidayCalendarId; import com.opengamma.strata.basics.date.HolidayCalendarIds; import com.opengamma.strata.basics.schedule.Frequency; import com.opengamma.strata.basics.schedule.PeriodicSchedule; import com.opengamma.strata.basics.schedule.StubConvention; import com.opengamma.strata.product.SecurityId; import com.opengamma.strata.product.TradeInfo; import com.opengamma.strata.product.bond.BondFuture; import com.opengamma.strata.product.bond.BondFutureOption; import com.opengamma.strata.product.bond.BondFutureOptionTrade; import com.opengamma.strata.product.bond.BondFutureTrade; import com.opengamma.strata.product.bond.FixedCouponBond; import com.opengamma.strata.product.bond.FixedCouponBondYieldConvention; import com.opengamma.strata.product.option.FutureOptionPremiumStyle; /** * Data sets of bond, bond future and bond future option. */ public final class BondDataSets { // ===== Fixed coupon bonds, bond future, USD ===== // Fixed coupon bonds private static final StandardId ISSUER_ID_USD = StandardId.of("OG-Ticker", "GOVT1"); private static final FixedCouponBondYieldConvention YIELD_CONVENTION_USD = FixedCouponBondYieldConvention.US_STREET; /** Notional of underlying bond */ public static final double NOTIONAL_USD = 100000.0; private static final HolidayCalendarId CALENDAR_USD = HolidayCalendarIds.SAT_SUN; private static final DaysAdjustment SETTLEMENT_DAYS_USD = DaysAdjustment.ofBusinessDays(1, CALENDAR_USD); private static final DayCount DAY_COUNT_USD = DayCounts.ACT_ACT_ICMA; private static final BusinessDayAdjustment BUSINESS_ADJUST_USD = BusinessDayAdjustment.of(FOLLOWING, CALENDAR_USD); private static final DaysAdjustment EX_COUPON_USD = DaysAdjustment.NONE; private static final int NB_BOND_USD = 7; private static final double[] RATE_USD = new double[] {0.01375, 0.02125, 0.0200, 0.02125, 0.0225, 0.0200, 0.0175 }; private static final LocalDate[] START_DATE_USD = new LocalDate[] {LocalDate.of(2010, 11, 30), LocalDate.of(2010, 12, 31), LocalDate.of(2011, 1, 31), LocalDate.of(2008, 2, 29), LocalDate.of(2011, 3, 31), LocalDate.of(2011, 4, 30), LocalDate.of(2011, 5, 31) }; private static final Period[] BOND_TENOR_USD = new Period[] {Period.ofYears(5), Period.ofYears(5), Period.ofYears(5), Period.ofYears(8), Period.ofYears(5), Period.ofYears(5), Period.ofYears(5) }; private static final StandardId[] BOND_SECURITY_ID = new StandardId[] {StandardId.of("OG-Ticker", "GOVT1-BOND1"), StandardId.of("OG-Ticker", "GOVT1-BOND2"), StandardId.of("OG-Ticker", "GOVT1-BOND3"), StandardId.of("OG-Ticker", "GOVT1-BOND4"), StandardId.of("OG-Ticker", "GOVT1-BOND5"), StandardId.of("OG-Ticker", "GOVT1-BOND6"), StandardId.of("OG-Ticker", "GOVT1-BOND7") }; /** Security link of underlying bond */ public static final FixedCouponBond[] BOND_USD = new FixedCouponBond[NB_BOND_USD]; static { for (int i = 0; i < NB_BOND_USD; ++i) { LocalDate endDate = START_DATE_USD[i].plus(BOND_TENOR_USD[i]); PeriodicSchedule periodSchedule = PeriodicSchedule.of( START_DATE_USD[i], endDate, Frequency.P6M, BUSINESS_ADJUST_USD, StubConvention.SHORT_INITIAL, false); FixedCouponBond product = FixedCouponBond.builder() .securityId(SecurityId.of(BOND_SECURITY_ID[i])) .dayCount(DAY_COUNT_USD) .fixedRate(RATE_USD[i]) .legalEntityId(ISSUER_ID_USD) .currency(USD) .notional(NOTIONAL_USD) .accrualSchedule(periodSchedule) .settlementDateOffset(SETTLEMENT_DAYS_USD) .yieldConvention(YIELD_CONVENTION_USD) .exCouponPeriod(EX_COUPON_USD) .build(); BOND_USD[i] = product; } } // Bond future /** Conversion factors */ public static final Double[] CONVERSION_FACTOR_USD = new Double[] {.8317, .8565, .8493, .8516, .8540, .8417, .8292 }; private static final LocalDate LAST_TRADING_DATE_USD = LocalDate.of(2011, 9, 30); private static final LocalDate FIRST_NOTICE_DATE_USD = LocalDate.of(2011, 8, 31); private static final LocalDate LAST_NOTICE_DATE_USD = LocalDate.of(2011, 10, 4); /** Bond future product */ private static final SecurityId FUTURE_SECURITY_ID_USD = SecurityId.of("OG-Ticker", "GOVT1-BOND-FUT"); public static final BondFuture FUTURE_PRODUCT_USD = BondFuture.builder() .securityId(FUTURE_SECURITY_ID_USD) .deliveryBasket(BOND_USD) .conversionFactors(CONVERSION_FACTOR_USD) .firstNoticeDate(FIRST_NOTICE_DATE_USD) .lastNoticeDate(LAST_NOTICE_DATE_USD) .lastTradeDate(LAST_TRADING_DATE_USD) .build(); /** trade date */ public static final LocalDate TRADE_DATE_USD = LocalDate.of(2011, 6, 19); private static final TradeInfo TRADE_INFO_USD = TradeInfo.builder().tradeDate(TRADE_DATE_USD).build(); /** Quantity of bond future trade */ public static final long QUANTITY_USD = 1234l; /** Bond future trade */ public static final BondFutureTrade FUTURE_TRADE_USD = BondFutureTrade.builder() .info(TRADE_INFO_USD) .product(FUTURE_PRODUCT_USD) .quantity(QUANTITY_USD) .price(1.1d) .build(); /** Reference price */ public static final double SETTLE_PRICE_USD = 1.2345d; // ===== Fixed coupon bonds, bond future, EUR ===== // bond basket private static final StandardId ISSUER_ID_EUR = StandardId.of("OG-Ticker", "GOVT2"); private static final FixedCouponBondYieldConvention YIELD_CONVENTION_EUR = FixedCouponBondYieldConvention.DE_BONDS; /** Notional of underlying bond */ public static final double NOTIONAL_EUR = 100000d; private static final HolidayCalendarId CALENDAR_EUR = HolidayCalendarIds.EUTA; private static final DaysAdjustment SETTLEMENT_DAYS_EUR = DaysAdjustment.ofBusinessDays(3, CALENDAR_EUR); private static final DayCount DAY_COUNT_EUR = DayCounts.ACT_ACT_ICMA; private static final BusinessDayAdjustment BUSINESS_ADJUST_EUR = BusinessDayAdjustment.of(FOLLOWING, CALENDAR_EUR); private static final DaysAdjustment EX_COUPON_EUR = DaysAdjustment.NONE; private static final int NB_BOND_EUR = 3; private static final double[] RATE_EUR = new double[] {0.0375, 0.0350, 0.0100 }; private static final LocalDate[] START_DATE_EUR = new LocalDate[] { LocalDate.of(2013, 1, 4), LocalDate.of(2013, 7, 4), LocalDate.of(2013, 2, 22) }; private static final Period[] BOND_TENOR_EUR = new Period[] {Period.ofYears(6), Period.ofYears(6), Period.ofYears(6) }; private static final StandardId[] BOND_SECURITY_ID_EUR = new StandardId[] {StandardId.of("OG-Ticker", "GOVT2-BOND1"), StandardId.of("OG-Ticker", "GOVT2-BOND2"), StandardId.of("OG-Ticker", "GOVT2-BOND3") }; public static final FixedCouponBond[] BOND_EUR = new FixedCouponBond[NB_BOND_EUR]; static { for (int i = 0; i < NB_BOND_EUR; ++i) { LocalDate endDate = START_DATE_EUR[i].plus(BOND_TENOR_EUR[i]); PeriodicSchedule periodSchedule = PeriodicSchedule.of( START_DATE_EUR[i], endDate, Frequency.P12M, BUSINESS_ADJUST_EUR, StubConvention.SHORT_INITIAL, false); FixedCouponBond product = FixedCouponBond.builder() .securityId(SecurityId.of(BOND_SECURITY_ID_EUR[i])) .dayCount(DAY_COUNT_EUR) .fixedRate(RATE_EUR[i]) .legalEntityId(ISSUER_ID_EUR) .currency(EUR) .notional(NOTIONAL_EUR) .accrualSchedule(periodSchedule) .settlementDateOffset(SETTLEMENT_DAYS_EUR) .yieldConvention(YIELD_CONVENTION_EUR) .exCouponPeriod(EX_COUPON_EUR) .build(); BOND_EUR[i] = product; } } // Underlying future private static final Double[] CONVERSION_FACTOR_EUR = new Double[] {0.912067, 0.893437, 0.800111 }; private static final LocalDate LAST_TRADING_DATE_EUR = LocalDate.of(2014, 6, 6); private static final LocalDate FIRST_NOTICE_DATE_EUR = LocalDate.of(2014, 6, 6); private static final LocalDate LAST_NOTICE_DATE_EUR = LocalDate.of(2014, 6, 6); public static final SecurityId FUTURE_SECURITY_ID_EUR = SecurityId.of("OG-Ticker", "GOVT2-BOND-FUT"); private static final BondFuture FUTURE_PRODUCT_EUR = BondFuture.builder() .securityId(FUTURE_SECURITY_ID_EUR) .deliveryBasket(BOND_EUR) .conversionFactors(CONVERSION_FACTOR_EUR) .firstNoticeDate(FIRST_NOTICE_DATE_EUR) .lastNoticeDate(LAST_NOTICE_DATE_EUR) .lastTradeDate(LAST_TRADING_DATE_EUR) .build(); // future option private static final LocalDate EXPIRY_DATE_EUR = LocalDate.of(2014, 6, 5); private static final LocalTime EXPIRY_TIME_EUR = LocalTime.of(0, 0); private static final ZoneId EXPIRY_ZONE_EUR = ZoneId.of("Z"); private static final double STRIKE_PRICE_116 = 1.16; /** Bond future option product, strike = 1.16 */ private static final SecurityId OPTION_SECURITY_ID_116 = SecurityId.of("OG-Ticker", "GOVT1-BOND-FUT-OPT-116"); public static final BondFutureOption FUTURE_OPTION_PRODUCT_EUR_116 = BondFutureOption.builder() .securityId(OPTION_SECURITY_ID_116) .putCall(CALL) .strikePrice(STRIKE_PRICE_116) .expiryDate(EXPIRY_DATE_EUR) .expiryTime(EXPIRY_TIME_EUR) .expiryZone(EXPIRY_ZONE_EUR) .premiumStyle(FutureOptionPremiumStyle.DAILY_MARGIN) .underlyingFuture(FUTURE_PRODUCT_EUR) .build(); private static final double STRIKE_PRICE_115 = 1.15; /** Bond future option product, strike = 1.15 */ private static final SecurityId OPTION_SECURITY_ID_115 = SecurityId.of("OG-Ticker", "GOVT1-BOND-FUT-OPT-115"); public static final BondFutureOption FUTURE_OPTION_PRODUCT_EUR_115 = BondFutureOption.builder() .securityId(OPTION_SECURITY_ID_115) .putCall(CALL) .strikePrice(STRIKE_PRICE_115) .expiryDate(EXPIRY_DATE_EUR) .expiryTime(EXPIRY_TIME_EUR) .expiryZone(EXPIRY_ZONE_EUR) .premiumStyle(FutureOptionPremiumStyle.DAILY_MARGIN) .underlyingFuture(FUTURE_PRODUCT_EUR) .build(); private static final LocalDate TRADE_DATE = LocalDate.of(2014, 3, 31); private static final TradeInfo TRADE_INFO = TradeInfo.builder().tradeDate(TRADE_DATE).build(); /** Quantity of bond future trade */ public static final long QUANTITY_EUR = 1234L; /** Bond future option trade */ public static final BondFutureOptionTrade FUTURE_OPTION_TRADE_EUR = BondFutureOptionTrade.builder() .info(TRADE_INFO) .product(FUTURE_OPTION_PRODUCT_EUR_115) .quantity(QUANTITY_EUR) .price(0.01) .build(); }