/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.conversion;
import static com.opengamma.financial.convention.InMemoryConventionBundleMaster.simpleNameSecurityId;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedCompoundedONCompounded;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.index.IndexON;
import com.opengamma.analytics.financial.instrument.swap.SwapFixedCompoundedONCompoundedDefinition;
import com.opengamma.analytics.financial.instrument.swap.SwapFixedIborDefinition;
import com.opengamma.analytics.financial.instrument.swaption.SwaptionCashFixedCompoundedONCompoundingDefinition;
import com.opengamma.analytics.financial.instrument.swaption.SwaptionCashFixedIborDefinition;
import com.opengamma.analytics.financial.instrument.swaption.SwaptionPhysicalFixedCompoundedONCompoundedDefinition;
import com.opengamma.analytics.financial.instrument.swaption.SwaptionPhysicalFixedIborDefinition;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.region.RegionSource;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.analytics.fixedincome.InterestRateInstrumentType;
import com.opengamma.financial.convention.ConventionBundle;
import com.opengamma.financial.convention.ConventionBundleSource;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.frequency.Frequency;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.option.SwaptionSecurity;
import com.opengamma.financial.security.swap.FixedInterestRateLeg;
import com.opengamma.financial.security.swap.FloatingInterestRateLeg;
import com.opengamma.financial.security.swap.InterestRateNotional;
import com.opengamma.financial.security.swap.SwapLeg;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
/**
* Converts swaptions from {@link SwaptionSecurity} to the {@link InstrumentDefinition}s.
* @deprecated Replaced by {@link SwaptionSecurityConverter}, which does not use curve name information
*/
@Deprecated
public class SwaptionSecurityConverterDeprecated extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> {
/** The security source */
private final SecuritySource _securitySource;
/** The region source */
private final RegionSource _regionSource;
/** The holiday source */
private final HolidaySource _holidaySource;
/** The convention bundle source */
private final ConventionBundleSource _conventionSource;
/**
* @param securitySource The security source, not null
* @param swapConverter The underlying swap converter, not null
*/
public SwaptionSecurityConverterDeprecated(final SecuritySource securitySource, final SwapSecurityConverterDeprecated swapConverter) {
this(securitySource, swapConverter.getConventionBundleSource(), swapConverter.getHolidaySource(), swapConverter.getRegionSource());
}
/**
* @param securitySource The security source, not null
* @param conventionSource The convention source, not null
* @param holidaySource The holiday source, not null
* @param regionSource The region source, not null
*/
public SwaptionSecurityConverterDeprecated(final SecuritySource securitySource, final ConventionBundleSource conventionSource,
final HolidaySource holidaySource, final RegionSource regionSource) {
ArgumentChecker.notNull(securitySource, "securitySource");
ArgumentChecker.notNull(conventionSource, "conventionSource");
ArgumentChecker.notNull(holidaySource, "holidaySource");
ArgumentChecker.notNull(regionSource, "regionSource");
_securitySource = securitySource;
_conventionSource = conventionSource;
_holidaySource = holidaySource;
_regionSource = regionSource;
}
@Override
public InstrumentDefinition<?> visitSwaptionSecurity(final SwaptionSecurity swaptionSecurity) {
ArgumentChecker.notNull(swaptionSecurity, "swaption security");
final ExternalId underlyingIdentifier = swaptionSecurity.getUnderlyingId();
final ZonedDateTime expiry = swaptionSecurity.getExpiry().getExpiry();
final SwapSecurity underlyingSecurity = (SwapSecurity) _securitySource.getSingle(ExternalIdBundle.of(underlyingIdentifier));
final InterestRateInstrumentType swapType = SwapSecurityUtils.getSwapType(underlyingSecurity);
final boolean isCashSettled = swaptionSecurity.isCashSettled();
final boolean isLong = swaptionSecurity.isLong();
final boolean isCall = underlyingSecurity.getPayLeg() instanceof FixedInterestRateLeg;
if (swaptionSecurity.getCurrency().equals(Currency.BRL)) {
final SwapFixedCompoundedONCompoundedDefinition swapDefinition = getBRLSwapDefinition(underlyingSecurity, isCall);
return isCashSettled ? SwaptionCashFixedCompoundedONCompoundingDefinition.from(expiry, swapDefinition, isCall, isLong) :
SwaptionPhysicalFixedCompoundedONCompoundedDefinition.from(expiry, swapDefinition, isCall, isLong);
}
if (swapType != InterestRateInstrumentType.SWAP_FIXED_IBOR) {
throw new OpenGammaRuntimeException("Underlying swap of a swaption must be a fixed / ibor swap; have " + swapType);
}
final SwapFixedIborDefinition underlyingSwap = getFixedIborSwapDefinition(underlyingSecurity, SwapSecurityUtils.payFixed(underlyingSecurity));
return isCashSettled ? SwaptionCashFixedIborDefinition.from(expiry, underlyingSwap, isCall, isLong)
: SwaptionPhysicalFixedIborDefinition.from(expiry, underlyingSwap, isCall, isLong);
}
private SwapFixedCompoundedONCompoundedDefinition getBRLSwapDefinition(final SwapSecurity swapSecurity, final boolean payFixed) {
final ZonedDateTime effectiveDate = swapSecurity.getEffectiveDate();
final ZonedDateTime maturityDate = swapSecurity.getMaturityDate();
final SwapLeg payLeg = swapSecurity.getPayLeg();
final SwapLeg receiveLeg = swapSecurity.getReceiveLeg();
final FixedInterestRateLeg fixedLeg = (FixedInterestRateLeg) (payFixed ? payLeg : receiveLeg);
final FloatingInterestRateLeg floatLeg = (FloatingInterestRateLeg) (payFixed ? receiveLeg : payLeg);
final ExternalId regionId = payLeg.getRegionId();
final Calendar calendar = CalendarUtils.getCalendar(_regionSource, _holidaySource, regionId);
final ConventionBundle indexConvention = _conventionSource.getConventionBundle(floatLeg.getFloatingReferenceRateId());
final Currency currency = ((InterestRateNotional) payLeg.getNotional()).getCurrency();
if (indexConvention == null) {
throw new OpenGammaRuntimeException("Could not get OIS index convention for " + currency + " using " + floatLeg.getFloatingReferenceRateId());
}
final Integer publicationLag = indexConvention.getOvernightIndexSwapPublicationLag();
if (publicationLag == null) {
throw new OpenGammaRuntimeException("Could not get ON Index publication lag for " + indexConvention.getIdentifiers());
}
final ConventionBundle brlSwapConvention = _conventionSource.getConventionBundle(simpleNameSecurityId("BRL_DI_SWAP"));
final IndexON index = new IndexON(floatLeg.getFloatingReferenceRateId().getValue(), currency, indexConvention.getDayCount(), publicationLag);
final String name = index.getName();
final DayCount fixedLegDayCount = fixedLeg.getDayCount();
final BusinessDayConvention businessDayConvention = fixedLeg.getBusinessDayConvention();
final boolean isEOM = fixedLeg.isEom();
final int spotLag = brlSwapConvention.getSwapFixedLegSettlementDays();
final int paymentLag = brlSwapConvention.getSwapFixedLegSettlementDays();
final double notional = ((InterestRateNotional) fixedLeg.getNotional()).getAmount();
final double fixedRate = fixedLeg.getRate();
final GeneratorSwapFixedCompoundedONCompounded generator = new GeneratorSwapFixedCompoundedONCompounded(name, index, fixedLegDayCount, businessDayConvention, isEOM, spotLag, paymentLag, calendar);
return SwapFixedCompoundedONCompoundedDefinition.from(effectiveDate, maturityDate, notional, generator, fixedRate, payFixed);
}
/**
* Creates a fixed / ibor swap definition.
* @param swapSecurity The swap security
* @param payFixed True if the underlying swap is payer
* @return The swap definition
*/
private SwapFixedIborDefinition getFixedIborSwapDefinition(final SwapSecurity swapSecurity, final boolean payFixed) {
final ZonedDateTime effectiveDate = swapSecurity.getEffectiveDate();
final ZonedDateTime maturityDate = swapSecurity.getMaturityDate();
final SwapLeg payLeg = swapSecurity.getPayLeg();
final SwapLeg receiveLeg = swapSecurity.getReceiveLeg();
final FixedInterestRateLeg fixedLeg = (FixedInterestRateLeg) (payFixed ? payLeg : receiveLeg);
final FloatingInterestRateLeg iborLeg = (FloatingInterestRateLeg) (payFixed ? receiveLeg : payLeg);
final ExternalId regionId = payLeg.getRegionId();
final Calendar calendar = CalendarUtils.getCalendar(_regionSource, _holidaySource, regionId);
final Currency currency = ((InterestRateNotional) payLeg.getNotional()).getCurrency();
final ConventionBundle iborIndexConvention = _conventionSource.getConventionBundle(iborLeg.getFloatingReferenceRateId());
if (iborIndexConvention == null) {
throw new OpenGammaRuntimeException("Could not get Ibor index convention for " + currency + " using " + iborLeg.getFloatingReferenceRateId() + " from swap " +
swapSecurity.getExternalIdBundle());
}
final Frequency freqIbor = iborLeg.getFrequency();
final Period tenorIbor;
if (freqIbor.getName() == Frequency.NEVER_NAME) {
tenorIbor = Period.between(effectiveDate.toLocalDate(), maturityDate.toLocalDate());
} else {
tenorIbor = ConversionUtils.getTenor(freqIbor);
}
final IborIndex indexIbor = new IborIndex(currency, tenorIbor, iborIndexConvention.getSettlementDays(), iborIndexConvention.getDayCount(),
iborIndexConvention.getBusinessDayConvention(), iborIndexConvention.isEOMConvention(), iborIndexConvention.getName());
final Frequency freqFixed = fixedLeg.getFrequency();
final Period tenorFixed;
if (freqIbor.getName() == Frequency.NEVER_NAME) {
tenorFixed = Period.between(effectiveDate.toLocalDate(), maturityDate.toLocalDate());
} else {
tenorFixed = ConversionUtils.getTenor(freqFixed);
}
final double fixedLegNotional = ((InterestRateNotional) fixedLeg.getNotional()).getAmount();
final double iborLegNotional = ((InterestRateNotional) iborLeg.getNotional()).getAmount();
final SwapFixedIborDefinition swap = SwapFixedIborDefinition.from(effectiveDate, maturityDate, tenorFixed, fixedLeg.getDayCount(), fixedLeg.getBusinessDayConvention(), fixedLeg.isEom(),
fixedLegNotional, fixedLeg.getRate(), tenorIbor, iborLeg.getDayCount(), iborLeg.getBusinessDayConvention(), iborLeg.isEom(), iborLegNotional, indexIbor, payFixed, calendar);
return swap;
}
}