/// <summary> /// Gets the quoted asset set. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> /// <returns></returns> public override void Build(ILogger logger, ICoreCache cache, string nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) { var curveId = (VolatilitySurfaceIdentifier)PricingStructureIdentifier; //TODO This for backwards compatability. AnalyticalResults is the current interface. BootstrapResults = new VolCurveBootstrapResults(); PriceableOptionAssets = PriceableAssetFactory.CreatePriceableRateOptionAssets(logger, cache, nameSpace, GetVolatilityMatrix().baseDate.Value, GetVolatilityMatrix().inputs, fixingCalendar, rollCalendar); //GetVolatilityMatrix().dataPoints = null; MultiDimensionalPricingData dataPoints = GetVolatilityMatrix().dataPoints; DateTime baseDate = GetVolatilityMatrix().baseDate.Value; var interpolationMethod = InterpolationMethod; var extrapolationPermitted = ExtrapolationPermittedInput ?? ExtrapolationPermitted; BootstrapResults.Results = CapFloorBootstrapper.Bootstrap(PriceableOptionAssets, curveId.Properties, DiscountCurve, ForecastCurve, baseDate, extrapolationPermitted, interpolationMethod, Tolerance); IsBootstrapSuccessful = true; InitialiseVolatilities(curveId.BaseDate, BootstrapResults.Results); //The points use tenor strings for expiry. var termTenors = new List <String>(); foreach (var daysDifference in VolatilityOffsets) { termTenors.Add(daysDifference + "D"); } dataPoints.point = ProcessRawSurface(termTenors, Strike, VolatilityValues, curveId.StrikeQuoteUnits, curveId.UnderlyingAssetReference); SetInterpolator(dataPoints, curveId.Algorithm, curveId.PricingStructureType); }
public CapVolatilityCurve(ILogger logger, ICoreCache cache, string nameSpace, NamedValueSet properties, QuotedAssetSet instrumentData, IRateCurve discountCurve, IRateCurve forecastCurve, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : this(logger, cache, nameSpace, new VolatilitySurfaceIdentifier(properties), fixingCalendar, rollCalendar) { DiscountCurve = discountCurve; ForecastCurve = forecastCurve; var curveId = GetCurveId(); var volCurve = SetConfigurationData(); //TODO This for backwards compatability. AnalyticalResults is the current interface. Handle = properties.GetString(CurveProp.EngineHandle, null); BootstrapResults = new VolCurveBootstrapResults(); //Set the underlying asset information. var instrument = properties.GetString(CurveProp.Instrument, true); Asset = new AnyAssetReference { href = instrument }; UnderlyingAssetDetails = CreateUnderlyingAssetWithProperties(); var extrapolationPermitted = ExtrapolationPermittedInput ?? ExtrapolationPermitted; PriceableOptionAssets = PriceableAssetFactory.CreatePriceableRateOptionAssets(logger, cache, nameSpace, curveId.BaseDate, instrumentData, fixingCalendar, rollCalendar); BootstrapResults.Results = CapFloorBootstrapper.Bootstrap(PriceableOptionAssets, properties, DiscountCurve, ForecastCurve, curveId.BaseDate, extrapolationPermitted, InterpolationMethod, Tolerance); IsBootstrapSuccessful = true; InitialiseVolatilities(curveId.BaseDate, BootstrapResults.Results); QuoteUnits = EnumHelper.Parse <QuoteUnitsEnum>(properties.GetValue(CurveProp.QuoteUnits, QuoteUnitsEnum.LogNormalVolatility.ToString())); MeasureType = EnumHelper.Parse <MeasureTypesEnum>(properties.GetValue(CurveProp.MeasureType, MeasureTypesEnum.Volatility.ToString())); StrikeQuoteUnits = EnumHelper.Parse <StrikeQuoteUnitsEnum>(properties.GetValue(CurveProp.StrikeQuoteUnits, StrikeQuoteUnitsEnum.ATMFlatMoneyness.ToString())); //If there is a strike specified for the curve, use it! IsATMBootstrap = true; Strike = curveId.Strike; if (Strike != null) { ValidateStrike((decimal)Strike); IsFixedStrikeBootstrap = true; IsATMBootstrap = false; } if (StrikeQuoteUnits == StrikeQuoteUnitsEnum.ATMFlatMoneyness || StrikeQuoteUnits == StrikeQuoteUnitsEnum.ATMMoneyness) { IsFixedStrikeBootstrap = false; } //The points use tenor strings for expiry. var termTenors = new List <String>(); foreach (var daysDifference in VolatilityOffsets) { termTenors.Add(daysDifference + "D"); } volCurve.point = ProcessRawSurface(termTenors, Strike, VolatilityValues, curveId.StrikeQuoteUnits, curveId.UnderlyingAssetReference); // Interpolate the curve based on the respective curve interpolation SetInterpolator(volCurve, curveId.Algorithm, curveId.PricingStructureType); CreatePricingStructure(curveId, volCurve, instrumentData); }