public FloatingCoupon(IIndex index, ICalendar calendar, IDayCount dayCount, double couponSpread, ITerm resetTerm, Stub resetStub, BusinessDayConvention bda, DayGap resetToFixingGap = null, DayGap initialResetToFixingGap = null, double floorRate = -100, double capRate = 100, FloatingCouponCalcType frnCalc = FloatingCouponCalcType.SimpleFrn, double multiplier = 1.0) { Index = index; Calendar = calendar; DayCount = dayCount; CouponSpread = couponSpread; ResetTerm = resetTerm; ResetStub = resetStub; Bda = bda; ResetToFixingGap = resetToFixingGap; InitialResetToFixingGap = initialResetToFixingGap; FloorRate = floorRate; CapRate = capRate; FrnCalc = frnCalc; Multiplier = multiplier; }
public double GetFixingRate(IYieldCurve fixingCurve, ICalendar resetCalendar, IDayCount dayCount, Date accStartDate, Date accEndDate, ITerm resetTerm, ITerm fixingTenor, DayGap fixingToResetGap, Stub resetStub, BusinessDayConvention resetBda, double couponSpread, double capRate, double floorRate, out CfCalculationDetail[] resetDetails, IDictionary <Date, double> historicalRate = null, FloatingCouponCalcType frnCalc = FloatingCouponCalcType.SimpleFrn, double stepWiseCompensationCoupon = 0.0, double multiplier = 1.0) { var details = new List <CfCalculationDetail>(); var resetPriods = resetTerm == null ? new List <Date> { accStartDate, accEndDate } : new Schedule(accStartDate, accEndDate, resetTerm, resetStub, resetCalendar, resetBda).ToList(); for (var i = 0; i < resetPriods.Count - 1; ++i) { var resetStartDate = resetPriods[i]; var resetEndDate = resetPriods[i + 1]; if (resetEndDate > accEndDate) { resetEndDate = accEndDate; } var fixingStartDate = fixingToResetGap.Get(resetCalendar, resetStartDate); var forwardCompound = frnCalc == FloatingCouponCalcType.ZzFrn ? Compound.Continuous : IndexType.ForwardCompound(); details.Add(new CfCalculationDetail( resetStartDate, resetEndDate, fixingStartDate, multiplier * GetResetRate(fixingCurve, fixingStartDate, resetCalendar, fixingTenor, AverageDays, historicalRate, forwardCompound, IndexType.DayCount()) + stepWiseCompensationCoupon, dayCount.CalcDayCountFraction(resetStartDate, resetEndDate, accStartDate, accEndDate), resetStartDate < (fixingCurve == null ? fixingStartDate : fixingCurve.ReferenceDate))); } resetDetails = details.ToArray(); var totalDcf = resetDetails.Sum(x => x.FixingDcf); double couponRate; switch (CouponCompound) { case CouponCompound.Compounded: couponRate = (resetDetails.Select(x => { var coupon = FilterRate(x.FixingRate + couponSpread, capRate, floorRate); return(1.0 + coupon * x.FixingDcf); }) .Aggregate(1.0, (current, v) => current * v) - 1.0) / totalDcf; return(couponRate); case CouponCompound.Simple: couponRate = resetDetails.Select(x => { var coupon = FilterRate(x.FixingRate + couponSpread, capRate, floorRate); return(coupon * x.FixingDcf); }).Sum() / totalDcf; return(couponRate); default: throw new PricingLibraryException("Unknow type of coupon compund type" + CouponCompound); } }