I have purchased I bond from TreasuryDirect in the amount of $10K in 8/2021 and 1/2022, totaling $20K. Currently, TreasuryDirect shows the interest rate of 9.62% for my 8/2021 purchase and 6.48% for my 1/2022 purchase. The current value of my I bonds are $21,312.00. How did TreasuryDirect calculate this current value? Thank you.
You can look here for the data used in the calc.
The actual calculation is straightforward. According to the screenshot, your 01-2022 bond has 3 periods with the following compound rates: 7.12%, 9.62%, 6.48%.
- How the inflation rates are computed are illustrated in this answer.
- How the interest itself is determined is shown here.
- How the following formula for the compound rate is designed is explained here
Composite rate = [Fixed rate + (2 x Semiannual inflation rate) + (Fixed rate x Semiannual inflation rate)]
The calculation in words
All bond values are based on a $25 bond and rounded to two decimal places. Since interest is paid semiannually, you need to divide the rate by 2. Individual months within each 6 months period (afterwards the inflation rate resets) are computed with the following compounding logic: (1+rate)^(1/6) for the first month, (1+rate)^(2/6) for the second month and so forth. The only "trick" is that you need to start the next period with the final value from the previous period because that value is already "accrued".
The simplest case of buying the bond at the beginning of the inflation reset
If you hold the I bond from the first issue Date in the period, you get the accumulated value, as seen on the websites calculator:
This is for a denomination of $1,000 for the one that pays $70.8 - hence in your case $708, the other for $,5000 which means that the $302 displayed become $604 in your case, which gives a total gain of $708+$604 = 1,312.
Below, I'll use Julia to run the computation.
# input packages using Dates, DataFrames #define interest rates i_Nov21 = 0.0712 # for the first period i_May22 = 9.62/100 i_Nov22 = 6.48/100 # define return function: $25*(1+rate)^(1/6) rounded for two digits (Note: 25 is only valid for the first period - afterwards it is the "compounded" value function i_bond(val, rate, len) return [round(val*(1+rate/2)^(i/6), digits=2) for i in 1:1:len] end # compute interest earned nov21 = [i_Nov21 for i in 1:1:6] may22 = [i_May22 for i in 1:1:6] nov22 = [i_Nov22 for i in 1:1:3] # combine all periods interest = append!(append!(nov21,may22),nov22) # compute returns per1 = i_bond(25,i_Nov21, 6 ) per2 = i_bond(per1[end], i_May22, 6) # end value "per1[end]" in first period is start value in second per3 = i_bond(per2[end], i_Nov22, 3) # combine all period returns ret = append!(append!(per1,per2),per3) # define DataFrame dts = Date(2021,11):Month(1):Date(2023,1) df = DataFrame(Dates = dts) df[!, "Annualized Rate"] = interest df[!, "Cumulative Value"] = ret df[!, "Value of 10K"] = df[!, "Cumulative Value"]*(10000/25) # print Prettytable PrettyTables.pretty_table(df, alignment = :l, border_crayon = Crayons.crayon"blue", header_crayon = Crayons.crayon"bold green", highlighters = (hl_value(10768)))
The reason you get 3 months less is due to the note (P5) in the screenshot of TreasuryDirect, which means TreasuryDirect reports values minus the three-month interest penalty for early redemptions. Therefore, the value for the bond in the first screen is the 10,768 in amber in my computation. This is identical to the 1,076.8 from the first TreasuryDirect screenshot (for 1,000 and 10,000 nominal respectively).
You purchased yours in 01/2022 which is another 2 months later. Hence you need to look at the value that is 2 months prior (the one inside the red box). So you have 604 interest rate gain (the second TreasuryDirect screenshot is for 5,000 and shows 302).
This bond gained 708 interest, which in total makes it 604 + 708 + 20,000 = $21,312.00.
Hope this helps.