Tutorials › Exam FM - Financial Mathematics › Numerical Precision in Sequential Discount-Factor Solves

Exam FM · Bootstrapping the Curve · Tutorial 747 of 998

Numerical Precision in Sequential Discount-Factor Solves

Trace rounding error through sequential discount-factor solves and choose precision that keeps bootstrapped prices and spot rates reliable.

Advanced 12 min read

What You'll Learn

  • Solve sequential discount factors from annual coupon-bond prices.
  • Quantify how errors in earlier factors affect later bootstrap steps.
  • Convert discount-factor errors into approximate spot-rate errors.
  • Distinguish calculation precision from the number of displayed decimals.
  • Check the effect of rounding by repricing the input cash flows.

Why Precision Matters in a Sequential Bootstrap

A bootstrap solves for discount factors in maturity order. Each later factor is calculated using earlier factors, so rounding an intermediate result can carry into subsequent solves. The effect may be small in a displayed bond price and still be noticeable in a derived spot rate, particularly when the maturity is long or the final cash flow coefficient is relatively small.

The practical rule is to retain unrounded factors throughout the calculation and round only values intended for reporting. This tutorial quantifies why that rule works, shows how to diagnose rounding effects, and distinguishes a displayed approximation from the value used in the next equation.

Definition: Let \(D_t\) denote the time-0 discount factor for a cash flow paid at time \(t\). For a bond with price \(P\), known cash flows \(C_1,\ldots,C_n\) at times \(1,\ldots,n\), and a final cash flow \(C_n\ne 0\), the sequential bootstrap solves $$ P=\sum_{t=1}^{n} C_tD_t \qquad\Longrightarrow\qquad D_n=\frac{P-\sum_{t=1}^{n-1}C_tD_t}{C_n}. $$ This equation assumes the quoted price is the price of those stated cash flows at time 0, that the earlier factors have already been determined on the same timing basis, and that the final cash flow is nonzero. If cash-flow dates, accrued interest, or the price basis are different, they must be handled consistently before applying the equation.

In the examples, prices and cash flows are in dollars, payments are annual, and the discount factors apply to the stated annual dates. The bonds are hypothetical. Where a spot rate is requested, it is an annual effective spot rate: \(D_n=(1+i_n)^{-n}\), so \(i_n=D_n^{-1/n}-1\). A factor solved from a bond price is not itself a rate, and rounding it before converting it can change the reported rate.

How Errors Carry into the Next Solve

The bootstrap equation makes the propagation mechanism explicit. If the earlier factors used in the calculation differ from their correct values by \(\Delta D_t\), while the price and cash flows are held fixed, then the resulting error in the solved final factor is exactly

$$ \Delta D_n=-\frac{\sum_{t=1}^{n-1}C_t\Delta D_t}{C_n}. $$

This is an exact relation, not just a first-order approximation: subtract the equation using correct earlier factors from the equation using perturbed earlier factors. The errors are weighted by the earlier cash flows. Errors with opposite signs can partly cancel; errors with the same sign reinforce each other. A larger final cash flow coefficient reduces the absolute error in \(D_n\), all else equal.

The spot-rate conversion adds another sensitivity. Differentiating \(i_n=D_n^{-1/n}-1\) gives

$$ \frac{di_n}{dD_n}=-\frac{1+i_n}{nD_n}, \qquad \Delta i_n\approx-\frac{1+i_n}{nD_n}\Delta D_n. $$

This differential is useful for estimating the effect of a small factor error. It is an approximation; for a final reported rate, calculate from the actual factor rather than relying on the differential. The negative sign means that a factor rounded upward produces a lower implied spot rate.

Worked Example: Solving a Three-Maturity Bootstrap

A hypothetical set of annual cash flows has these market prices: a one-year zero-coupon bond pays $1,000 and costs $960; a two-year bond pays $5 at year 1 and $105 at year 2 and costs $96; a three-year bond pays $8 at years 1 and 2 and $108 at year 3 and costs $92. Solve the discount factors in order, retain full precision in later steps, and check the prices.

