Posterior Multiples for Pricing, Leverage, and Covenants

Letting M~i=wiMi+(1wi)μ\tilde{M}_i = w_i M_i + (1-w_i)\mu shrink comps before the covenant debate.

11/3/2025

Most investment committees still open with a comp table: a handful of deals, a simple average, and a narrative about where “the market” sits. Those tables are better than nothing, but they struggle whenever data are sparse, biased, or drawn from the wrong regime. This post offers a friendlier alternative: treat entry and exit multiples as full distributions, let thin sectors borrow strength from thick ones, and read pricing/leverage/covenant decisions off the posterior.

In private markets every meaningful decision—how much to pay, how much to lever, which covenants to accept—depends on two quantities:

  • The entry multiple you negotiate today (typically enterprise value divided by the latest twelve months of EBITDA or revenue). Paying 11× on $50M of EBITDA implies a $550M purchase price, which sets your equity check once leverage is chosen.
  • The exit multiple you expect to realize later. Exit EV/EBITDA, plus EBITDA growth and deleveraging, drives DPI/TVPI and covenant compliance.
  • The spread between entry and exit. A single turn of multiple expansion on $60M of EBITDA adds $60M of value—often the difference between hitting a target IRR and missing it.

Treating those numbers as fixed points forces you to pretend certainty where there isn’t any. Treating them as posterior distributions—with partial pooling across sectors and explicit macro regimes—lets the investment committee talk about pricing corridors, leverage frontiers, and covenant odds using the same underlying model. That is the job of this post.


Thesis: treat multiples as distributions

Classic comp tables pretend each observed multiple is a fact we can average. In reality the data are scarce, biased, and regime-dependent. A hierarchical Bayesian model reframes each comp as a draw from a sector and macro-state distribution:

  • Sector-level anchors absorb thin deal histories without collapsing every industry into the same mean.
  • Deal-level covariates (size, growth, margins, leverage, process type) explain systematic differences.
  • A regime mixture handles credit cycles so exits priced in 2011 do not pollute exits priced in 2022.

Once we operate on distributions, we can talk about pricing corridors (“IRR stays above 18% until you pay 10×”), leverage frontiers (“ICR breach probability crosses 5% above 4× net debt”), and covenant odds with actual posterior probabilities—not gut-feel haircuts.

Posterior exit multiples by sector

Consumer

Median exit EV/EBITDA

9.88×

80% band [6.87, 12.84]×

Energy

Median exit EV/EBITDA

9.91×

80% band [6.63, 12.67]×

Financial Services

Median exit EV/EBITDA

9.41×

80% band [6.66, 12.39]×

Healthcare

Median exit EV/EBITDA

9.66×

80% band [7.21, 12.38]×

Industrial

Median exit EV/EBITDA

10.07×

80% band [7.27, 12.95]×

Technology

Median exit EV/EBITDA

9.96×

80% band [7.32, 12.85]×

5101520ConsumerEnergyFinancial ServicesHealthcareIndustrialTechnology
ConsumerEnergyFinancial ServicesHealthcareIndustrialTechnologyPosterior draws of exit EV/EBITDAEV / EBITDA (×)

Each card highlights the posterior median exit EV/EBITDA and 80% band for a sector. The ridge plot underneath shows the same information as smooth densities—the Technology ridge is narrow and centered near 9.6× because the dataset has depth, while Consumer and Energy shrink toward the global anchor because their historical samples are thinner. This is what “borrowing strength” looks like in practice.


Why point comps fail

Point-estimate comps are brittle for structural reasons:

  • Thin samples. Some sector–vintage buckets barely reach n=6n=6 observations, so the variance is enormous.
  • Selection bias. The deals we hear about are not random draws; weak companies go dark, strong companies transact.
  • Survivorship bias. Public comp sets quietly drop delisted names and M&A exits, inflating “market” averages.
  • Denominator noise. EBITDA is measured with error, and dividing by a noisy denominator pushes reported multiples upward.
  • Cycle effects. Multiples expand and compress with credit spreads, liquidity, and animal spirits—but point tables rarely disclose that state.

Figure: what goes wrong with thin samples. Sampling noise (left), survivorship uplift (middle), and noisy denominators (right) are why we prefer a distributional view over a single comp average.

What goes wrong with thin samples

Sampling noise, survivorship drift, and noisy denominators are the reasons we prefer a hierarchical posterior over point comps.

