/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.solutions.library.tool; import java.io.IOException; import java.util.HashMap; import org.threeten.bp.Instant; import org.threeten.bp.ZonedDateTime; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.opengamma.master.holiday.HolidayMaster; import com.opengamma.master.region.RegionMaster; import com.opengamma.master.region.impl.RegionFileReader; import com.opengamma.master.security.SecurityMaster; import com.opengamma.service.ServiceContext; import com.opengamma.service.ThreadLocalServiceContext; import com.opengamma.service.VersionCorrectionProvider; import com.opengamma.sesame.config.ViewConfig; import com.opengamma.sesame.engine.CalculationArguments; import com.opengamma.sesame.engine.Engine; import com.opengamma.sesame.engine.FixedInstantVersionCorrectionProvider; import com.opengamma.sesame.engine.Results; import com.opengamma.sesame.marketdata.MarketDataEnvironmentBuilder; import com.opengamma.solutions.util.BondFutureOptionViewUtils; import com.opengamma.solutions.util.CalendarUtils; import com.opengamma.util.ArgumentChecker; /** * Sample Bond Future Option pricing method */ public class BondFutureOptionPricer { private final Engine _engine; private final RegionMaster _regionMaster; private final SecurityMaster _securityMaster; private final HolidayMaster _holidayMaster; /** * Create an instance of the Bond Future Option Pricer * @param engine the calculation engine. * @param regionMaster the region master to persist regions. * @param securityMaster the security master to persist underlying securities. * @param holidayMaster the holiday master to persist holidays. */ @Inject public BondFutureOptionPricer(Engine engine, RegionMaster regionMaster, SecurityMaster securityMaster, HolidayMaster holidayMaster) { _engine = ArgumentChecker.notNull(engine, "engine"); _regionMaster = ArgumentChecker.notNull(regionMaster, "regionMaster"); _securityMaster = ArgumentChecker.notNull(securityMaster, "securityMaster"); _holidayMaster = ArgumentChecker.notNull(holidayMaster, "holidayMaster"); } /** * Bond Future Option price function * @param valuationTime ZoneDateTime valuation time * @param trades the path to the input trades file * @param bondFutures the path to the underlying bond futures file * @param bonds the path to the underlying bonds file * @param discountingCurves the path to the discounting curve file * @param issuerCurves the path to the issuer curve file * @param volatilitySurfaces the path to the volatility surface file * @param holidays the path to the holidays file * @return calculation results for an Bond Future Option */ public Results price(ZonedDateTime valuationTime, String trades, String bondFutures, String bonds, String discountingCurves, String issuerCurves, String volatilitySurfaces, String holidays) throws IOException { RegionFileReader.createPopulated(_regionMaster); CalculationArguments calculationArguments = CalculationArguments.builder().valuationTime(valuationTime).build(); HashMap<Object, String> portfolio = BondFutureOptionViewUtils.parseBondFutureOptions(trades, _securityMaster); BondFutureOptionViewUtils.parseBondFutures(bondFutures, _securityMaster); BondFutureOptionViewUtils.parseBonds(bonds, _securityMaster); CalendarUtils.parseRegionCalendar(holidays, _holidayMaster); ViewConfig viewConfig = BondFutureOptionViewUtils.createViewConfig(portfolio.values()); MarketDataEnvironmentBuilder marketData = new MarketDataEnvironmentBuilder(); BondFutureOptionViewUtils.parseCurves(marketData, discountingCurves, issuerCurves); BondFutureOptionViewUtils.parseVolatilitySurfaces(marketData, volatilitySurfaces); marketData.valuationTime(valuationTime); // This is needed to ensure that the version correction provided is after the population of the masters ServiceContext serviceContext = ThreadLocalServiceContext.getInstance().with(VersionCorrectionProvider.class, new FixedInstantVersionCorrectionProvider(Instant.now())); ThreadLocalServiceContext.init(serviceContext); return _engine.runView(viewConfig, calculationArguments, marketData.build(), Lists.newArrayList(portfolio.keySet())); } }