Want to add bonds to your Riskalyze portfolios? See Working with Bonds in Riskalyze Portfolios for a detailed walkthrough.

## Overview

Riskalyze models bonds based on maturity date, coupon rate, and price, in conjunction with estimates of bond market movements and volatility. Riskalyze does not specifically incorporate other factors such as credit rating, optionality, or type (muni/federal/corporate), though such factors are arguably included in the bond’s price post issue date.

Generally, bond duration is the weighted average of a series of cash flows, but for our purposes duration represents the price sensitivity of a bond to changes in a benchmark yield (per 1% yield change). Greater duration means a given change in interest rates will have a greater impact on a bond’s price. For example, a 3% coupon bond with a duration of 7 years will lose 7% of its value if rates rise to 4%, and vice versa if rates drop.

Duration is a linear (first order) approximation and would suggest that, in the example above, rates rising to 5% would cause a 14% price drop. In fact, duration also decreases as rates rise, so we would see a reduced sensitivity to yield changes as rates increased. Convexity is the mathematical representation of this property and is the second order factor. The formula for estimating a bond’s price change ∆P due to a benchmark yield change ∆r with duration D and convexity C is ∆P/P = -D*∆r + C/2 * ∆r^2 ^{[2]}

Let's look at a Berkeley, CA muni bond with a maturity of September 2037 and a 4.625% coupon rate. This bond is currently trading at $101.174, giving a current yield of 4.571%.

The calculated duration ^{[1]} for this coupon with 42 remaining payments is 13.37 and its convexity^{[2]} is 238.40.

Riskalyze uses the volatility of the 10-year treasury (the standard deviation of ^TNX from 1980 to present), which is +/- 38bps in a month. That 38bps sigma for 10-year treasuries corresponds to +/- 50bps for a 20-year bond (this is determined based on historical bond yield curves). This corresponds to a one month bond price volatility of +/- 6.9% (13.37 * 0.0050 + 238.4 / 2 * (0.0050 ^ 2)), and a 6-month volatility of 17%.

This is what our bond looks like in Riskalyze.

[1] https://en.wikipedia.org/wiki/Bond_duration

[2] https://en.wikipedia.org/wiki/Bond_convexity

## Stress Tests

Riskalyze stress tests follow the same approach as above but using different yield changes for each scenario. The 2013 Bull Market saw the 10-year treasury go up 115bps, and (based on historical yield curves) we estimate 20-year bond prices would rise roughly 152bps in that scenario. It’s worth noting here that due to specific federal reserve policies, the 20-year treasury did not rise 152bps as we would generally expect, but the general rule here still applies. The same calculation produces an expected portfolio return of -5% in 6 months, as shown in the stress test (for a portfolio allocated 100% to this bond)

## Retirement Maps

Retirement maps, when using a specific portfolio (rather than a Risk Number benchmark) for the underlying projection, will be affected by the same bond calculations that affect the portfolio. Note that a portfolio with bonds assumes 6-month return and volatility is applicable for the span of the retirement map, i.e. it assumes the portfolio could be proportionally reinvested into bonds with similar parameters (coupon rate, maturity) in perpetuity.

## Unrecognized bonds

Since most custodians roll most of the relevant bond parameters into the holding’s name, Riskalyze may be able to infer the required data during the sync. When an integrated data feed syncs account holdings into Riskalyze, any individual bond holdings which are not recognized in Riskalyze’s existing universe of securities will be modeled as individual bonds based on the data available in the data feed. If coupon and maturity data (at a minimum) cannot be found, the holding can be created as a custom investment.