Method. Solve each equation for the factor at its last payment date, using factors already found. The common mistake to avoid is rounding a factor for display and then substituting that rounded value into the next solve.

At year 1: the only payment is $1,000, so

$$ D_1=\frac{960}{1000}=0.960000. $$

At year 2: the year-1 payment is discounted using \(D_1\), and the year-2 payment using \(D_2\):

$$ 96=5(0.960000)+105D_2, \qquad D_2=\frac{96-4.800000}{105} =\frac{91.200000}{105} =0.8685714286\ldots. $$

At year 3: use the unrounded year-2 factor in the year-3 bond equation:

$$ 92=8(0.960000)+8(0.8685714286\ldots)+108D_3, $$ $$ D_3=\frac{92-7.680000-6.9485714286\ldots}{108} =\frac{77.3714285714\ldots}{108} =0.7164021164\ldots. $$

Price check. Substituting the solved factors reproduces the input prices: \(1000(0.960000)=960\); \(5(0.960000)+105(0.8685714286\ldots)=96\); and \(8(0.960000)+8(0.8685714286\ldots)+108(0.7164021164\ldots)=92\), up to the shown digits. The sequential solves are consistent. Factors are shown to six or more decimals here for readability, but the unrounded values should be carried in subsequent calculations.

Measuring the Effect of Early Rounding

A small factor error need not have the same effect in every bootstrap. Its impact depends on the earlier cash flows and the final cash flow coefficient. The following example compares a full-precision solve with a deliberately rounded calculation.

Worked Example: Rounding Earlier Factors to Three Decimals

A hypothetical one-year zero-coupon bond pays $1,000 and costs $947.36. A two-year bond pays $10 at year 1 and $1,010 at year 2 and costs $919.7563. A three-year bond pays $20 at years 1 and 2 and $120 at year 3 and costs $137.7726. Find the three-year discount factor and spot rate first with full-precision earlier factors, then with those earlier factors rounded to three decimals. Report spot rates to four decimal places.

Full-precision method. The one-year factor is

$$ D_1=\frac{947.36}{1000}=0.94736. $$

The two-year equation gives

$$ 919.7563=10(0.94736)+1010D_2, $$ $$ D_2=\frac{919.7563-9.4736}{1010} =\frac{910.2827}{1010} =0.90127. $$

Use these factors in the three-year equation:

$$ D_3=\frac{137.7726-20(0.94736)-20(0.90127)}{120} =\frac{137.7726-18.9472-18.0254}{120} =\frac{100.8000}{120} =0.840000. $$

The annual effective three-year spot rate is

$$ i_3=0.840000^{-1/3}-1=0.0598398\ldots=5.9840\%. $$

Rounded-input calculation. If the earlier factors are rounded to three decimals, they become \(0.947\) and \(0.901\). Then

$$ \widetilde D_3 =\frac{137.7726-20(0.947)-20(0.901)}{120} =\frac{137.7726-18.9400-18.0200}{120} =\frac{100.8126}{120} =0.840105. $$

The resulting spot rate is

$$ \widetilde i_3=0.840105^{-1/3}-1 =0.0597957\ldots =5.9796\%. $$

The rounded-input factor is \(0.000105\) above the full-precision factor, and the spot rate is about \(0.0044\) percentage points lower. The direction agrees with the sensitivity formula: a higher discount factor implies a lower spot rate. The full-precision calculation, not the rounded-input result, is the appropriate bootstrap result; the rounded calculation illustrates the cost of premature rounding.

Precision in Derived Spot Rates

Rounding a factor can affect a rate even when the factor itself looks close. The rate conversion raises the reciprocal factor to the power \(1/n\). For a small factor error, the approximate rate error is proportional to \((1+i_n)/(nD_n)\). Thus maturity matters, as does the factor level; it is not enough to decide on precision by looking only at the number of decimal places in \(D_n\).

Worked Example: A Long-Maturity Factor Near a Rounding Boundary

