CFDL

OpCo: LBO debt schedule with average-balance interest

A leveraged buyout's debt schedule, where interest accrues on the average balance and every dollar of free cash flow sweeps against the term loan.

Every number below is checked against an independent reference implementation on every commit — period by period, and on each metric, inside a declared tolerance. See benchmark methodology.

The case

A sponsor buys a mid-market business for $720m — 8.0x an LTM adjusted EBITDA of $90m — funded with a $275m term loan B, $175m of senior notes, $100m of subordinated notes that pay in kind for three years, a 5% management rollover and $158.9m of sponsor equity. The model runs the four-year hold: a 35% tax rate, a $5m minimum cash balance, 1% mandatory term loan amortization, and every remaining dollar of free cash flow sweeping against the term loan.

The case is the debt schedule. Interest accrues on the average of each period's opening and closing balance, which is the standard convention and the reason an LBO is usually said to need an iterative solver: interest depends on the closing balance, the closing balance depends on how much cash swept the debt down, and that cash is net of interest.

The reference

A seven-step leveraged buyout teaching model published as a downloadable spreadsheet, free and without registration. It solves the same schedule by iteration — it ships a CIRC switch that turns on the spreadsheet's iterative calculation.

It publishes a complete cash flow table: every balance, every interest line and every cash figure, as cached values in the workbook, so the comparison is period by period rather than against a single answer.

Not redistributable. The workbook carries an "All Rights Reserved" notice and no open license, so it is neither vendored nor wired into the test suite. It was downloaded once outside the repository and only its output numbers were carried across.

What it exercises

Packopco
Declaredfive curves, four states, five native streams
Language featuresdeclared state with init/next, curves read by curve_value, native streams
Conventionsaverage-balance interest, payment-in-kind accrual, a floating rate off a published path, a 100% cash sweep

The four states carry the debt balances: the term loan and the subordinated notes, each with its opening value, so a stream can see both ends of a period.

The result

Exact. Against the reference's own unrounded cached values, the closed form agrees to 2.8e-14 — machine epsilon — across all sixteen balance and interest figures.

yearterm loan balancereferenceterm loan interestreference
2017238.517440443238.5174404438.9865552088.986555208
2018199.519287769199.5192877698.9797529288.979752928
2019156.762561123156.7625611238.0163416008.016341600
2020120.484780576120.4847805767.1391190497.139119049

Asserted: the term loan and subordinated note balances, four interest lines and the repayment, across four years — 33 figures in total.

The delta

There is no arithmetic delta. The largest figure anywhere in the case is 4.5e-7, on the final year's repayment line, and it is the engine's own publication precision rather than a disagreement: results carry money to six decimal places, so half of that is the tightest any case here can assert.

The loop is linear in the closing balance — every step affine in it, with no products of unknowns and no thresholds — so collecting terms solves it in one substitution, which is what the model's next clause does. That holds because no constraint binds in this deal: the revolver is never drawn, the term loan never fully repays, and minimum cash is exactly met. A deal that hit any of those would be piecewise linear, which is a different problem.

Run configuration

{
  "deterministic": {
    "annual_discount_rate": 0.10
  }
}

Verified results

Checked period by period: 7 series across 5 periods30 values in all, each within ±1e-6 of the reference.

  • asset.tlb.balance
  • asset.sub_notes.balance
  • opco.interest.term_loan
  • opco.interest.sub_notes
  • opco.interest.senior_notes
  • opco.interest.undrawn_revolver
  • opco.debt.repayment