# YTM of “very-seasoned” bond issues

There is a liquidity premium between on-the-run treasury issues and off-the-run issues with similar characteristics. This is why when building a yield curve, typically on-the-run issues are used to compute this curve as a representation of the risk-free rate.

It seems to be common academic and practitioner practice to remove these "special" securities (for obvious issues) when building the curve. However, when doing relative value analysis between these bonds, these off-the-runs are used exclusively.

Typically there are still discrepancies between very seasoned issues.

1. How are these issues (eg an original 30 year bond with less than 2 years to maturity and very high coupon) incorporated into yield curve calculations?
2. How can I meaningfully get a YTM for this example maturity?

For example, today's closest maturity original 30-year bond is:

912810EB0 - Nov15'18 9.0 - BID 101.14000 ASK 101.30600 Mark Yield 1.994%

(edit: this yield is provided by the brokerage, but does seem reasonable so their "bond math" did not blow up like mine did).

I have tried my own bond math and some calculators available here: http://www.quantwolf.com/calculators/bondyieldcalc.html

def bond_ytm(bond):

price = float(bond['END OF DAY'])
par = 100.
T = bond['T']
t = pd.to_datetime(bond['date'])

if bond['SECURITY TYPE'] == 'MARKET BASED FRN':
freq = 4
else:
freq = 2

coupon = float(bond['RATE'].strip('%'))/freq
coupon_dates = get_coupon_dates(bond, afterDate=t)

# zero-coupon
if len(coupon_dates) == 0:
return (par/price)**(1/T) - 1.0

dt = dates_to_relative(coupon_dates, anchor=t)

def Px(Rate):
return price - (((par + coupon) / (1 + Rate/freq)**(T)) + ((coupon/Rate) * sum([(1 / (1+Rate/freq)**(time*freq)) for time in dt]) ))

ytm_func = lambda y: coupon*sum([1/(1+y/freq)**(time) for time in dt]) + 1/(1+y/freq)**(freq*T)
guess = coupon/par
return optimize.newton(Px, 0.03, maxiter=500)


Both of these are giving me results that are nonsense (like a 25% YTM).

How can I get some meaningful results for these very seasoned issues?

• Did you use clean price? – xiaomy Sep 10 '18 at 18:17
• When I use the link you provided and a price of 101.14, I get a yield of 2.475%. Are you missing a decimal somewhere? – Helin Sep 10 '18 at 18:46
• Yes, Helin, I apologize. I was able to replicate the 2.475% number. What modification is needed to get to the broker provided 1.944%? xiaomy - I believe all US prices are quoted 'clean', so this bid at 101.14 is clean – Jared Sep 10 '18 at 19:07
• My code was not converging above - I will try to post a complete example with cashflow dates, etc (get_coupon_dates() is not defined above)). – Jared Sep 10 '18 at 19:07
• 1.944% looks like the yield from mid price – xiaomy Sep 10 '18 at 21:22

There is a liquidity premium between on-the-run treasury issues and off-the-run issues with similar characteristics. This is why when building a yield curve, typically on-the-run issues are used to compute this curve as a representation of the risk-free rate.

Depends on what you're using the curve for. In practice, it is far more prevalent to use only OFF-the-run issues to construct fair value yield curves and compute analytics.

How are these issues (eg an original 30 year bond with less than 2 years to maturity and very high coupon) incorporated into yield curve calculations?

The treatment differs country to country, depending on market conditions. In the US, these highly seasoned securities are typically excluded completely, because they're illiquid, trade differently from more recent issues with comparable maturities, and generally do not provide much information regarding "fair value." A typical rule of thumb is to remove seasoned securities that have rolled out of their original maturity buckets. For example, 30-year bonds with less than 10 years to maturity can be excluded. Even better, at this tenor (<1 year), don't use Treasury rates at all! Use repo rates, since they're the proper financing rates anyways.

How can I meaningfully get a YTM for this example maturity?

Because this bond is in its last coupon period, the simple interest convention is used. The accrued interest is: $$AI = \frac{\text{9/11/2018} - \text{5/15/2018}}{\text{11/15/2018} - \text{5/15/2018}}\times \frac{9}{2} = 2.910326087.$$

Therefore, the price-yield formula is $$101.223 + 2.910326087 = \frac{104.5}{1 + \frac{y}{2} \cdot \text{DCF}},$$ where the day count fraction DCF is $$DCF = \frac{\text{11/15/2018} - \text{9/11/2018}}{\text{11/15/2018} - \text{5/15/2018}} = 0.35326087.$$ Solving for $y$ gives 1.994% precisely.

I am getting a reasonable yield for that issue.

Go to the following website:

https://www.opencminc.com

1. Switch to Bond Panel under Calculators section
2. Type in 912810EB0 inside ISIN filter in the “Existing Securities” grid on the left side of the calculator panel and press Enter
3. Click on the selected security to see its term structure, price, yield, cashflows, etc. This bond will be priced from yield curve in the market data section which is above Calculators panel.

Hope this helps. Thanks

1.994% yield would correspond to mid(ish) clean price of 101.223. Adding accrued interest of about 2.9103 to the clean price gives a settlement price of 104.1333. Feeding this price into the calculators you have been using should give you the yield of about 2%.

PS: some US bonds calculators use simple compounding when pricing during the last coupon period.