123456678910111213
Sampling variability (n = 6)Deal indexEV / EBITDA (×)
9.1×10.4×Full historySurvivors only88.599.51010.51111.5
Survivorship upliftAverage EV / EBITDA (×)
202224262888.599.510
Observed (noisy EBITDA)True multipleDenominator noise (bias up)EBITDA (true $M)EV / EBITDA (×)

From left to right: a six-deal comp set swings wildly around the “true” 10× level, survivorship bias inflates averages once weak deals disappear, and noisy EBITDA denominators push reported multiples upward. These pathologies are the motivation for treating multiples as a hierarchy rather than a single number. The next sections walk through the data we need, the hierarchical + regime-aware model we fit, and the decision tools (pricing corridor, leverage frontier, covenant odds) that fall out of the posterior.


Data schema: what we feed the model

The data layer produces one row per deal/comp with everything the model needs:

  • Target features XiX_i. Log revenue, growth, EBITDA margin, capital intensity, leverage, diligence quality, and process type explain systematic differences across companies.
  • Context features. Sector s[i]s[i], geography, fund vintage v[i]v[i], and the macro snapshot (credit spreads, base rates, public EV/EBITDA) tied to the deal date drive pooling and the regime gate.
  • Outcome. Realized or marked exit multiples Mi=EV/EBITDAM_i = \text{EV}/\text{EBITDA}, modeled on the log scale for stability.
  • Entry/exit linkage. Entry multiples, net leverage, debt cost, and covenant floors feed the pricing corridor, leverage frontier, and covenant stress sections downstream.

Keeping entry, exit, and macro state together means the PyMC model can learn how multiples evolve through regimes while the decision layer can translate those draws into IRR/DPI/ICR metrics—no more sprinkling “market standard” comps in isolation.


Model: hierarchical shrinkage with a regime mixture

We model log multiples:

logMiN(μi,σ2),μi=αs[i]+βXi+γzi.\log M_i \sim \mathcal{N}(\mu_i, \sigma^2), \qquad \mu_i = \alpha_{s[i]} + \beta^\top X_i + \gamma_{z_i}.
  • αs\alpha_{s} captures sector anchors with partial pooling.
  • β\beta encodes deal-level controls that travel across sectors.
  • γzi\gamma_{z_i} adds a regime effect determined by latent state ziz_i.

4.1 Partial pooling across sectors

αsN(μα,τα2),μαN(0,102),ταHalfCauchy(1).\alpha_s \sim \mathcal{N}(\mu_\alpha, \tau_\alpha^2), \qquad \mu_\alpha \sim \mathcal{N}(0, 10^2), \qquad \tau_\alpha \sim \text{HalfCauchy}(1).

Thin sectors shrink toward the global anchor μα\mu_\alpha, while data-rich sectors keep distinct levels. The Half-Cauchy prior makes the shrinkage adaptive: wide sectors learn their own mean, narrow sectors lean on the pool.

4.2 Mixture for regime shifts

We introduce a latent regime zi{1,,K}z_i \in \{1, \ldots, K\}:

ziCategorical(π),πDirichlet(1),z_i \sim \text{Categorical}(\pi), \quad \pi \sim \text{Dirichlet}(\mathbf{1}), γkN(0,τγ2),τγHalfCauchy(1),k=1Kγk=0.\gamma_k \sim \mathcal{N}(0, \tau_\gamma^2), \quad \tau_\gamma \sim \text{HalfCauchy}(1), \quad \sum_{k=1}^{K} \gamma_k = 0.

Start with K=2K=2 (“easy credit” vs “tight credit”). Later, let π\pi depend on macro covariates via a softmax gate to morph the mixture into a mixture-of-experts.

Regime offsets (multiplicative on EV/EBITDA)

Component 0 (easy credit)

Median × 1.00 (80% [0.81, 1.24])

Component 1 (tight credit)

Median × 1.00 (80% [0.80, 1.24])

15020025030035000.20.40.60.81
Median Easy-credit weightP10P90Regime probability vs credit spreadsHigh-yield spread (bps)Pr(easy credit state)
0.60.811.21.41.60100200300400500
Component 0 (easy)Component 1 (tight)Mixture offsets (multiplicative on EV/EBITDA)Offset (×)Frequency

The gate is deliberately soft: median weight on the easy-credit component is roughly 0.52 when spreads are 150 bps and drifts down to ~0.41 once spreads push past 390 bps. That is enough to encode “credit is tight” without making the mixture jump discontinuously. The histograms show each component shifting exit multiples by ~±25% (roughly 0.6–1.6× multipliers), which is the magnitude we observe in the historical data—meaningful for pricing, but still tame enough that the hierarchy stays stable.

