I had great difficulty finding the answer to this online after a great deal of looking so I hope this will be useful to others.
Note the difficulty here is dealing with non-annual coupon payments and real-world dates that do not match round years.
What we are essentially doing when creating a zero-coupon curve is creating a curve that gives us a discounting rate for various tenors (maturities) that is not 'dirtied' by the differing coupons of each of the bonds that have been issued. Given that bonds with a higher coupon will have a lower duration (you get your money back quicker so there is less risk) we need to make an adjustment. Zero-coupon curves allow us to assess relative value without the distortion of the coupon's impact on duration.
So in simple terms the steps to take are:
- Get the yield to maturity and tenor (in years) for each bond for the issuer.
- Interpolate to fit a curve to the points (e.g. Nelson Siegel OLS regression) which will give you the parameters to get the corresponding yield for any/all maturity/tenors.
- Build a full curve of say 30 years at semi-annual increments using the Nelson Siegel formula and the parameters that were optimized above by inputting each time value (0.5, 1, 1.5, ..., 29.5, 30) into the NS formula with the parameters. You now have the 'par curve' for semi-annual maturities going out 30 years.
- The yields at a tenor of 0.5 years calculated above is a zero-coupon rate and your starting point for bootstrapping the zero-coupon curve.
- We then use bootstrapping to construct the zero/spot curve. We use the interpolated yield for each tenor as the ANNUAL COUPON which defines the cash flows before maturity. The price to which we discount each set of cashflows is $100 (or par value). There are plenty of explanations of bootstrapping online but can post here if necessary.
Why is the coupon and price determined like this you ask? because we can say that if the issuer was to issue a new bond today for that tenor they would be issuing at the interpolated yield to maturity and an issue price of $100 (par) (therefore the coupon is equal to the yield).
I hope this makes sense - please ask any questions or let me know where I have gone wrong.