コード例 #1
0
ファイル: FloatingCoupon.cs プロジェクト: stepinto163/Qdp
 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;
 }
コード例 #2
0
ファイル: Index.cs プロジェクト: stepinto163/Qdp
        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);
            }
        }