Esempio n. 1
0
        public void TestCurrentPrimeRate()
        {
            var bond = new FloatingRateBondInfo("N0000472015ABSLBS0103.CIB")
            {
                StartDate          = "20150910",
                MaturityDate       = "2017-07-26",
                Notional           = 100.0,
                Currency           = "CNY",
                Spread             = 0.029900000000000003,
                Calendar           = "chn_ib",
                PaymentFreq        = "Quarterly",
                PaymentStub        = "ShortStart",
                AccrualDC          = "ActActIsma",
                DayCount           = "ActActIsma",
                AccrualBD          = "None",
                PaymentBD          = "None",
                TradingMarket      = "ChinaInterBank",
                Settlement         = "+0D",
                ValuationParamters = new SimpleCfValuationParameters("Fr007", "Fr007", "Fr007"),

                Index            = IndexType.Depo1Y.ToString(),
                ResetDC          = DayCount.ActActIsma.ToString(),
                ResetAverageDays = 1,
                ResetTerm        = "3M",
                ResetStub        = Stub.ShortStart.ToString(),
                ResetBD          = BusinessDayConvention.None.ToString(),
                ResetToFixingGap = "-0dD",
                FloatingCalc     = "ZzFrn",
                ResetCompound    = CouponCompound.Simple.ToString(),
                ResetRateDigits  = 4
            };

            var bondVf         = new BondVf(bond);
            var bondInstrument = bondVf.GenerateInstrument();
            var valueDate      = new Date(2017, 1, 9);
            var market         = TestMarket(valueDate.ToString(), new BondMktData(bond.TradeId, "Dirty", 100.995424657531));

            var marketCondition = bondVf.GenerateMarketCondition(market);

            var result = bondInstrument.Coupon.GetPrimeCoupon(marketCondition.HistoricalIndexRates, marketCondition.FixingCurve.Value, valueDate);

            Assert.AreEqual(0.015, result.Item2);
            Assert.AreEqual("2016-12-23", result.Item1.ToString());
        }
Esempio n. 2
0
        /// <summary>
        /// Return fixing curve by historicalIndexRates
        /// </summary>
        /// <param name="settlementDate"></param>
        /// <param name="historicalIndexRates"></param>
        /// <param name="floatingBondInfo"></param>
        /// <returns></returns>
        public static InstrumentCurveDefinition GetFixingCurve(string settlementDate, Dictionary <string, Dictionary <string, double> > historicalIndexRates, FloatingRateBondInfo floatingBondInfo)
        {
            var resetCalendar = CalendarImpl.Get(floatingBondInfo.Calendar);
            var index         = floatingBondInfo.Index;
            var rates         = historicalIndexRates[index];
            var tradeId       = floatingBondInfo.TradeId;

            var indexDate   = new DayGap(floatingBondInfo.ResetToFixingGap).Get(resetCalendar, settlementDate.ToDate());
            var fixingTuple = rates.TryGetValue(indexDate.ToString(), resetCalendar);
            var indexRate   = rates.GetAverageIndex(fixingTuple.Item1, resetCalendar, floatingBondInfo.ResetAverageDays, floatingBondInfo.ResetRateDigits);

            string fixingCurveName      = "FixingCurve_" + tradeId;
            var    fixingRateDefinition = new[]
            {
                new RateMktData("1D", indexRate, index, "None", fixingCurveName),
                new RateMktData("50Y", indexRate, index, "None", fixingCurveName),
            };
            var curveConvention = new CurveConvention("fixingCurveConvention_" + tradeId,
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      index == null ? "Act365" : index.ToIndexType().DayCountEnum(),
                                                      "Continuous",
                                                      "ForwardFlat");

            floatingBondInfo.ValuationParamters.FixingCurveName = fixingCurveName;
            AddTrades(new [] { floatingBondInfo });
            return(new InstrumentCurveDefinition(fixingCurveName, curveConvention, fixingRateDefinition, "ForwardCurve"));
        }
