/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.aggregation;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.opengamma.core.position.Position;
import com.opengamma.core.position.impl.SimplePositionComparator;
import com.opengamma.core.security.Security;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitor;
import com.opengamma.financial.security.bond.BillSecurity;
import com.opengamma.financial.security.bond.CorporateBondSecurity;
import com.opengamma.financial.security.bond.FloatingRateNoteSecurity;
import com.opengamma.financial.security.bond.GovernmentBondSecurity;
import com.opengamma.financial.security.bond.InflationBondSecurity;
import com.opengamma.financial.security.bond.MunicipalBondSecurity;
import com.opengamma.financial.security.capfloor.CapFloorCMSSpreadSecurity;
import com.opengamma.financial.security.capfloor.CapFloorSecurity;
import com.opengamma.financial.security.cash.CashBalanceSecurity;
import com.opengamma.financial.security.cash.CashSecurity;
import com.opengamma.financial.security.cashflow.CashFlowSecurity;
import com.opengamma.financial.security.cds.CDSSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexDefinitionSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexSecurity;
import com.opengamma.financial.security.cds.LegacyFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.LegacyRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.LegacyVanillaCDSSecurity;
import com.opengamma.financial.security.cds.StandardFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.StandardRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.StandardVanillaCDSSecurity;
import com.opengamma.financial.security.credit.IndexCDSDefinitionSecurity;
import com.opengamma.financial.security.credit.IndexCDSSecurity;
import com.opengamma.financial.security.credit.LegacyCDSSecurity;
import com.opengamma.financial.security.credit.StandardCDSSecurity;
import com.opengamma.financial.security.deposit.ContinuousZeroDepositSecurity;
import com.opengamma.financial.security.deposit.PeriodicZeroDepositSecurity;
import com.opengamma.financial.security.deposit.SimpleZeroDepositSecurity;
import com.opengamma.financial.security.equity.AmericanDepositaryReceiptSecurity;
import com.opengamma.financial.security.equity.EquitySecurity;
import com.opengamma.financial.security.equity.EquityVarianceSwapSecurity;
import com.opengamma.financial.security.equity.ExchangeTradedFundSecurity;
import com.opengamma.financial.security.forward.AgricultureForwardSecurity;
import com.opengamma.financial.security.forward.EnergyForwardSecurity;
import com.opengamma.financial.security.forward.MetalForwardSecurity;
import com.opengamma.financial.security.fra.FRASecurity;
import com.opengamma.financial.security.fra.ForwardRateAgreementSecurity;
import com.opengamma.financial.security.future.AgricultureFutureSecurity;
import com.opengamma.financial.security.future.BondFutureSecurity;
import com.opengamma.financial.security.future.DeliverableSwapFutureSecurity;
import com.opengamma.financial.security.future.EnergyFutureSecurity;
import com.opengamma.financial.security.future.EquityFutureSecurity;
import com.opengamma.financial.security.future.EquityIndexDividendFutureSecurity;
import com.opengamma.financial.security.future.FXFutureSecurity;
import com.opengamma.financial.security.future.FederalFundsFutureSecurity;
import com.opengamma.financial.security.future.IndexFutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.financial.security.future.MetalFutureSecurity;
import com.opengamma.financial.security.future.StockFutureSecurity;
import com.opengamma.financial.security.fx.FXForwardSecurity;
import com.opengamma.financial.security.fx.FXVolatilitySwapSecurity;
import com.opengamma.financial.security.fx.NonDeliverableFXForwardSecurity;
import com.opengamma.financial.security.irs.InterestRateSwapSecurity;
import com.opengamma.financial.security.option.BondFutureOptionSecurity;
import com.opengamma.financial.security.option.CommodityFutureOptionSecurity;
import com.opengamma.financial.security.option.CreditDefaultSwapOptionSecurity;
import com.opengamma.financial.security.option.EquityBarrierOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexDividendFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexOptionSecurity;
import com.opengamma.financial.security.option.EquityOptionSecurity;
import com.opengamma.financial.security.option.EquityWarrantSecurity;
import com.opengamma.financial.security.option.FXBarrierOptionSecurity;
import com.opengamma.financial.security.option.FXDigitalOptionSecurity;
import com.opengamma.financial.security.option.FXOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXDigitalOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXOptionSecurity;
import com.opengamma.financial.security.option.SwaptionSecurity;
import com.opengamma.financial.security.swap.BillTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.BondTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.EquityTotalReturnSwapSecurity;
import com.opengamma.financial.security.swap.ForwardSwapSecurity;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.financial.security.swap.YearOnYearInflationSwapSecurity;
import com.opengamma.financial.security.swap.ZeroCouponInflationSwapSecurity;
import com.opengamma.financial.sensitivities.SecurityEntryData;
import com.opengamma.master.security.RawSecurity;
/**
* Function to classify positions by asset class. Note that this bins all types of options together.
* For more detailed subdivision, see DetailedAssetClassAggregationFunction.
* @author jim
*/
public class AssetClassAggregationFunction implements AggregationFunction<String> {
/* package */static final String FX_OPTIONS = "FX Options";
/* package */static final String NONDELIVERABLE_FX_OPTIONS = "Non-deliverable FX Options";
/* package */static final String FX_BARRIER_OPTIONS = "FX Barrier Options";
/* package */static final String BONDS = "Bonds";
/* package */static final String CASH = "Cash";
/* package */static final String CASHFLOW = "CashFlow";
/* package */static final String EQUITIES = "Equities";
/* package */static final String FRAS = "FRAs";
/* package */static final String FUTURES = "Futures";
/* package */static final String FORWARDS = "Forwards";
/* package */static final String EQUITY_INDEX_OPTIONS = "Equity Index Options";
/* package */static final String EQUITY_OPTIONS = "Equity Options";
/* package */static final String EQUITY_BARRIER_OPTIONS = "Equity Barrier Options";
/* package */static final String EQUITY_VARIANCE_SWAPS = "Equity Variance Swaps";
/* package */static final String SWAPTIONS = "Swaptions";
/* package */static final String IRFUTURE_OPTIONS = "IR Future Options";
/* package */static final String COMMODITY_FUTURE_OPTIONS = "Commodity Future Options";
/* package */static final String FX_FUTURE_OPTIONS = "FX Future Options";
/* package */static final String BOND_FUTURE_OPTIONS = "Bond Future Options";
/* package */static final String EQUITY_INDEX_DIVIDEND_FUTURE_OPTIONS = "Equity Index Dividend Future Options";
/* package */static final String SWAPS = "Swaps";
/* package */static final String FX_FORWARDS = "FX Forwards";
/* package */static final String FX_DIGITAL_OPTIONS = "FX Digital Options";
/* package */static final String NONDELIVERABLE_FX_DIGITAL_OPTIONS = "Non-deliverable FX Digital Options";
/* package */static final String NONDELIVERABLE_FX_FORWARDS = "Non-deliverable FX Forwards";
/* package */static final String CAP_FLOOR = "Cap/Floor";
/* package */static final String CAP_FLOOR_CMS_SPREAD = "Cap/Floor CMS Spread";
/* package */static final String UNKNOWN = "Unknown Security Type";
/* package */static final String NAME = "Asset Class";
/* package */static final String CDS = "CDS"; // TODO: is this the correct abbreviation?
/* package */static final String EQUITY_INDEX_FUTURE_OPTIONS = "Equity Index Future Options";
/* package */static final String DELIVERABLE_SWAP_FUTURES = "Deliverable Swap Futures";
/* package */static final String CDX = "CDS Indices";
/* package */static final String CREDIT_DEFAULT_SWAP_OPTIONS = "CDS Options";
/* package */static final String INFLATION_SWAPS = "Inflation Swaps";
/* package */static final String FX_VOLATILITY_SWAPS = "FX Volatility Swaps";
/* package */static final String EXCHANGE_TRADED_FUNDS = "Exchange-Traded Funds";
/* package */static final String ADRS = "American Depositary Receipts";
/* package */static final String EQUITY_WARRANTS = "Equity Warrants";
/* package */static final String BILLS = "Bills";
/* package */static final String FLOATING_RATE_NOTES = "Floating Rate Notes";
/* package */static final String CASH_BALANCE = "Cash Balance";
/* package */static final String EQUITY_TRS = "Equity Total Return Swap";
/* package */static final String BOND_TRS = "Bond Total Return Swap";
/* package */static final String BILL_TRS = "Bond Total Return Swap";
private final Comparator<Position> _comparator = new SimplePositionComparator();
/* package */static final List<String> ALL_CATEGORIES = Arrays.asList(FX_OPTIONS, NONDELIVERABLE_FX_FORWARDS, FX_BARRIER_OPTIONS, FX_DIGITAL_OPTIONS,
NONDELIVERABLE_FX_DIGITAL_OPTIONS, FX_FORWARDS, NONDELIVERABLE_FX_FORWARDS, BONDS, CASH, EQUITIES,
FRAS, FUTURES, EQUITY_INDEX_OPTIONS, EQUITY_OPTIONS, EQUITY_BARRIER_OPTIONS,
EQUITY_VARIANCE_SWAPS, SWAPTIONS, IRFUTURE_OPTIONS, EQUITY_INDEX_DIVIDEND_FUTURE_OPTIONS,
SWAPS, CAP_FLOOR, CAP_FLOOR_CMS_SPREAD, EQUITY_INDEX_FUTURE_OPTIONS, INFLATION_SWAPS, FX_VOLATILITY_SWAPS,
EXCHANGE_TRADED_FUNDS, ADRS, EQUITY_WARRANTS, FLOATING_RATE_NOTES, EQUITY_TRS, BOND_TRS, UNKNOWN);
private final boolean _includeEmptyCategories;
public AssetClassAggregationFunction() {
this(false);
}
public AssetClassAggregationFunction(final boolean includeEmptyCategories) {
_includeEmptyCategories = includeEmptyCategories;
}
/**
* Gets all of the asset class categories in this aggregation function.
* @return A list of the categories
*/
protected static List<String> getAllCategories() {
return ALL_CATEGORIES;
}
/**
* Gets the include empty categories field.
* @return The include empty categories field
*/
protected boolean includeEmptyCategories() {
return _includeEmptyCategories;
}
@Override
public String classifyPosition(final Position position) {
final Security security = position.getSecurity();
if (security instanceof FinancialSecurity) {
final FinancialSecurity finSec = (FinancialSecurity) security;
return finSec.accept(new FinancialSecurityVisitor<String>() {
@Override
public String visitBillSecurity(final BillSecurity security) {
return BILLS;
}
@Override
public String visitGovernmentBondSecurity(final GovernmentBondSecurity security) {
return BONDS;
}
@Override
public String visitCorporateBondSecurity(final CorporateBondSecurity security) {
return BONDS;
}
@Override
public String visitMunicipalBondSecurity(final MunicipalBondSecurity security) {
return BONDS;
}
@Override
public String visitInflationBondSecurity(final InflationBondSecurity security) {
return BONDS;
}
@Override
public String visitCashBalanceSecurity(final CashBalanceSecurity security) {
return CASH_BALANCE;
}
@Override
public String visitCashSecurity(final CashSecurity security) {
return CASH;
}
@Override
public String visitCashFlowSecurity(final CashFlowSecurity security) {
return CASHFLOW;
}
@Override
public String visitEquitySecurity(final EquitySecurity security) {
return EQUITIES;
}
@Override
public String visitFRASecurity(final FRASecurity security) {
return FRAS;
}
@Override
public String visitForwardRateAgreementSecurity(final ForwardRateAgreementSecurity security) {
return FRAS;
}
@Override
public String visitSwapSecurity(final SwapSecurity security) {
return SWAPS;
}
@Override
public String visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
return EQUITY_INDEX_OPTIONS;
}
@Override
public String visitEquityOptionSecurity(final EquityOptionSecurity equityOptionSecurity) {
return EQUITY_OPTIONS;
}
@Override
public String visitEquityBarrierOptionSecurity(final EquityBarrierOptionSecurity security) {
return EQUITY_BARRIER_OPTIONS;
}
@Override
public String visitFXOptionSecurity(final FXOptionSecurity fxOptionSecurity) {
return FX_OPTIONS;
}
@Override
public String visitNonDeliverableFXOptionSecurity(final NonDeliverableFXOptionSecurity security) {
return NONDELIVERABLE_FX_OPTIONS;
}
@Override
public String visitSwaptionSecurity(final SwaptionSecurity security) {
return SWAPTIONS;
}
@Override
public String visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
return IRFUTURE_OPTIONS;
}
@Override
public String visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity commodityFutureOptionSecurity) {
return COMMODITY_FUTURE_OPTIONS;
}
@Override
public String visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
return FX_FUTURE_OPTIONS;
}
@Override
public String visitBondFutureOptionSecurity(final BondFutureOptionSecurity bondFutureOptionSecurity) {
return BOND_FUTURE_OPTIONS;
}
@Override
public String visitEquityIndexDividendFutureOptionSecurity(
final EquityIndexDividendFutureOptionSecurity equityIndexDividendFutureOptionSecurity) {
return EQUITY_INDEX_DIVIDEND_FUTURE_OPTIONS;
}
@Override
public String visitEquityIndexFutureOptionSecurity(final EquityIndexFutureOptionSecurity equityIndexFutureOptionSecurity) {
return EQUITY_INDEX_FUTURE_OPTIONS;
}
@Override
public String visitFXBarrierOptionSecurity(final FXBarrierOptionSecurity security) {
return FX_BARRIER_OPTIONS;
}
@Override
public String visitFXDigitalOptionSecurity(final FXDigitalOptionSecurity security) {
return FX_DIGITAL_OPTIONS;
}
@Override
public String visitNonDeliverableFXDigitalOptionSecurity(final NonDeliverableFXDigitalOptionSecurity security) {
return NONDELIVERABLE_FX_DIGITAL_OPTIONS;
}
@Override
public String visitFXForwardSecurity(final FXForwardSecurity security) {
return FX_FORWARDS;
}
@Override
public String visitNonDeliverableFXForwardSecurity(final NonDeliverableFXForwardSecurity security) {
return NONDELIVERABLE_FX_FORWARDS;
}
@Override
public String visitCapFloorSecurity(final CapFloorSecurity security) {
return CAP_FLOOR;
}
@Override
public String visitCapFloorCMSSpreadSecurity(final CapFloorCMSSpreadSecurity security) {
return CAP_FLOOR_CMS_SPREAD;
}
@Override
public String visitEquityVarianceSwapSecurity(final EquityVarianceSwapSecurity security) {
return EQUITY_VARIANCE_SWAPS;
}
@Override
public String visitSimpleZeroDepositSecurity(final SimpleZeroDepositSecurity security) {
throw new UnsupportedOperationException("SimpleZeroDepositSecurity should not be used in a position");
}
@Override
public String visitPeriodicZeroDepositSecurity(final PeriodicZeroDepositSecurity security) {
throw new UnsupportedOperationException("PeriodicZeroDepositSecurity should not be used in a position");
}
@Override
public String visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
throw new UnsupportedOperationException("ContinuousZeroDepositSecurity should not be used in a position");
}
@Override
public String visitAgricultureFutureSecurity(final AgricultureFutureSecurity security) {
return FUTURES;
}
@Override
public String visitBondFutureSecurity(final BondFutureSecurity security) {
return FUTURES;
}
@Override
public String visitEnergyFutureSecurity(final EnergyFutureSecurity security) {
return FUTURES;
}
@Override
public String visitEquityFutureSecurity(final EquityFutureSecurity security) {
return FUTURES;
}
@Override
public String visitEquityIndexDividendFutureSecurity(final EquityIndexDividendFutureSecurity security) {
return FUTURES;
}
@Override
public String visitFXFutureSecurity(final FXFutureSecurity security) {
return FUTURES;
}
@Override
public String visitForwardSwapSecurity(final ForwardSwapSecurity security) {
return SWAPS;
}
@Override
public String visitIndexFutureSecurity(final IndexFutureSecurity security) {
return FUTURES;
}
@Override
public String visitInterestRateFutureSecurity(final InterestRateFutureSecurity security) {
return FUTURES;
}
@Override
public String visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity security) {
return FUTURES;
}
@Override
public String visitMetalFutureSecurity(final MetalFutureSecurity security) {
return FUTURES;
}
@Override
public String visitStockFutureSecurity(final StockFutureSecurity security) {
return FUTURES;
}
@Override
public String visitAgricultureForwardSecurity(final AgricultureForwardSecurity security) {
return FORWARDS;
}
@Override
public String visitEnergyForwardSecurity(final EnergyForwardSecurity security) {
return FORWARDS;
}
@Override
public String visitMetalForwardSecurity(final MetalForwardSecurity security) {
return FORWARDS;
}
@Override
public String visitCDSSecurity(final CDSSecurity security) {
return CDS;
}
@Override
public String visitStandardVanillaCDSSecurity(final StandardVanillaCDSSecurity security) {
return CDS;
}
@Override
public String visitStandardRecoveryLockCDSSecurity(final StandardRecoveryLockCDSSecurity security) {
return CDS;
}
@Override
public String visitStandardFixedRecoveryCDSSecurity(final StandardFixedRecoveryCDSSecurity security) {
return CDS;
}
@Override
public String visitLegacyVanillaCDSSecurity(final LegacyVanillaCDSSecurity security) {
return CDS;
}
@Override
public String visitLegacyRecoveryLockCDSSecurity(final LegacyRecoveryLockCDSSecurity security) {
return CDS;
}
@Override
public String visitLegacyFixedRecoveryCDSSecurity(final LegacyFixedRecoveryCDSSecurity security) {
return CDS;
}
@Override
public String visitDeliverableSwapFutureSecurity(final DeliverableSwapFutureSecurity security) {
return DELIVERABLE_SWAP_FUTURES;
}
@Override
public String visitCreditDefaultSwapIndexDefinitionSecurity(final CreditDefaultSwapIndexDefinitionSecurity security) {
return CDX;
}
@Override
public String visitCreditDefaultSwapIndexSecurity(final CreditDefaultSwapIndexSecurity security) {
return CDX;
}
@Override
public String visitCreditDefaultSwapOptionSecurity(final CreditDefaultSwapOptionSecurity security) {
return CREDIT_DEFAULT_SWAP_OPTIONS;
}
@Override
public String visitZeroCouponInflationSwapSecurity(final ZeroCouponInflationSwapSecurity security) {
return INFLATION_SWAPS;
}
@Override
public String visitYearOnYearInflationSwapSecurity(final YearOnYearInflationSwapSecurity security) {
return INFLATION_SWAPS;
}
@Override
public String visitInterestRateSwapSecurity(final InterestRateSwapSecurity security) {
return SWAPS;
}
@Override
public String visitFXVolatilitySwapSecurity(final FXVolatilitySwapSecurity security) {
return FX_VOLATILITY_SWAPS;
}
@Override
public String visitExchangeTradedFundSecurity(final ExchangeTradedFundSecurity security) {
return EXCHANGE_TRADED_FUNDS;
}
@Override
public String visitAmericanDepositaryReceiptSecurity(final AmericanDepositaryReceiptSecurity security) {
return ADRS;
}
@Override
public String visitEquityWarrantSecurity(final EquityWarrantSecurity security) {
return EQUITY_WARRANTS;
}
@Override
public String visitFloatingRateNoteSecurity(final FloatingRateNoteSecurity security) {
return FLOATING_RATE_NOTES;
}
@Override
public String visitEquityTotalReturnSwapSecurity(final EquityTotalReturnSwapSecurity security) {
return EQUITY_TRS;
}
@Override
public String visitBondTotalReturnSwapSecurity(final BondTotalReturnSwapSecurity security) {
return BOND_TRS;
}
@Override
public String visitBillTotalReturnSwapSecurity(BillTotalReturnSwapSecurity security) {
return BILL_TRS;
}
@Override
public String visitStandardCDSSecurity(final StandardCDSSecurity security) {
return CDS;
}
@Override
public String visitLegacyCDSSecurity(final LegacyCDSSecurity security) {
return CDS;
}
@Override
public String visitIndexCDSSecurity(final IndexCDSSecurity security) {
return CDX;
}
@Override
public String visitIndexCDSDefinitionSecurity(final IndexCDSDefinitionSecurity security) {
return CDX;
}
});
} else {
if (security instanceof RawSecurity && security.getSecurityType().equals(SecurityEntryData.EXTERNAL_SENSITIVITIES_SECURITY_TYPE)) {
if (security.getAttributes().containsKey("Security Type")) {
return security.getAttributes().get("Security Type");
}
}
return UNKNOWN;
}
}
@Override
public String getName() {
return NAME;
}
@Override
public Collection<String> getRequiredEntries() {
if (_includeEmptyCategories) {
return ALL_CATEGORIES;
} else {
return Collections.emptyList();
}
}
@Override
public int compare(final String assetClass1, final String assetClass2) {
if (!ALL_CATEGORIES.contains(assetClass1)) {
if (!ALL_CATEGORIES.contains(assetClass2)) {
return assetClass1.compareTo(assetClass2);
} else {
return -1;
}
} else if (!ALL_CATEGORIES.contains(assetClass2)) {
return 1;
} else {
return ALL_CATEGORIES.indexOf(assetClass2) - ALL_CATEGORIES.indexOf(assetClass1);
}
}
@Override
public Comparator<Position> getPositionComparator() {
return _comparator;
}
}