Partner ACV Forecast Engine
- +41%
- P10–P90 spread widening vs. independence
- 28% → 34%
- Floor-miss probability, corrected
- $199K / $182K
- Monte Carlo P50 vs. Bayesian P50
- +10.3 pts
- Top tornado lever
The problem
Pipeline forecasts treat deals as independent events. They are not — quarter-end pressure, macro conditions, and shared activation capacity make them move together. Assuming independence produces a forecast that looks confident and understates real risk in both directions.
What I built
A three-file Python package pairing two independent estimators. A factor-structured Gaussian copula Monte Carlo injects dependence through a shared market factor plus segment and activation-capacity factors, preserving each deal’s marginal close probability exactly and guaranteeing a positive semi-definite correlation matrix by construction. Alongside it, a conjugate Normal-Inverse-Gamma Bayesian run-rate model with trend and Fourier seasonality produces Student-t posterior predictive intervals that widen honestly as the horizon extends. Three deal states with correlated close-by-activate gates, a tornado chart ranking which single deal most moves the probability of hitting target, and a documented Close CRM REST adapter.
What changed
Replaced a single-number forecast with two independently derived distributions and an explicit read on where they disagree. The tornado output changed which deal got worked: unsticking one stalled activation moved the probability of hitting target more than closing either of the two largest opportunities, which were already priced in.
Run it yourself
The copula, in your browser
A port of the same mechanism, on an anonymised pipeline. The deal names and values are synthetic; the behaviour is not.
Stack
Runs locally. The interactive above is a browser reimplementation of the same copula model.