/// <summary> /// /// </summary> /// <param name="notionalStepSchedule"></param> /// <param name="dates"></param> /// <returns></returns> protected static decimal[] CreateWeightingsFromNonNegativeNotionalSchedule(NonNegativeAmountSchedule notionalStepSchedule, IList <DateTime> dates) { var result = new List <Decimal>(); var initalNotional = notionalStepSchedule.initialValue; if (null != notionalStepSchedule.step)//there should be steps - otherwise NO interm. exchanges. { result.AddRange(dates.Select(date => ScheduleHelper.GetValue(notionalStepSchedule, date)).Select(stepAmount => stepAmount / initalNotional)); } return(result.ToArray()); }
private static void UpdateCalculationPeriodData(Calculation calculation, CalculationPeriod calculationPeriod, Notional notinalSchedule) { bool hasFloatingRateCalculation = XsdClassesFieldResolver.CalculationHasFloatingRateCalculation(calculation); bool hasFixedRate = XsdClassesFieldResolver.CalculationHasFixedRateSchedule(calculation); if (!(hasFloatingRateCalculation ^ hasFixedRate)) { throw new System.Exception("at least one type of rate (floating or fixed) must be specified."); } decimal notional = NotionalHelper.GetNotionalValue(notinalSchedule, calculationPeriod.adjustedStartDate); // Notional amount // XsdClassesFieldResolver.CalculationPeriodSetNotionalAmount(calculationPeriod, notional); // Fixed rate // if (hasFixedRate) { Schedule fixedRateSchedule = XsdClassesFieldResolver.CalculationGetFixedRateSchedule(calculation); decimal fixedRate = ScheduleHelper.GetValue(fixedRateSchedule, calculationPeriod.adjustedStartDate); XsdClassesFieldResolver.SetCalculationPeriodFixedRate(calculationPeriod, fixedRate); } // Floating rate // else// if (hasFloatingRateCalculation) { // no observed, no calculated rate, spread == 0.0 // var floatingRateDefinition = (FloatingRateDefinition)calculationPeriod.Item1 ?? new FloatingRateDefinition(); // check if stream has spreadSchedule // if (XsdClassesFieldResolver.CalculationHasSpreadSchedule(calculation)) { Schedule spreadSchedule = XsdClassesFieldResolver.GetCalculationSpreadSchedule(calculation); decimal spread = ScheduleHelper.GetValue(spreadSchedule, calculationPeriod.adjustedStartDate); floatingRateDefinition.spread = spread; floatingRateDefinition.spreadSpecified = true; } FloatingRateCalculation floatingRateCalculation = XsdClassesFieldResolver.CalculationGetFloatingRateCalculation(calculation); // Check if there's a capRateSchedule // if (null != floatingRateCalculation.capRateSchedule) { StrikeSchedule capRateSchedule = floatingRateCalculation.capRateSchedule[0]; var capStrike = new Strike(); var capRate = ScheduleHelper.GetValue(capRateSchedule, calculationPeriod.adjustedStartDate); capStrike.strikeRate = capRate; floatingRateDefinition.capRate = new[] { capStrike }; } // Check if there's a capRateSchedule // if (null != floatingRateCalculation.floorRateSchedule) { StrikeSchedule floorRateSchedule = floatingRateCalculation.floorRateSchedule[0]; var floorStrike = new Strike(); decimal floorRate = ScheduleHelper.GetValue(floorRateSchedule, calculationPeriod.adjustedStartDate); floorStrike.strikeRate = floorRate; floatingRateDefinition.floorRate = new[] { floorStrike }; } calculationPeriod.Item1 = floatingRateDefinition; } }
/// <summary> /// Update calculation periods with rates/notional. /// </summary> /// <param name="interestRateStream"></param> /// <param name="calculationPeriodsPrincipalExchangesAndStubs"></param> public static void UpdateCalculationPeriodsData(InterestRateStream interestRateStream, CalculationPeriodsPrincipalExchangesAndStubs calculationPeriodsPrincipalExchangesAndStubs) { Calculation calculation = XsdClassesFieldResolver.CalculationPeriodAmountGetCalculation(interestRateStream.calculationPeriodAmount); Notional notionalSchedule = XsdClassesFieldResolver.CalculationGetNotionalSchedule(calculation); #region Generate FUTURE amounts for principle exchanges // Initial PE // if (null != calculationPeriodsPrincipalExchangesAndStubs.InitialPrincipalExchange) { // initial OUTflow // decimal initialNotionalValue = ScheduleHelper.GetValue(notionalSchedule.notionalStepSchedule, calculationPeriodsPrincipalExchangesAndStubs.InitialPrincipalExchange.adjustedPrincipalExchangeDate); calculationPeriodsPrincipalExchangesAndStubs.InitialPrincipalExchange.principalExchangeAmount = -initialNotionalValue; calculationPeriodsPrincipalExchangesAndStubs.InitialPrincipalExchange.principalExchangeAmountSpecified = true; } // intermediatory PE // foreach (PrincipalExchange intermediatoryExchange in calculationPeriodsPrincipalExchangesAndStubs.IntermediatePrincipalExchanges) { DateTime principleExchangeDate = intermediatoryExchange.adjustedPrincipalExchangeDate; //value at the day before principle exchange day // decimal prevNotionalValue = ScheduleHelper.GetValue(notionalSchedule.notionalStepSchedule, principleExchangeDate.AddDays(-1)); //value at principle exchange day .. // decimal newNotionalValue = ScheduleHelper.GetValue(notionalSchedule.notionalStepSchedule, principleExchangeDate); decimal principalExchangeAmount = prevNotionalValue - newNotionalValue; intermediatoryExchange.principalExchangeAmount = principalExchangeAmount; intermediatoryExchange.principalExchangeAmountSpecified = true; } // Final PE // if (null != calculationPeriodsPrincipalExchangesAndStubs.FinalPrincipalExchange) { // pay the rest ot the notional back // decimal newNotionalValue = ScheduleHelper.GetValue(notionalSchedule.notionalStepSchedule, calculationPeriodsPrincipalExchangesAndStubs.FinalPrincipalExchange.adjustedPrincipalExchangeDate); calculationPeriodsPrincipalExchangesAndStubs.FinalPrincipalExchange.principalExchangeAmount = newNotionalValue; calculationPeriodsPrincipalExchangesAndStubs.FinalPrincipalExchange.principalExchangeAmountSpecified = true; } #endregion // Process standard calculation periods // foreach (CalculationPeriod calculationPeriod in calculationPeriodsPrincipalExchangesAndStubs.CalculationPeriods) { UpdateCalculationPeriodData(calculation, calculationPeriod, notionalSchedule); } // Process stub calculation periods // if (null != interestRateStream.stubCalculationPeriodAmount) { if ((null == interestRateStream.stubCalculationPeriodAmount.initialStub) && (null == interestRateStream.stubCalculationPeriodAmount.finalStub)) { throw new System.Exception( "interestRateStream.stubCalculationPeriodAmount.initialStub && interestRateStream.stubCalculationPeriodAmount.finalStub are null"); } StubValue initialStub = interestRateStream.stubCalculationPeriodAmount.initialStub; StubValue finalStub = interestRateStream.stubCalculationPeriodAmount.finalStub; if (null != calculationPeriodsPrincipalExchangesAndStubs.InitialStubCalculationPeriod && null != initialStub) { UpdateStubCalculationPeriodData(interestRateStream, calculationPeriodsPrincipalExchangesAndStubs.InitialStubCalculationPeriod, initialStub, notionalSchedule); } if (null != calculationPeriodsPrincipalExchangesAndStubs.FinalStubCalculationPeriod && null != finalStub) { UpdateStubCalculationPeriodData(interestRateStream, calculationPeriodsPrincipalExchangesAndStubs.FinalStubCalculationPeriod, finalStub, notionalSchedule); } } else { foreach (CalculationPeriod calculationPeriod in new[] { calculationPeriodsPrincipalExchangesAndStubs.InitialStubCalculationPeriod, calculationPeriodsPrincipalExchangesAndStubs.FinalStubCalculationPeriod }) { if (null != calculationPeriod) { UpdateCalculationPeriodData(calculation, calculationPeriod, notionalSchedule); } } } }