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()); }
/// <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")); }
/// <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)); }