/// <summary> /// Calculates the specified metric for the fast bootstrapper. /// </summary> /// <param name="interpolatedSpace">The intepolated Space.</param> /// <returns></returns> public override decimal CalculateImpliedQuote(IInterpolatedSpace interpolatedSpace) { if (UseSimpleModel) { return(IndexAtMaturity); } if (AnalyticsModel == null) { AnalyticsModel = new CommodityAverageAssetAnalytic(); } ICommodityAverageAssetParameters analyticModelParameters = new CommodityAverageAssetParameters { StartIndex = GetIndexAtMaturity(interpolatedSpace, AdjustedStartDate, BaseDate), }; //3. Get the Index // if (MarketQuote != null) { analyticModelParameters.AverageIndex = MarketQuoteHelper.NormalisePriceUnits(MarketQuote, "DecimalRate").value; } //4. Set the anaytic input parameters and Calculate the respective metrics // AnalyticResults = AnalyticsModel.Calculate <ICommodityAssetResults, CommodityAssetResults>(analyticModelParameters, new[] { CommodityMetrics.IndexAtMaturity }); return(CalculationResults.IndexAtMaturity); }
/// <summary> /// Calculates the specified model data. /// </summary> /// <param name="modelData">The model data.</param> /// <returns></returns> public override BasicAssetValuation Calculate(IAssetControllerData modelData) { ModelData = modelData; AnalyticsModel = new CommodityAverageAssetAnalytic(); //DependencyCreator.Resolve<IModelAnalytic<ICommodityAssetParameters, CommodityMetrics>>(_modelIdentifier); var metrics = MetricsHelper.GetMetricsToEvaluate(Metrics, AnalyticsModel.Metrics); // Determine if DFAM has been requested - if so thats all we evaluate - every other metric is ignored var bEvalForwardAtMaturity = false; if (metrics.Contains(CommodityMetrics.IndexAtMaturity)) { bEvalForwardAtMaturity = true; metrics.RemoveAll( metricItem => metricItem != CommodityMetrics.IndexAtMaturity); } ICommodityAverageAssetParameters analyticModelParameters = new CommodityAverageAssetParameters(); AnalyticResults = new CommodityAssetResults(); var metricsToEvaluate = metrics.ToArray(); var marketEnvironment = modelData.MarketEnvironment; //1. instantiate curve ICommodityCurve commodityCurve = null; //1. instantiate curve if (marketEnvironment.GetType() == typeof(SimpleMarketEnvironment)) { commodityCurve = (ICommodityCurve)((ISimpleMarketEnvironment)marketEnvironment).GetPricingStructure(); CommodityCurveName = commodityCurve.GetPricingStructureId().UniqueIdentifier; } if (marketEnvironment.GetType() == typeof(SimpleCommodityMarketEnvironment)) { commodityCurve = ((ISimpleCommodityMarketEnvironment)marketEnvironment).GetCommodityCurve(); CommodityCurveName = commodityCurve.GetPricingStructureId().UniqueIdentifier; } if (marketEnvironment.GetType() == typeof(SwapLegEnvironment)) { commodityCurve = ((ISwapLegEnvironment)marketEnvironment).GetCommodityCurve(); CommodityCurveName = commodityCurve.GetPricingStructureId().UniqueIdentifier; } if (marketEnvironment.GetType() == typeof(MarketEnvironment)) { commodityCurve = (ICommodityCurve)modelData.MarketEnvironment.GetPricingStructure(CommodityCurveName); } //3. Get the Rate if (CommodityValue != null) { analyticModelParameters.CommodityForward = CommodityValue.value; } if (bEvalForwardAtMaturity) { //4. Set the anaytic input parameters and Calculate the respective metrics AnalyticResults = AnalyticsModel.Calculate <ICommodityAssetResults, CommodityAverageAssetResults>(analyticModelParameters, metricsToEvaluate); } else { analyticModelParameters.NotionalAmount = NotionalAmount; IDayCounter dc = Actual365.Instance; analyticModelParameters.YearFraction = (decimal)dc.YearFraction(modelData.ValuationDate, RiskMaturityDate); //3. Get the end discount factor - Need to fix this. analyticModelParameters.CommodityCurveForward = GetIndexAtMaturity(commodityCurve, GetRiskMaturityDate(), modelData.ValuationDate); //4. Set the anaytic input parameters and Calculate the respective metrics AnalyticResults = AnalyticsModel.Calculate <ICommodityAssetResults, CommodityAssetResults>(analyticModelParameters, metricsToEvaluate); } return(GetValue(AnalyticResults)); }