private void SolveBondYield() { DateTime previousCoupon; DateTime nextCoupon; Basis.GetPreviousNextCoupons(this.Settlement, this.Maturity, this.Period, out previousCoupon, out nextCoupon); var accruedPeriod = Basis.AccruedPeriod(this.Settlement, previousCoupon, this.Period, this.DayCountBasis); var payments = Basis.PaymentCount(this.Maturity, nextCoupon, this.Period); this.Accrued = accruedPeriod * (this.Rate / this.Period) * this.Principal; Func <double, double> bondPrice = (calcYield => { var pv = 0d; for (var i = 0; i < payments; ++i) { var payment = (this.Rate / this.Period); var discountFactor = Math.Pow(1 + calcYield / this.Period, -(1 - accruedPeriod + i)); pv += (i == payments - 1) ? (payment + 1) * discountFactor : payment * discountFactor; } return(pv - accruedPeriod * (this.Rate / this.Period) - this.Clean); }); this.YieldToMaturity = Mathematics.FindRoot(bondPrice, 0d, 0.5d); this.PV = this.Clean * this.Principal + this.Accrued; }
public void CalculateYieldToHorizon() { DateTime previousCoupon; DateTime nextCoupon; Basis.GetPreviousNextCoupons(this.HorizonDate, this.Maturity, this.Period, out previousCoupon, out nextCoupon); var accruedPeriod = Basis.AccruedPeriod(this.HorizonDate, previousCoupon, this.Period, this.DayCountBasis); var lastCoupon = previousCoupon; Basis.GetPreviousNextCoupons(this.Settlement, lastCoupon, this.Period, out previousCoupon, out nextCoupon); var payments = Basis.PaymentCount(lastCoupon, nextCoupon, this.Period); Basis.GetPreviousNextCoupons(this.Settlement, this.Maturity, this.Period, out previousCoupon, out nextCoupon); var accruedToPay = Basis.AccruedPeriod(this.Settlement, previousCoupon, this.Period, this.DayCountBasis); var couponsToHorizon = 0d; var payment = (this.Rate / this.Period) * this.Principal; for (var i = 0; i < payments; ++i) { couponsToHorizon += payment * Math.Pow(1 + this.HorizonReinvestment / this.Period, i + accruedPeriod); } this.HorizonPV = this.HorizonPrice * this.Principal + (accruedPeriod * this.Principal * this.Rate / this.Period) + couponsToHorizon; this.HorizonYield = Math.Pow(Math.Pow(this.HorizonPV / this.PV, 1 / (payments + accruedPeriod - accruedToPay)), this.Period) - 1; this.HorizonGross = this.HorizonPV - this.PV; }
public override void Calculate() { var settlementToMaturity = Basis.AccruedPeriod(this.Maturity, this.Settlement, 1, this.DayCountBasis); this.FV = this.Principal * (1 + this.Rate * settlementToMaturity); this.PV = this.Principal; this.Yield = this.Rate * (1 / (1 - this.Rate * settlementToMaturity)); }
public override void Calculate() { CalculatePV(); var settlementToMaturityInverse = 1 / Basis.AccruedPeriod(this.Maturity, this.Settlement, 1, this.DayCountBasis); this.Yield = (settlementToMaturityInverse * (this.Principal - this.PV)) / this.PV; }
public override void Calculate() { var issuedToMaturity = Basis.AccruedPeriod(this.Maturity, this.Issued, 1, this.DayCountBasis); this.FV = this.Principal * (1 + this.Coupon * issuedToMaturity); var settlementToMaturity = Basis.AccruedPeriod(this.Maturity, this.Settlement, 1, this.DayCountBasis); this.PV = this.FV / (1 + this.Rate * settlementToMaturity); }
public override void CalculatePV() { if (Math.Abs(this.FV) < Mathematics.Error) { CalculateFV(); } var settlementToMaturity = Basis.AccruedPeriod(this.Maturity, this.Settlement, 1, this.DayCountBasis); this.PV = this.FV / (1 + this.Rate * settlementToMaturity); }
public double GetAdjustedCurrentYield() { if (Math.Abs(this.Clean) < Mathematics.Error) { CalculateClean(); } DateTime previousCoupon; DateTime nextCoupon; Basis.GetPreviousNextCoupons(this.Settlement, this.Maturity, this.Period, out previousCoupon, out nextCoupon); var accruedPeriod = Basis.AccruedPeriod(nextCoupon, this.Settlement, this.Period, this.DayCountBasis) / this.Period; var payments = Basis.PaymentCount(this.Maturity, nextCoupon, this.Period) / this.Period; return((this.Rate + ((1 - this.Clean) / (payments + accruedPeriod))) / this.Clean); }
private void CalculateClean() { DateTime previousCoupon; DateTime nextCoupon; Basis.GetPreviousNextCoupons(this.Settlement, this.Maturity, this.Period, out previousCoupon, out nextCoupon); var accruedPeriod = Basis.AccruedPeriod(this.Settlement, previousCoupon, this.Period, this.DayCountBasis); var payments = Basis.PaymentCount(this.Maturity, nextCoupon, this.Period); this.Accrued = accruedPeriod * (this.Rate / this.Period) * this.Principal; this.PV = 0d; for (var i = 0; i < payments; ++i) { var payment = (this.Rate / this.Period) * this.Principal; var discountFactor = Math.Pow(1 + this.YieldToMaturity / this.Period, -(1 - accruedPeriod + i)); this.PV += (i == payments - 1) ? (payment + this.Principal) * discountFactor : payment *discountFactor; } this.Clean = this.PV - this.Accrued; }
public void CalculateFV() { var settlementToMaturity = Basis.AccruedPeriod(this.Maturity, this.Settlement, 1, this.DayCountBasis); this.FV = this.Principal * (1 + this.Rate * settlementToMaturity); }
public void CalculateFV() { var issuedToMaturity = Basis.AccruedPeriod(this.Maturity, this.Issued, 1, this.DayCountBasis); this.FV = this.Principal * (1 + this.Coupon * issuedToMaturity); }