4.4 PyMC implementation

The PyMC workflow includes data prep, model definition, sampling, and JSON export. Full code and sampler settings are tucked into [1] so the main text can stay focused on the modeling story. Implementation details—likelihood choice, priors, mixture stability, pooling depth, etc.—plus the formal specification live in [2].


Turning posteriors into decisions

Posterior draws of MoutM_{\text{out}} plug directly into pricing, leverage, and covenant conversations. Think of the stack this way: (1) entry multiple + EBITDA today tells you the purchase price, (2) posterior exit multiples + forecast EBITDA trace out a distribution of terminal values, and (3) those cash flows roll through your IRR/DPI calculator. The workflow below assumes you already have that cash-flow model so the Bayesian layer can hand it realistic draws instead of single points.

5.1 Pricing corridors

Let the proposed entry multiple be MinM_{\text{in}} and the posterior for exit multiple be

logMoutdataN(μ^,σ^2).\log M_{\text{out}} \mid \text{data} \sim \mathcal{N}(\hat{\mu}, \hat{\sigma}^2).

Push posterior draws through your IRR/DPI engine and pick MinM_{\text{in}} inside a corridor where

median IRRtarget,Pr(DPI<1)ϵ.\text{median IRR} \ge \text{target}, \qquad \Pr(\text{DPI}<1) \le \epsilon.

Concretely, suppose the posterior exit multiple for a software roll-up centered on 11× (80% band [9.5,12.5][9.5, 12.5]) and you are debating whether to pay 9× or 10× on 50M50\text{M} of entry EBITDA. At 9× you write a 450M450\text{M} enterprise-value check and the posterior IRR median clears 20% with only 7% probability of capital loss. At 10× the check jumps to 500M500\text{M}, leverage headroom shrinks, and the posterior puts 14% probability on DPI < 1. The math is the same model, but the interpretation is now “choose the multiple where the probability of ruin stays under policy.”

Figure: Pricing corridor fan. Plot IRR quantiles against MinM_{\text{in}} with a shaded inadmissible region where Pr(DPI<1)>ϵ\Pr(\text{DPI}<1)>\epsilon. It turns comps into a buy discipline instead of an anecdote.

789101112−10−50510020406080100
IRR p90IRR medianIRR p10P(DPI<1)Pricing corridor vs entry multipleEntry EV/EBITDA (×)IRR quantiles (%)P(DPI<1) (%)

Read the corridor plot like a stoplight: the teal bands are IRR quantiles as you raise entry EV/EBITDA, and the dotted line is the probability of losing money (DPI < 1). In this dataset the posterior says you can pay up to ~9.5× before the median IRR dips below target, and ruin probability stays under 10% until you print double digits. That is miles more informative than “the average comp is 9.2×.”

5.2 Leverage safety margins

Leverage decisions follow the same playbook: instead of “3.5× feels prudent,” translate net debt into posterior odds of hitting IRR targets and breaching coverage covenants. Let λ\lambda be net debt-to-EBITDA at close. For each posterior draw—complete with revenue growth, margin evolution, and debt cost—we project EBITDA paths and interest coverage:

ICRt=EBITDAtCash interesttPr ⁣(mintICRt<threshold)δ.\text{ICR}_t = \frac{\text{EBITDA}_t}{\text{Cash interest}_t} \qquad \Pr\!\big(\min_t \text{ICR}_t < \text{threshold}\big) \le \delta. [3]

Figure: Leverage frontier. Plot expected IRR and probability of ICR breach as functions of λ\lambda, and highlight the max leverage that satisfies the breach cap.

11.522.533.544.55−10−5051015020406080100
IRR medianP(ICR breach)Leverage frontierNet debt / EBITDA (×)IRR (%)P(ICR < 1.75) (%)

The leverage frontier makes the same idea visual for capital structure. The shaded IRR band peaks near 3.5–4.0× net debt; beyond that, incremental leverage doesn’t add expected return but the dotted line (probability of ICR breach) accelerates. This lets you argue for—or against—an aggressive debt package using posterior odds instead of “market standard” anecdotes.

5.3 Covenant stress via exit-multiple tails

