CFDL

OpCo: one buyout at three capital structures

One sponsor buyout run at three capital structures, with the published five-year multiple and return reproduced for each.

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 — holds it five years and sells at the same multiple. Revenue grows 5, 6, 7, 6 and 5 per cent; margin, depreciation and capital expenditure hold at their trailing ratios; working capital turns on stated days.

The same deal is run at three capital structures. Only the financing changes:

Term Loan BSenior NotesSub NotesTotal
Base3.0x @ L+3.00%2.0x @ 7.0%1.0x @ 8.5%6.0x
High leverage3.0x @ L+3.50%2.5x @ 7.0%2.0x @ 10.0%7.5x
Low leverage3.0x @ L+2.75%1.5x @ 6.0%4.4x

The subordinated notes pay in kind for three years. Every dollar of free cash flow after a 1% mandatory amortization sweeps against the term loan, and interest accrues on the average balance — so the balance depends on the interest that depends on the balance.

The reference

A seven-step leveraged buyout teaching model published as a downloadable spreadsheet, free and without registration. It carries its own financing-case switch, and publishes a five-year multiple and return for each of the three structures across a grid of entry and exit multiples.

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.

It publishes a period-by-period debt schedule for Base only. For the other two structures it publishes the returns and nothing in between.

What it exercises

Packopco
Declaredtwo states, five curves, two native streams, three run scenarios
Language featuresrun-config scenarios, cfg.* parameters, declared state with init/next, curves
Conventionsaverage-balance interest, payment-in-kind accrual, a 100% cash sweep, tranche sizing to a debt increment, a sponsor cheque struck as the plug

The financing case is the run configuration, not the model: the deterministic run is Base and two scenarios override the tranche sizes, coupons and the sponsor's cheque. That is what the source's own case switch does.

Sizes are not stated as inputs. Each tranche is its leverage multiple times LTM EBITDA rounded to a $25m increment, and the sponsor's cheque is whatever balances sources against uses. Base checks the rule — its published $275m, $175m and $100m are what 3.0x, 2.0x and 1.0x round to — and the other two structures are derived rather than transcribed.

The result

All three structures reproduce the published multiple and return.

MoICreferenceIRRreference
Base2.9528232.95282324.1788%24.1788%
High leverage5.4790465.47904640.5209%40.5209%
Low leverage2.2718752.27187517.8357%17.8357%

Worst disagreement across all six figures: 4.5e-7.

Base additionally asserts the term loan and subordinated balances period by period; the term loan agrees at the engine's own publication precision across all five years.

For the two scenarios nothing between the inputs and the answer is anchored: the operating build, the sizing rule, the sweep, the PIK accrual, the exit and the returns arithmetic all have to be right to land on a published multiple. Base anchors every intermediate line; these two anchor none.

The delta

There is no arithmetic delta on the returns.

One column carries a looser tolerance, and the reason is the reference. The subordinated PIK accrual is self-referential, and the source solves it by switching on iterative calculation where this model solves it in closed form. Checked against the reference's own equation, B = B0 + avg(B0, B) * r:

residual
closed form−1.4e-14
reference+3.7e-05

The source stopped iterating while its own equation still had a residual of 3.7e-5, so that is what its convergence supports and the column is asserted to 1e-4. The closed form is the more accurate of the two.

One thing the case does not cover: the reference publishes a full 5x5 grid of entry and exit multiples for each structure — 150 figures. This asserts the 8.0x / 8.0x corner of each; the rest needs one scenario per grid point.

Run configuration

{
  "deterministic": {
    "annual_discount_rate": 0.0,
    "parameters": {
      "cfg.tlb_size": 275.0,
      "cfg.senior_size": 175.0,
      "cfg.sub_size": 100.0,
      "cfg.tlb_spread": 0.03,
      "cfg.senior_rate": 0.07,
      "cfg.sub_rate": 0.085,
      "cfg.fee_amort": 1.3604166666666666,
      "cfg.sponsor_equity": 158.9375
    }
  },
  "scenarios": {
    "high_leverage": {
      "parameters": {
        "cfg.tlb_size": 275.0,
        "cfg.senior_size": 225.0,
        "cfg.sub_size": 175.0,
        "cfg.tlb_spread": 0.035,
        "cfg.senior_rate": 0.07,
        "cfg.sub_rate": 0.1,
        "cfg.fee_amort": 1.6729166667,
        "cfg.sponsor_equity": 36.8125
      }
    },
    "low_leverage": {
      "parameters": {
        "cfg.tlb_size": 275.0,
        "cfg.senior_size": 125.0,
        "cfg.sub_size": 0.0,
        "cfg.tlb_spread": 0.0275,
        "cfg.senior_rate": 0.06,
        "cfg.sub_rate": 0.085,
        "cfg.fee_amort": 0.9854166667,
        "cfg.sponsor_equity": 305.4375
      }
    }
  }
}

Verified results

Checked period by period: 2 series across 6 periods12 values in all, each within the tolerance shown.

  • asset.tlb.balance — within ±1e-6
  • asset.sub_notes.balance — within ±1e-4

Checked per scenario, each a full run under its own parameters:

Scenariomodel.moicmodel.irr
high_leverage5.4790462495779440.40520922846134866
low_leverage2.27187512957806260.178357014624281

Summary metrics for the base run:

MetricValueTolerance
model.moic2.952822546525116±0.00001
model.irr0.24178803124249515±0.00001