Esempio n. 1
0
 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;
 }
Esempio n. 2
0
        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);
            }
        }