Pricing and leverage decisions live in the middle of the posterior; covenant conversations live in the tail. Once you set a downside trigger m\*m^\* (e.g., “ICR fails if EV drops 1.5x” or “springing covenant trips if exit EV/EBITDA falls below 7.5×”), you can read the probability straight off the posterior:

Pr ⁣(Mout<mdata)=q.\Pr\!\big(M_{\text{out}} < m^\ast \mid \text{data}\big) = q.

In practice we lift the exact same posterior draws used in §5.1–5.2 and compute the cumulative distribution against covenant thresholds. That produces a simple “tail odds” table you can bring to lenders: at m\*=7.5×m^\*=7.5\times the posterior says q0.09q \approx 0.09, so you size the covenant cushion until qq sits inside the credit policy (say 5%). Tighten the covenant to 6.5×6.5\times and qq falls to ~3%. You can even track how qq evolves as macro regimes rotate, which is much more actionable than a shrug (“this feels safe”) and traces back to the same hierarchy that set pricing and leverage.


Diagnostics that earn trust

Charts already embedded above double as diagnostics:

  • Sector ridge plots show shrinkage working: if a sector were over-pooled you would see a flat ridge glued to the global mean; instead, Technology, Industrial, and Financial Services retain distinct medians that mirror the underlying data.
  • Macro fan chart demonstrates the regime layer is contextual: exit-multiple bands widen in 2008–2009 and tighten in mid-cycle vintages, matching lived experience.
  • Mixture panel confirms the gate behaves: the “easy credit” histogram concentrates around modest positive offsets while the “tight credit” histogram sits symmetrically below zero; no label-switching headaches.

Two additional visuals make the trust argument explicit:

  • Prior vs posterior overlay. The gray prior is deliberately weak (it allows absurd 150× EV/EBITDA values), while the blue posterior sits exactly where the data do (roughly 8–12×). Seeing the blue band spike inside 10× while the gray band is flat from 0–30× proves the posterior owes everything to the data, not to a smuggled prior.

    051015202530050100150200250
    Prior (capped at 30×)Posterior predictivePrior vs posterior on exit EV/EBITDAEV / EBITDA (×)Count
  • Posterior predictive checks. The small multiples below compare observed EV/EBITDA histograms (orange) to simulations (blue) for each sector. Overlap means the model can reproduce the data it claims to explain; gaps highlight exactly where to iterate next (Energy still has heavier tails, so that is where we add variance structure).

    Posterior predictive vs observed (sector × vintage)
    51015010203040
    ObservedSimulatedConsumerEV / EBITDA (×)Count
    51015010203040
    ObservedSimulatedEnergyEV / EBITDA (×)Count
    51015010203040
    ObservedSimulatedFinancial ServicesEV / EBITDA (×)Count
    5101501020304050
    ObservedSimulatedHealthcareEV / EBITDA (×)Count
    51015010203040
    ObservedSimulatedIndustrialEV / EBITDA (×)Count
    51015010203040
    ObservedSimulatedTechnologyEV / EBITDA (×)Count

Outside the charts we still log R^\hat{R}, effective sample sizes, and backtests (log score/Brier) in the notebook, but these visuals are what we show stakeholders to prove the hierarchy is calibrated.


Culture change in IC decks

  • Replace “The comp average is 9.2×9.2\times” with “Posterior median is 8.7×8.7\times (80% band [7.6,10.1][7.6, 10.1]), and tight-credit regime probability is 35%.”
  • Put pricing corridors and leverage frontiers on one page so decisions trace back to posterior odds.
  • Report calibration quarterly—average log score, Brier score for downside events, realized vs predicted multiples.
  • Keep a one-page appendix on priors, pooling structure, and sensitivity outcomes to demystify the Bayesian layer.
  • Make it a mantra: we buy distributions, not points.

Ideas for extending the modeling stack (dynamic intercepts, public–private bridges, selection adjustments) live in [4].

Closing

