Skip to content
All library documents

Why Yield Changes Alone Do Not Give a Treasury Bond’s Total Return

Article Quant Q&A · Author: qfd

Summary

The document asks whether a short RQuantLib script can estimate the total return of a five-year constant-maturity Treasury bond from a yield series. Its proposed approach reprices a fixed-rate bond using consecutive observations as coupon and discount yields, treats the resulting price change as a return, then adds a yield-based income term.

The example is useful as a prompt to examine bond-return construction, but it does not include an answer or validation. The setup uses a constructed bond with dates based on the current date rather than a clearly defined rolling five-year instrument, and it does not explain coupon accrual, elapsed time, roll-down, or how the price function’s output is scaled. The added yield-over-360 term is asserted without justification. As presented, the method should not be taken as a reliable total-return calculation without resolving these modeling and convention issues.

Key ideas

  • The example estimates price return by repricing a fixed-rate bond with consecutive yield observations.
  • It attempts to add an income component based on the prior yield divided by a day-count denominator.
  • A constant-maturity yield series is not itself the price history of one continuously held bond.
  • Bond dates, coupon accrual, roll-down, and pricing conventions need to be specified before interpreting the result as total return.

Tags

Full text
# compute return from yield


# compute return from yield












I was wondering if someone familiar with the RQuantLib library can have a look and let me know if this makes sense.

I am trying to get total return of a 5 year constant maturity treasury bond. Does the below make sense?

```
### Bonds
# Calculate total returns from the yield of 5 year constant matury bond    
getSymbols("DGS5", src="FRED") #load US Treasury 5y yields from FRED
data <-DGS5
ret[1]<-0
for (i in 1:(nrow(data)-1)) {
temp <- FixedRateBondPriceByYield(yield=data[i+1,1]/100, issueDate=Sys.Date(), maturityDate=advance("UnitedStates/GovernmentBond", Sys.Date(), 10, 3),  rates=data[i,1]/100,period=2)[1]/100-1                         
ret[i+1]<-temp

}
#total return will be the price return + yield/360
tret <- ret + lag(data,k=1)/360/100
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.