Esempio n. 3
0
        /// <summary>
        /// Return QDP bond qdp object.
        /// </summary>
        /// <param name="tradeId"></param>
        /// <param name="startDate"></param>
        /// <param name="maturityDate"></param>
        /// <param name="notional"></param>
        /// <param name="calendar"></param>
        /// <param name="currency"></param>
        /// <param name="accrualDayCount"></param>
        /// <param name="accrualBusinessDayConvention"></param>
        /// <param name="paymentDayCount"></param>
        /// <param name="paymentFrequency"></param>
        /// <param name="paymentStub"></param>
        /// <param name="paymentBusinessDayConvention"></param>
        /// <param name="settlement"></param>
        /// <param name="settlementCoupon"></param>
        /// <param name="issuePrice"></param>
        /// <param name="firstPaymentDate"></param>
        /// <param name="issueRate"></param>
        /// <param name="amoritzationInIndex"></param>
        /// <param name="renormalizeAfterAmoritzation"></param>
        /// <param name="compensationRate"></param>
        /// <param name="optionToCall"></param>
        /// <param name="optionToPut"></param>
        /// <param name="optionToAssPut"></param>
        /// <param name="fixedCoupon"></param>
        /// <param name="index"></param>
        /// <param name="resetDayCount"></param>
        /// <param name="resetCompound"></param>
        /// <param name="resetStub"></param>
        /// <param name="resetBusinessDayConvention"></param>
        /// <param name="resetToFixingGap"></param>
        /// <param name="resetTerm"></param>
        /// <param name="resetAverageDays"></param>
        /// <param name="resetRateDigits"></param>
        /// <param name="spread"></param>
        /// <param name="floatingRateMultiplier"></param>
        /// <param name="stickToEom"></param>
        /// <returns></returns>
        private static object xl_Bond(
            string tradeId,
            string startDate       = null,
            string maturityDate    = null,
            double notional        = 100,
            string calendar        = "chn_ib",
            string currency        = "CNY",
            string accrualDayCount = "Act365",
            string accrualBusinessDayConvention = "ModifiedFollowing",
            string paymentDayCount              = "Act365",
            string paymentFrequency             = "SemiAnnual",
            string paymentStub                  = "ShortStart",
            string paymentBusinessDayConvention = "ModifiedFollowing",
            string settlement       = "+0D",
            double settlementCoupon = double.NaN,
            double issuePrice       = double.NaN,
            string firstPaymentDate = null,
            double issueRate        = double.NaN,
            Dictionary <int, double> amoritzationInIndex = null,
            bool renormalizeAfterAmoritzation            = false,
            Dictionary <int, double> compensationRate    = null,
            Dictionary <string, double> optionToCall     = null,
            Dictionary <string, double> optionToPut      = null,
            Dictionary <string, double> optionToAssPut   = null,
            double fixedCoupon   = double.NaN,
            string index         = null,
            string resetDayCount = null,
            string resetCompound = null,
            string resetStub     = null,
            string resetBusinessDayConvention = null,
            string resetToFixingGap           = null,
            string resetTerm              = null,
            int resetAverageDays          = 1,
            int resetRateDigits           = 12,
            double spread                 = double.NaN,
            double floatingRateMultiplier = double.NaN,
            bool stickToEom               = false)
        {
            var tradeInfo = XlManager.GetTrade(tradeId);

            if (!(tradeInfo is BondInfoBase))
            {
                startDate    = startDate ?? DateTime.Now.ToString("yyyy-MM-dd");
                maturityDate = maturityDate ?? new Term("1Y").Next(startDate.ToDate()).ToString();
                BondInfoBase bondInfo = null;
                if (string.IsNullOrWhiteSpace(index))
                {
                    bondInfo = new FixedRateBondInfo(tradeId)
                    {
                        FixedCoupon = double.IsNaN(fixedCoupon) ? 0.03 : fixedCoupon
                    };
                }
                else
                {
                    bondInfo = new FloatingRateBondInfo(tradeId)
                    {
                        Index                  = index ?? "Shibor3M",
                        ResetDC                = resetDayCount ?? "Act365",
                        ResetCompound          = resetCompound ?? "Simple",
                        ResetStub              = resetStub ?? "ShortStart",
                        ResetBD                = resetBusinessDayConvention ?? "ModifiedFollowing",
                        ResetToFixingGap       = resetToFixingGap ?? "-1BD",
                        ResetTerm              = resetTerm ?? "3M",
                        Spread                 = double.IsNaN(spread) ? 0.0 : spread,
                        ResetAverageDays       = resetAverageDays,
                        ResetRateDigits        = resetRateDigits,
                        FloatingRateMultiplier = double.IsNaN(floatingRateMultiplier) ? 1.0 : floatingRateMultiplier,
                        FloatingCalc           = "ZzFrn",
                        CapRate                = 100,
                        FloorRate              = -100
                    };
                }
                bondInfo.StartDate        = startDate;
                bondInfo.MaturityDate     = maturityDate;
                bondInfo.Calendar         = calendar;
                bondInfo.PaymentFreq      = paymentFrequency;
                bondInfo.StickToEom       = stickToEom;
                bondInfo.PaymentStub      = paymentStub;
                bondInfo.Notional         = notional;
                bondInfo.Currency         = currency;
                bondInfo.AccrualDC        = accrualDayCount;
                bondInfo.DayCount         = paymentDayCount;
                bondInfo.AccrualBD        = accrualBusinessDayConvention;
                bondInfo.PaymentBD        = paymentBusinessDayConvention;
                bondInfo.Settlement       = settlement;
                bondInfo.SettlementCoupon = settlementCoupon;
                bondInfo.TradingMarket    = calendar == "chn_ib"
                                        ? TradingMarket.ChinaInterBank.ToString()
                                        : TradingMarket.ChinaExShe.ToString();
                bondInfo.IsZeroCouponBond    = !double.IsNaN(issuePrice);
                bondInfo.IssuePrice          = issuePrice;
                bondInfo.FirstPaymentDate    = firstPaymentDate;
                bondInfo.AmortizationType    = "None";
                bondInfo.AmoritzationInIndex = amoritzationInIndex;
                bondInfo.RenormAmortization  = renormalizeAfterAmoritzation;
                bondInfo.CompensationRate    = compensationRate;
                bondInfo.IssueRate           = issueRate;
                bondInfo.OptionToCall        = optionToCall;
                bondInfo.OptionToPut         = optionToPut;
                bondInfo.OptionToAssPut      = optionToAssPut;
                bondInfo.ValuationParamters  = new SimpleCfValuationParameters("中债国债收益率曲线", "", "中债国债收益率曲线");

                XlManager.AddTrades(new[] { bondInfo });
                tradeInfo = bondInfo;
            }
            return(tradeInfo.ToTradeInfoInLabelData(null));
        }