protected static List <MarginWeighting> CalculateMarginsWeighting(SensitivityCategory category, Dictionary <String, Decimal> thresholdFactors, List <Sensitivity> sensitivities) { if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } if (thresholdFactors == null) { throw new ArgumentNullException(nameof(thresholdFactors)); } List <MarginWeighting> weightingMargins = new List <MarginWeighting>(sensitivities.Count); foreach (Sensitivity sensitivity in sensitivities) { Decimal riskWeight = ModelParameters.GetWeightRisk(category, sensitivity); Decimal thresholdFactor = (sensitivity.Subrisk == SensitivitySubrisk.CrossCurrencyBasis) ? 1m : thresholdFactors[sensitivity.Qualifier]; Amount weightingMarginAmount = sensitivity.Amount * riskWeight * thresholdFactor; weightingMargins.Add(MarginWeighting.Of(sensitivity, weightingMarginAmount)); } return(weightingMargins); }
public static MarginSensitivity Of(SensitivityCategory category, Amount amount, List <MarginBucket> bucketMargins) { if (!Enum.IsDefined(typeof(SensitivityCategory), category)) { throw new InvalidEnumArgumentException("Invalid sensitivity category specified."); } if (bucketMargins == null) { throw new ArgumentNullException(nameof(bucketMargins)); } if (bucketMargins.Count == 0) { throw new ArgumentException("No bucket margins have been provided.", nameof(bucketMargins)); } if (bucketMargins.Any(x => x == null)) { throw new ArgumentException("One or more bucket margins are null.", nameof(bucketMargins)); } List <MarginBucket> bucketMarginsSorted = bucketMargins .OrderBy(x => { if (x.Bucket.IsResidual) { return(Int32.MaxValue); } if (x.Bucket is Placeholder) { return(Int32.MinValue); } return(0); }) .ThenBy(x => { if (x.Bucket is Currency currency) { return(currency.Name); } return(x.Bucket.Description); }) .ToList(); return(new MarginSensitivity(category, amount, bucketMarginsSorted)); }
protected static List <MarginWeighting> CalculateMarginsWeighting(SensitivityCategory category, List <Sensitivity> sensitivities) { if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } List <MarginWeighting> weightingMargins = new List <MarginWeighting>(sensitivities.Count); foreach (Sensitivity sensitivity in sensitivities) { Decimal riskWeight = ModelParameters.GetWeightRisk(category, sensitivity); Amount weightingMarginAmount = sensitivity.Amount * riskWeight; weightingMargins.Add(MarginWeighting.Of(sensitivity, weightingMarginAmount)); } return(weightingMargins); }
public override MarginSensitivity CalculateMargin(Currency calculationCurrency, FxRatesProvider ratesProvider, SensitivityRisk risk, SensitivityCategory category, List <Sensitivity> sensitivities) { if (calculationCurrency == null) { throw new ArgumentNullException(nameof(calculationCurrency)); } if (ratesProvider == null) { throw new ArgumentNullException(nameof(ratesProvider)); } if (!Enum.IsDefined(typeof(SensitivityRisk), risk)) { throw new InvalidEnumArgumentException("Invalid sensitivity risk specified."); } if (!Enum.IsDefined(typeof(SensitivityCategory), category)) { throw new InvalidEnumArgumentException("Invalid sensitivity category specified."); } if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } List <IBucket> buckets = sensitivities.Select(x => x.Bucket).Distinct().OrderBy(x => x.Name).ToList(); List <MarginBucket> bucketMargins = new List <MarginBucket>(buckets.Count); Dictionary <IBucket, Dictionary <String, Decimal> > thresholdFactors = new Dictionary <IBucket, Dictionary <String, Decimal> >(); foreach (IBucket bucket in buckets) { List <Sensitivity> sensitivitiesByBucket = sensitivities.Where(x => x.Bucket == bucket).ToList(); thresholdFactors[bucket] = sensitivitiesByBucket .GroupBy(x => new { x.Bucket, x.Qualifier }) .ToDictionary(x => x.Key.Qualifier, x => CalculateThresholdFactor(calculationCurrency, ratesProvider, risk, category, x.ToList())); List <MarginWeighting> weightingMargins = CalculateMarginsWeighting(category, thresholdFactors[bucket], sensitivitiesByBucket); Amount sumSquared = Amount.Sum(weightingMargins.Select(x => Amount.Square(x.Value)), calculationCurrency); Amount sumCorrelated = CalculateCorrelatedSumWeights(calculationCurrency, risk, weightingMargins, thresholdFactors[bucket]); Amount bucketMarginAmount = Amount.SquareRoot(sumSquared + sumCorrelated); bucketMargins.Add(MarginBucket.Of(bucket, bucketMarginAmount, weightingMargins)); } List <MarginBucket> bucketMarginsNonResidual = bucketMargins.Where(x => !x.Bucket.IsResidual).ToList(); Amount sumSquaredNonResidual = Amount.Sum(bucketMarginsNonResidual.Select(x => Amount.Square(x.Value)), calculationCurrency); List <MarginBucket> bucketMarginsResidual = bucketMargins.Where(x => x.Bucket.IsResidual).ToList(); Amount sumSquaredResidual = Amount.Sum(bucketMarginsResidual.Select(x => Amount.Square(x.Value)), calculationCurrency); Amount sumCorrelatedNonResidual; if ((risk == SensitivityRisk.Rates) && (category == SensitivityCategory.Delta)) { Dictionary <IBucket, Decimal> bucketThresholdFactors = thresholdFactors.ToDictionary(x => x.Key, x => x.Value.Values.Single()); sumCorrelatedNonResidual = CalculateCorrelatedSumBuckets(calculationCurrency, risk, bucketThresholdFactors, bucketMarginsNonResidual); } else { sumCorrelatedNonResidual = CalculateCorrelatedSumBuckets(calculationCurrency, risk, bucketMarginsNonResidual); } Amount sensitivityMarginAmount = Amount.SquareRoot(sumSquaredNonResidual + sumCorrelatedNonResidual) + Amount.SquareRoot(sumSquaredResidual); return(MarginSensitivity.Of(category, sensitivityMarginAmount, bucketMargins)); }
public override MarginSensitivity CalculateMargin(Currency calculationCurrency, FxRatesProvider ratesProvider, SensitivityRisk risk, SensitivityCategory category, List <Sensitivity> sensitivities) { if (calculationCurrency == null) { throw new ArgumentNullException(nameof(calculationCurrency)); } if (ratesProvider == null) { throw new ArgumentNullException(nameof(ratesProvider)); } if (!Enum.IsDefined(typeof(SensitivityRisk), risk)) { throw new InvalidEnumArgumentException("Invalid sensitivity risk specified."); } if (!Enum.IsDefined(typeof(SensitivityCategory), category)) { throw new InvalidEnumArgumentException("Invalid sensitivity category specified."); } if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } List <IBucket> buckets = sensitivities.Select(x => x.Bucket).Distinct().OrderBy(x => x.Name).ToList(); List <MarginBucket> bucketMargins = new List <MarginBucket>(buckets.Count); foreach (IBucket bucket in buckets) { List <Sensitivity> sensitivitiesByBucket = sensitivities.Where(x => x.Bucket == bucket).ToList(); List <MarginWeighting> weightingMargins = CalculateMarginsWeighting(SensitivityCategory.Curvature, sensitivitiesByBucket); Amount sumSquared = Amount.Sum(weightingMargins.Select(x => Amount.Square(x.Value)), calculationCurrency); Amount sumCorrelated = CalculateCorrelatedSumWeights(calculationCurrency, risk, weightingMargins); Amount bucketMarginAmount = Amount.SquareRoot(sumSquared + sumCorrelated); bucketMargins.Add(MarginBucket.Of(bucket, bucketMarginAmount, weightingMargins)); } Amount marginNonResidual = CalculateMarginByBuckets(calculationCurrency, risk, false, bucketMargins); Amount marginResidual = CalculateMarginByBuckets(calculationCurrency, risk, true, bucketMargins); Amount sensitivityMarginAmount = ModelParameters.GetCurvatureScaleFactor(risk) * (marginNonResidual + marginResidual); return(MarginSensitivity.Of(SensitivityCategory.Curvature, sensitivityMarginAmount, bucketMargins)); }
private static Decimal CalculateThresholdFactor(Currency calculationCurrency, FxRatesProvider ratesProvider, SensitivityRisk risk, SensitivityCategory category, List <Sensitivity> sensitivities) { if ((risk == SensitivityRisk.Rates) && (category == SensitivityCategory.Delta)) { sensitivities = sensitivities.Where(x => x.Subrisk != SensitivitySubrisk.CrossCurrencyBasis).ToList(); if (sensitivities.Count == 0) { return(1m); } } Amount sum = Amount.Abs(Amount.Sum(sensitivities.Select(x => x.Amount), calculationCurrency)); IThresholdIdentifier thresholdIdentifier = sensitivities.Select(y => y.ThresholdIdentifier).Distinct().Single(); Amount threshold = ratesProvider.Convert(ModelParameters.GetThreshold(risk, category, thresholdIdentifier), calculationCurrency); return(Math.Max(1m, MathUtilities.SquareRoot((sum / threshold).Value))); }
public override MarginSensitivity CalculateMargin(Currency calculationCurrency, FxRatesProvider ratesProvider, SensitivityRisk risk, SensitivityCategory category, List <Sensitivity> sensitivities) { if (calculationCurrency == null) { throw new ArgumentNullException(nameof(calculationCurrency)); } if (ratesProvider == null) { throw new ArgumentNullException(nameof(ratesProvider)); } if (!Enum.IsDefined(typeof(SensitivityRisk), risk)) { throw new InvalidEnumArgumentException("Invalid sensitivity risk specified."); } if (!Enum.IsDefined(typeof(SensitivityCategory), category)) { throw new InvalidEnumArgumentException("Invalid sensitivity category specified."); } if (sensitivities == null) { throw new ArgumentNullException(nameof(sensitivities)); } List <MarginWeighting> weightingMargins = CalculateMarginsWeighting(SensitivityCategory.BaseCorrelation, sensitivities); Amount sumSquared = Amount.Sum(weightingMargins.Select(x => Amount.Square(x.Value)), calculationCurrency); Amount sumCorrelated = CalculateCorrelatedSumWeights(calculationCurrency, weightingMargins); Amount amount = Amount.SquareRoot(sumSquared + sumCorrelated); MarginBucket bucketMargin = MarginBucket.Of(Placeholder.Instance, amount, weightingMargins); return(MarginSensitivity.Of(SensitivityCategory.BaseCorrelation, amount, (new List <MarginBucket> { bucketMargin }))); }
public abstract MarginSensitivity CalculateMargin(Currency calculationCurrency, FxRatesProvider ratesProvider, SensitivityRisk risk, SensitivityCategory category, List <Sensitivity> sensitivities);
private MarginSensitivity(SensitivityCategory category, Amount amount, List <MarginBucket> children) : base(LEVEL, NAME, category.ToString(), amount, children) { m_Category = category; }