public double YieldFromFullPrice(Cashflow[] cashflows, IDayCount dayCount, Frequency frequency, Date startDate, Date valueDate, double fullPrice, TradingMarket tradingMarket, bool irregularPayment = false) { var remainingCfs = cashflows.Where(x => x.PaymentDate > valueDate).ToList(); if (!remainingCfs.Any()) { return(0.0); } try { var left = -0.999999; if (remainingCfs.Count == 1) { if (tradingMarket.Equals(TradingMarket.ChinaInterBank)) { dayCount = new ModifiedAfb(); } var timeToMaturity = dayCount.CalcDayCountFraction(valueDate, cashflows.Last().PaymentDate, remainingCfs.First().RefStartDate, remainingCfs.First().RefEndDate); left = -1.0 / timeToMaturity + 1e-6; } else { left = -1.0 * frequency.CountPerYear() + 1e-6; } var fcn = new SolveYtm(cashflows, dayCount, frequency, startDate, valueDate, fullPrice, tradingMarket, irregularPayment, this); //adjust left to avoid NaN var fLeft = fcn.F(left); var delta = 0.01; while (double.IsNaN(fLeft)) { var temp = fcn.F(left + delta); if (temp < 0.0) { break; } fLeft = temp; left += delta; } return(BrentZero.Solve(fcn, left, 1000000, 1e-12)); } catch (Exception ex) { throw new PricingBaseException("Bond yield does not converge " + ex.GetDetail()); } }
public double YieldFromFullPrice(Cashflow[] cashflows, IDayCount dayCount, Frequency frequency, Date startDate, Date valueDate, double fullPrice, TradingMarket tradingMarket, bool irregularPayment = false) { var remainingCfs = cashflows.Where(x => x.PaymentDate > valueDate).ToList(); if (!remainingCfs.Any()) { return(0.0); } try { var left = -0.999999; if (remainingCfs.Count == 1) { if (tradingMarket.Equals(TradingMarket.ChinaInterBank)) { dayCount = new ModifiedAfb(); } var timeToMaturity = dayCount.CalcDayCountFraction(valueDate, cashflows.Last().PaymentDate, remainingCfs.First().RefStartDate, remainingCfs.First().RefEndDate); left = -1.0 / timeToMaturity + double.Epsilon; } var fcn = new SolveYtm(cashflows, dayCount, frequency, startDate, valueDate, fullPrice, tradingMarket, irregularPayment, this); return(BrentZero.Solve(fcn, left, 1000000, 1e-12)); } catch (Exception ex) { throw new PricingBaseException("Bond yield does not converge " + ex.GetDetail()); } }