Пример #1
0
        /// <summary>
        /// Formats the ex div type.
        /// </summary>
        /// <param name="xdt"></param>
        /// <returns></returns>
        public static string FormatExDiv(ExDividendEnum xdt)
        {
            switch (xdt)
            {
            case ExDividendEnum.XD_none: return("None");

            case ExDividendEnum.XD_7d: return("7d");

            case ExDividendEnum.XD_9d: return("9d");

            case ExDividendEnum.XD_14d: return("14d");

            case ExDividendEnum.XD_30d: return("30d");

            case ExDividendEnum.XD_1m: return("1m");

            case ExDividendEnum.XD_4bd: return("4bd");

            case ExDividendEnum.XD_6bd: return("6bd");

            case ExDividendEnum.XD_10bd: return("10bd");

            case ExDividendEnum.XD_Austria: return("Austrian");

            case ExDividendEnum.XD_Eurobond: return("Eurobond");

            case ExDividendEnum.XD_Ireland: return("Irish");

            default: return("");
            }
        }
Пример #2
0
 /// <summary>
 /// PriceableBond
 /// </summary>
 /// <param name="name"></param>
 /// <param name="instrumentid"></param>
 /// <param name="bondType"></param>
 /// <param name="dealDate"></param>
 /// <param name="valueDate"></param>
 /// <param name="ccy"></param>
 /// <param name="calendar"></param>
 /// <param name="coupFreq"></param>
 /// <param name="accrualDC"></param>
 /// <param name="yieldDC"></param>
 /// <param name="repoDC"></param>
 /// <param name="xdt"></param>
 /// <param name="couponType"></param>
 /// <param name="couponRate"></param>
 /// <param name="settC"></param>
 /// <param name="maturity"></param>
 /// <param name="valueC"></param>
 /// <param name="tickSize"></param>
 /// <param name="issuerName"></param>
 /// <param name="ycm"></param>
 /// <param name="yieldCompFreq"></param>
 /// <param name="accIntRounding"></param>
 public PriceableBond(string name, string instrumentid, string bondType,
                      DateTime dealDate, DateTime valueDate, Currency ccy, IBusinessCalendar calendar,
                      Period coupFreq, DayCountFraction accrualDC, DayCountFraction yieldDC, DayCountFraction repoDC,
                      ExDividendEnum xdt, CouponTypeEnum couponType, decimal couponRate, string settC, DateTime maturity,
                      BondSettlementEnum valueC, short tickSize, string issuerName, BondAnalytics.YieldCalcMethod ycm,
                      short yieldCompFreq, short accIntRounding)
     : base(dealDate, 100.0m, ccy, null, null, null, null)
 {
     Currency            = ccy;
     ValueDate           = valueDate;
     DealDate            = dealDate;
     Frequency           = int.Parse(coupFreq.periodMultiplier); //convert to using the bond fpml paymentfrequency field.
     AccIntRounding      = accIntRounding;
     CouponType          = couponType;
     CouponRate          = couponRate;
     CouponDayCount      = accrualDC;
     BondType            = EnumHelper.Parse <BondTypesEnum>(bondType);
     PaymentDateCalendar = calendar;
     RepoDC          = repoDC;
     SettC           = settC;
     TickSize        = tickSize;
     ValueC          = valueC;
     Xdt             = xdt;
     Ycm             = ycm;
     YieldCompFreq   = yieldCompFreq;
     YieldDC         = yieldDC;
     RollDay         = maturity.Day;   //provide an input for this.
     ValueDate       = SettlementDate; //default condition if not specified.
     Id              = name;
     Issuer          = issuerName;     //Does not handle PartyReference type -> only string!
     MaturityDate    = maturity;
     CouponFrequency = coupFreq;
     CouponType      = CouponTypeEnum.Fixed;
     InstrumentIds   = new List <InstrumentId> {
         InstrumentIdHelper.Parse(instrumentid)
     };
     Build();
 }
