Monthly Bond Returns for US Treasuries

Previously I showed how to build a bond fund simulator (#1 & #2). To keep things straightforward we started with simulating annual returns. But we can extend the model to also calculate monthly returns with a bit of work.

Why would we want monthly returns? Yearly returns can be a bit misleading, since they are always based on January-to-January. And we don’t only buy and sell in January. Sometimes we buy or sell in June or October.

A while back I posted a chart from J.P. Morgan showing the difference between calendar year returns and intra-year returns for the S&P 500.

Image for post
Image for post

The same obviously can happen with bonds.

There are a couple of different models we can use to generate monthly bond returns.

This is how Damodaran and Ibbotson (among others) calculate bond returns. You buy a 10-year bond. The next year you sell the 10-year bond and buy another one. When calculating how much you get for selling your old bond, you pretend it is still has a 10-year maturity — that way you don’t need to muck around trying to figure out how much a 9-year bond might have been worth in July of 1923.

This model is straightforward & simple. You can do it pretty easily in a spreadsheet with a present value calculation using the new rate and the old rate.

=pv(current rate, 10 years, old rate, 1)

Then you need to add in any interest you received.

Here’s a spreadsheet that has imported Shiller’s most recent data ( and performs these straightforward calculations.

Now we can take those numbers and try to compare them to something to see how we’re doing. The Bloomberg Barclays Intermediate Treasury Total Return USD sounds like exactly what we want. And Morningstar provides weekly & monthly data for it.

Here’s a spreadsheet that compares our “Simple Model” versus the Barclays Index.

Image for post
Image for post
Telltale chart of Simple Model vs. Barclays Index

A telltale chart shows the ratio of cumulative returns. Ideally, we want this to be a straight line at 1: that means the two are an exact match. Whenever the line drops below 1, it means our cumulative returns are less than the index. When the line is above 1, it means our cumulative returns are greater than the index.

The “Simple Model” has resulted in us overstating returns by 0.71% a year. It has a correlation with the index of 0.8899655872, according to our spreadsheet.

Now let’s go back to our bond fund simulator. Previously it was just using annual rate data. But we also have monthly rate data available. With a few small tweaks we can use that monthly rate data to calculate the value of our fund every month, not just once a year.

What this means is that our bond fund:

  1. Has 7 bonds (a 10-year bond, a 9-year bond, etc, all the way down to a 4-year bond)
  2. The bonds pay interest every month; we keep that money in cash in the fund.
  3. Every January we sell the youngest bond. We buy a new 10-year bond using the proceeds of the sale and any interest we accumulated during the year.

On the surface, this sounds like an improvement. Though keeping all the interest in cash for a year doesn’t sound so great.

Here’s a spreadsheet of the results.

Image for post
Image for post

This look like an improvement. It still is far from a straight line but we shouldn’t expect perfection from a simple model.

We are still overstating the annual growth: the index grew at 6.96% and our model grew at 7.38%. So we’re overstating it by 0.41%. That’s less than the 0.71% of the Simple Model. And our correlation has gone from 0.88 to 0.92537368.

This model still has two things that don’t seem so great:

  1. We’re keeping cash around for a whole year, instead of reinvesting the interest as soon as we receive it.
  2. We only ever buy & sell bonds in January.

Now we’re going to stretch our simulation a bit. Instead of having one bond for each year, we want to have twelve bonds for each year. One for every month. That means for our multi-year ladder we won’t just have seven bonds any more. We’ll have over 70. And every single month we’ll sell a bond and replace it with a new one.

We won’t ever have any idle cash sitting around.

We’ll also be a bit more sensitive to changing interest rates, since we’ll be buying bonds every single month. Previously if the rates dropped in February but recovered in March it only showed up as a temporary blip in our price. But now we’ll be buying one of those low-rate February bonds and holding it for years, causing a constant, on-going impact on our returns.

Here’s the spreadsheet and telltale chart.

Image for post
Image for post

This is a bit of a mixed bag. Now our average returns are 7.74% versus the index returns of 6.96%. That’s a difference of 0.77%. That’s worse than even the Simple Model. On the other hand, our correlation has improved going up to 0.9307994284.

Hmmm…not sure what to make of that, to be honest. I don’t like how much we end up overstating returns compared to the actual index. The correlation improvement is very marginal compared to the Annual Turnover model.

There’s clearly more digging that needs to be done. Though at some point we have to just throw up our hands and accept our model about the past is imperfect and live with that imperfection.

I think for my personal testing, I’ll stick with the monthly numbers generated by the Annual Turnover model for now.

Learn how to enjoy early retirement in Vietnam. With charts and graphs.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store