A hypothetical ten-year bootstrap produces the discount factor \(D_{10}=0.70004\). A report displays factors to four decimal places, so this factor would appear as \(0.7000\). Calculate the spot rate using the full factor and using the displayed factor. Report both rates to four decimal places and compare them.

Full-factor calculation.

$$ i_{10}=0.70004^{-1/10}-1 =0.0363053\ldots =3.6305\%. $$

Displayed-factor calculation. If \(0.7000\) is mistakenly treated as the calculation value, then

$$ \widetilde i_{10}=0.7000^{-1/10}-1 =0.0363112\ldots =3.6311\%. $$

The displayed-factor calculation is about \(0.0006\) percentage points higher after rounding both rates to four decimal places. The difference is small here, but it is real and can matter when a required tolerance is tight or when rates are used in further calculations. The correct practice is to keep \(0.70004\) for the conversion and use \(0.7000\) only as a display value.

Check. Since \(0.7000<0.70004\), its reciprocal-power rate must be slightly larger. The calculated rates have that direction, providing a quick sign check.

Choosing and Reporting Precision

A useful calculation policy separates internal precision from reported precision. Retain all available digits from each solved factor when calculating later factors and spot rates. Round only the final quantity to the precision required for presentation. If the quoted prices themselves are rounded, do not imply that carrying many digits removes uncertainty in the input; it only prevents avoidable arithmetic error.

1
Record the cash-flow equation.
Write the price as the sum of each dated cash flow multiplied by its discount factor, checking the timing and amount of every payment.
2
Solve sequentially without truncating.
Use the full calculated value of each earlier factor in every later equation. If a calculator or software displays fewer digits, distinguish that display from the stored value.
3
Convert to spot rates only after solving.
Apply \(i_n=D_n^{-1/n}-1\) to the unrounded factor, then round the rate at the end.
4
Reprice as a check.
Substitute the solved factors into each bond’s cash-flow equation. A material price difference can reveal a timing, arithmetic, or premature-rounding error.

A frequent exam trap is to round every intermediate factor to the number of decimals printed in a question or in a working table. For example, using \(0.947\) and \(0.901\) as if they were exact in the preceding three-year calculation produces \(D_3=0.840105\), not \(0.840000\), and changes the derived spot rate. The correction is to preserve \(0.94736\) and \(0.90127\) internally and round only the final reported answer. Another trap is to round a factor and then report a rate to many decimals: extra displayed rate decimals do not restore information lost by rounding the factor.

Key takeaway: In sequential bootstrapping, intermediate rounding changes the inputs to later equations. Carry full precision through factor solves and rate conversions, use repricing to check the calculations, and round only the final reported values.

Check Your Understanding

Work through these original problems in order. Retain full precision until the requested final rounding.

  1. A one-year zero-coupon bond pays $1,000 and costs $960. A two-year bond pays $4 at year 1 and $104 at year 2 and costs $97. Solve \(D_1\) and \(D_2\). (Answer: \(D_1=0.960000\), \(D_2=0.89576923\ldots\))
  2. In a three-year bond solve, the earlier cash flows are $12 and $8, the final cash flow is $108, and the earlier factors used have errors \(+0.0002\) and \(-0.0003\), respectively. With price and cash flows fixed, find the resulting error in the final factor. (Answer: \(0\))
  3. A five-year discount factor is \(0.810000\). Find its annual effective spot rate to four decimal places. (Answer: \(4.3045\%\))
  4. A six-year factor is \(0.8800\), but the full-precision factor is \(0.8799\). Using the small-error sensitivity formula, estimate how much the spot rate based on the full factor exceeds the rate based on \(0.8800\), in percentage points. (Answer: approximately \(0.0019\) percentage points)
  5. A three-year bond pays $10 at years 1 and 2 and $110 at year 3. Its price is $106.309; the earlier factors are \(D_1=0.9436\) and \(D_2=0.8873\). Find \(D_3\) using those exact factors, then using them rounded to three decimals. (Answer: exact-input \(D_3=0.800000\); rounded-input \(D_3=0.7999909\ldots\))
Clinical Biostats