Пример #3
0
        ///<summary>
        /// This is a coupon scheduler based on some old C++ code.
        ///</summary>
        ///<param name="valueDate">The value date of the bond.</param>
        ///<param name="settlementDate">The settlement date of the bond.</param>
        ///<param name="firstAccrualDate">The first accrual date of the bond.</param>
        ///<param name="firstCouponDate">The first coupon date of the bond. this may be null.</param>
        ///<param name="lastRegCouponDate">The last regular coupon date. This may be null.</param>
        ///<param name="maturityDate">The maturity date of the bond.</param>
        ///<param name="calendar">The payment calendar.</param>
        ///<param name="coupFreq">The coupon frequency.</param>
        ///<param name="rollDay">The roll day.</param>
        ///<param name="exdividendType">The ex div type.</param>
        ///<param name="prevCouponDate">The previous coupon date as calculated.</param>
        ///<param name="nextCouponDate">The next coupon date as calculated.</param>
        ///<param name="next2CouponDate">The next plus one coupon date as calculated.</param>
        ///<param name="regCouponsToMaturity">The regular coupons until maturity as calculated.</param>
        ///<param name="numCoupons">The number of coupon as calculated.</param>
        ///<param name="isXD">The exdiv state as calculated.</param>
        ///<returns>A boolean flag.</returns>
        ///<exception cref="Exception"></exception>
        public static Boolean GetBondCouponDates(DateTime valueDate, DateTime settlementDate, DateTime firstAccrualDate,
                                                 DateTime?firstCouponDate, DateTime?lastRegCouponDate, DateTime maturityDate, IBusinessCalendar calendar,
                                                 int coupFreq, int rollDay, ExDividendEnum exdividendType, out DateTime prevCouponDate,
                                                 out DateTime nextCouponDate, out DateTime?next2CouponDate, out int regCouponsToMaturity,
                                                 out int numCoupons, out bool isXD)
        {
            //var result = false;
            if (valueDate > maturityDate)
            {
                throw new Exception("Bond has matured");
            }
            var yf = maturityDate.Year;
            var mf = maturityDate.Month;
            var y  = valueDate.Year;
            var m  = valueDate.Month;
            var d  = valueDate.Day;

            numCoupons           = 0;
            regCouponsToMaturity = 0;
            isXD            = false;
            prevCouponDate  = firstAccrualDate;
            nextCouponDate  = firstAccrualDate;
            next2CouponDate = firstAccrualDate;
            if (firstCouponDate != null)
            {
                //result = true;
                var coupon = (DateTime)firstCouponDate;
                var y1     = coupon.Year;
                var m1     = coupon.Month;
                if (valueDate < firstCouponDate) // in first coupon period
                {
                    nextCouponDate       = (DateTime)firstCouponDate;
                    prevCouponDate       = firstAccrualDate;
                    regCouponsToMaturity = (12 * (yf - y1) + mf - m1) / coupFreq;
                    next2CouponDate      = new DateTime(yf, mf - (regCouponsToMaturity - 1) * coupFreq, rollDay);
                    if (next2CouponDate > maturityDate)
                    {
                        next2CouponDate = maturityDate;
                    }
                    isXD       = firstCouponDate < maturityDate && settlementDate >= new ExDivDate(exdividendType, nextCouponDate, calendar).Date;
                    numCoupons = (12 * (yf - y1) + mf - m1) / coupFreq - regCouponsToMaturity;
                    return(true);//result
                }
            }
            else if (lastRegCouponDate != null && valueDate >= lastRegCouponDate) // in irregular final period
            {
                prevCouponDate       = (DateTime)lastRegCouponDate;
                nextCouponDate       = maturityDate;
                regCouponsToMaturity = -1;
                numCoupons           = 1;
                next2CouponDate      = null;
                return(true);// result;
            }
            else // in regular part of schedule
            {
                regCouponsToMaturity = -BondAnalytics.CountCoupPdsEx(yf, mf, rollDay, y, m, d, coupFreq);
                nextCouponDate       = new DateTime(yf, mf - coupFreq * regCouponsToMaturity, rollDay);
                next2CouponDate      = new DateTime(yf, mf - coupFreq * (regCouponsToMaturity - 1), rollDay);
                prevCouponDate       = new DateTime(yf, mf - coupFreq * (regCouponsToMaturity + 1), rollDay);
                isXD = regCouponsToMaturity > 0 && settlementDate >= new ExDivDate(exdividendType, nextCouponDate, calendar).Date;
                //result = true;
                return(true); //result;
            }
            return(false);
        }
