public double GetVolForAbsoluteStrike(double strike, double maturity, double forward) { var expiry = OriginDate.AddYearFraction(maturity, DayCountBasis.Act365F); var pair = FundingModel.FxMatrix.GetFxPair(AssetSurface.Currency, Currency); var fxFwd = FundingModel.GetFxRate(pair.SpotDate(expiry), pair.Domestic, pair.Foreign); double vA, vF; switch (CalculationType) { case CompositeVolType.Black: vA = AssetSurface.GetVolForAbsoluteStrike(forward / fxFwd, expiry, forward / fxFwd); vF = FundingModel.GetVolSurface(pair.ToString()).GetVolForAbsoluteStrike(fxFwd, expiry, fxFwd); break; case CompositeVolType.AssetSkewOnly: vA = AssetSurface.GetVolForAbsoluteStrike(strike / fxFwd, expiry, forward / fxFwd); vF = FundingModel.GetVolSurface(pair.ToString()).GetVolForAbsoluteStrike(fxFwd, expiry, fxFwd); break; default: throw new Exception($"Unable to handle calc type {CalculationType}"); } var vC = System.Math.Sqrt(vA * vA + vF * vF + 2.0 * Correlation * vA * vF); return(vC); }
public Dictionary <string, IVolSurface> GetATMVegaScenarios(double bumpSize, DateTime?LastSensitivityDate) { var aDict = AssetSurface.GetATMVegaScenarios(bumpSize, LastSensitivityDate); var oDict = aDict.ToDictionary(kv => kv.Key, kv => (IVolSurface) new CompositeVolSurface(Name, AssetId, Currency, kv.Value, FundingModel, Correlation, CalculationType)); var fDict = FundingModel.GetVolSurface(_Pair.ToString()).GetATMVegaScenarios(bumpSize, LastSensitivityDate); foreach (var kv in fDict) { var fModel = FundingModel.DeepClone(null); fModel.VolSurfaces[_Pair.ToString()] = kv.Value; oDict.Add(kv.Key, new CompositeVolSurface(Name, AssetId, Currency, AssetSurface, fModel, Correlation, CalculationType)); } return(oDict); }
public DateTime PillarDatesForLabel(string label) => AssetSurface.PillarDatesForLabel(label);