Point comps are fragile artifacts from a data-poor era. A hierarchical posterior delivers sector- and vintage-aware multiples with uncertainty you can act on. When pricing corridors, leverage frontiers, and covenant stress tests all reference the same posterior, the investment committee sees decisions grounded in distributions—not darts.

  1. Note [1]

    The PyMC driver script that loads data, fits the hierarchy, and emits JSON:

    from pathlib import Path
    
    import pymc as pm
    
    from python_experiments.models import hierarchical_multiples as hm
    
    dataset = hm.load_dataset(min_exit_multiple=3.0)
    model = hm.build_model(dataset)
    
    with model:
        idata = pm.sample(
            draws=750,
            tune=750,
            chains=4,
            target_accept=0.96,
            random_seed=2024,
        )
    
    hm.summarize_results(
        idata=idata,
        data=dataset,
        output_path=Path("hb_multiples.json"),
    )

    The core of build_model reflects the hierarchy, covariates, and regime gate described in §4:

    def build_model(data: MultiplesDataset, component_count: int = 2) -> pm.Model:
        coords = {
            "sector": data.sector_labels,
            "feature": data.feature_names,
            "obs_id": np.arange(data.log_multiples.size),
            "component": np.arange(component_count),
        }
    
        with pm.Model(coords=coords) as model:
            sector_idx = pm.Data("sector_idx", data.sector_idx, dims="obs_id")
            X = pm.Data("X", data.X, dims=("obs_id", "feature"))
            spread_std = pm.Data("spread_std", data.credit_spread_std, dims="obs_id")
    
            mu_alpha = pm.Normal("mu_alpha", 0.0, 1.5)
            tau_alpha = pm.HalfNormal("tau_alpha", 1.0)
            alpha_sector = pm.Normal("alpha_sector", mu=mu_alpha, sigma=tau_alpha, dims="sector")
    
            beta = pm.Normal("beta", 0.0, 1.0, dims="feature")
            base_mu = alpha_sector[sector_idx] + pm.math.sum(X * beta, axis=1)
    
            gamma_raw = pm.Normal("gamma_raw", 0.0, 0.5, dims="component")
            gamma = pm.Deterministic("gamma", gamma_raw - pm.math.mean(gamma_raw))
    
            gate_intercept = pm.Normal("gate_intercept", 0.0, 2.0)
            gate_coef = pm.Normal("gate_coef_spread", 0.0, 2.0)
            logit_pi = gate_intercept + gate_coef * spread_std
            weights = pm.Deterministic(
                "mixture_weights",
                pm.math.stack([pm.math.sigmoid(logit_pi), 1 - pm.math.sigmoid(logit_pi)], axis=1),
            )
    
            sigma = pm.HalfNormal("sigma", 0.4)
            component_means = pm.math.stack([base_mu + gamma[0], base_mu + gamma[1]], axis=1)
            comp_dist = pm.Normal.dist(mu=component_means, sigma=sigma)
    
            logp_components = pm.logp(comp_dist, data.log_multiples[:, None])
            pm.Potential("likelihood", pm.math.sum(pm.logsumexp(pm.math.log(weights) + logp_components, axis=1)))
    
        return model
    [back]
  2. Note [2]

    Implementation notes referenced in §4:

    • Likelihood. Work on logM\log M for stability, convert back via exp(μ)\exp(\mu) or exp(μ+σ2/2)\exp(\mu + \sigma^2/2).
    • Priors. Standardize features and use Normal priors on β\beta, Half-Cauchy scales on τα\tau_\alpha, τγ\tau_\gamma, and σ\sigma.
    • Robustness levers. Swap the Normal likelihood for Student-tt tails when outliers dominate, add errors-in-variables for noisy EBITDA, and drop in vintage random effects if the mixture feels too coarse.
    • Mixture stability. Start with K=2K=2 regimes; if chains mix poorly, drop to a vintage random effect, then reintroduce the gate.
    • Pooling depth. Add super-sector anchors (αg[s]\alpha_{g[s]}) when sectors are ultra-sparse.
    • Software. PyMC or Stan both work; mixture-of-experts gates sometimes benefit from Pólya–Gamma augmentations.
    • Speed vs rigor. Variational inference is fine for exploration, but rerun full NUTS before quoting numbers.
    [back]
  3. Note [4]

    Extensions that slot neatly into the pipeline:

    • Dynamic intercepts. Let αs,t\alpha_{s,t} follow a random walk to capture secular drifts.
    • Public–private bridge. Jointly model public comps with a latent discount for private transactions.
    • Selection correction. Add a first-stage probit (“deal observed”) and propagate the correction à la Heckman.
    • Heteroskedasticity. Allow σ2(Xi)\sigma^2(X_i) to grow with leverage or cyclicality.
    [back]
  4. Note [3]

    Interest Coverage Ratio (ICR): EBITDA divided by cash interest expense. An ICR of 2.5× means the company generates 2.5 dollars of EBITDA for every dollar of interest owed, and dropping below covenant floors (e.g., 1.5×) typically triggers lender remedies.

    [back]