Пример #4
0
        /// <summary>
        /// Calcs the date.
        /// </summary>
        /// <param name="xdt">The XDT.</param>
        /// <param name="nextCoupDate">The next coup date.</param>
        /// <param name="calendar">The calendar.</param>
        /// <returns></returns>
        public DateTime CalcDate(ExDividendEnum xdt, DateTime nextCoupDate, IBusinessCalendar calendar)
        {
            switch (xdt)
            {
            case ExDividendEnum.XD_7d: return(nextCoupDate.AddDays(-7));

            case ExDividendEnum.XD_9d: return(nextCoupDate.AddDays(-9));

            case ExDividendEnum.XD_14d: return(nextCoupDate.AddDays(-14));

            case ExDividendEnum.XD_30d: return(nextCoupDate.AddDays(-30));

            case ExDividendEnum.XD_1m: return(nextCoupDate.AddMonths(-1));

            case ExDividendEnum.XD_4bd:
            {
                var minusFourDayInterval = new Offset
                {
                    dayType          = DayTypeEnum.Business,
                    period           = PeriodEnum.D,
                    periodMultiplier = "-4"
                };

                return(calendar.Advance(nextCoupDate, minusFourDayInterval, BusinessDayConventionEnum.PRECEDING));
            }

            case ExDividendEnum.XD_6bd:
            {
                var minusSixDayInterval = new Offset
                {
                    dayType          = DayTypeEnum.Business,
                    period           = PeriodEnum.D,
                    periodMultiplier = "-6"
                };

                return(calendar.Advance(nextCoupDate, minusSixDayInterval, BusinessDayConventionEnum.PRECEDING));
            }

            case ExDividendEnum.XD_10bd:
            {
                var minusTenDayInterval = new Offset
                {
                    dayType          = DayTypeEnum.Business,
                    period           = PeriodEnum.D,
                    periodMultiplier = "-10"
                };

                return(calendar.Advance(nextCoupDate, minusTenDayInterval, BusinessDayConventionEnum.PRECEDING));
            }

            case ExDividendEnum.XD_Austria:
                throw new NotImplementedException("ExDividendEnum.XD_Austria");
            //if (nextCoupDate.Day >= 10 && nextCoupDate.Day <= 24) return nextCoupDate.AddDays(Convert.ToDouble(9 - new DateTime(nextCoupDate.Year, nextCoupDate.Month, 1).DayOfWeek));
            //return new DateTime(nextCoupDate.Year, nextCoupDate.Month, 22 - Convert.ToInt32(new DateTime(nextCoupDate.Year, nextCoupDate.Month - ((nextCoupDate.Day < 10)?0:1), 14).DayOfWeek));

            case ExDividendEnum.XD_eurobond:
                int y = nextCoupDate.Year, m = nextCoupDate.Day, d = nextCoupDate.Day;
                if (d < 3)
                {
                    d = 16; m--;
                }
                else if (d < 17)
                {
                    d = 1;
                }
                else
                {
                    d = 16;
                }
                return(new DateTime(y, m, d));

            case ExDividendEnum.XD_Ireland:
                throw new NotImplementedException("ExDividendEnum.XD_Ireland");
            //return nextCoupDate.AddDays(Convert.ToDouble(-17-nextCoupDate.AddDays(1).DayOfWeek));

            default: return(nextCoupDate);
            }
        }
Пример #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ExDivDate"/> class.
 /// </summary>
 /// <param name="xdt">The XDT.</param>
 /// <param name="nextCoupDate">The next coup date.</param>
 /// <param name="calendar">The calendar.</param>
 public ExDivDate(ExDividendEnum xdt, DateTime nextCoupDate, IBusinessCalendar calendar)
 {
     _exDivDate = CalcDate(xdt, nextCoupDate, calendar);
 }