Infrastructure Yield Model
A discounted cash flow model for evaluating greenfield infrastructure projects under regulatory and demand uncertainty.
Overview
This project is a flexible DCF framework built in Python for analyzing the risk-adjusted returns of long-dated infrastructure investments — specifically toll roads, regulated utilities, and transit concessions. The model handles the unusual financial characteristics of infrastructure: long asset lives, regulated rate structures, step-in rights, and inflation-linked revenue. Output is a probability distribution of IRR and equity multiple, generated via Monte Carlo simulation across key input assumptions.
Problem
Standard DCF models treat inputs as point estimates. For infrastructure, where a concession agreement might run 30 years, that's a serious problem — small errors in traffic growth or regulatory reset assumptions compound dramatically over time. Analysts working on greenfield deals often build sensitivity tables by hand, which doesn't capture correlation between variables (e.g., interest rates and inflation tend to move together). I wanted a model that treated uncertainty as a first-class input rather than an afterthought.
Approach
The model is structured in three layers: (1) a deterministic base-case DCF for sanity-checking individual assumptions, (2) a scenario engine that applies discrete regulatory and demand shocks at specified years, and (3) a Monte Carlo layer that draws correlated random variables from a Cholesky-decomposed covariance matrix. Input distributions are specified per-variable (normal, log-normal, triangular) in a configuration YAML file, keeping the simulation logic separate from the financial assumptions.
Build
Built entirely in Python using NumPy for matrix operations and Matplotlib/Seaborn for output charts. The covariance structure is estimated from historical data on comparable assets, with the option to override manually for scenarios where historical analogues are weak. The model outputs a full distribution of project IRR, equity IRR, and debt service coverage ratio at each year, with percentile bands plotted as fan charts. A simple CLI lets you point it at any YAML config file and run a simulation in under 10 seconds on a standard laptop.
Lessons Learned
Building the covariance matrix was harder than I expected. Real-world infrastructure variables aren't cleanly correlated in any direction — traffic and GDP are loosely positive, but construction cost overruns are nearly uncorrelated with both, and regulatory reset decisions are driven by political cycles that don't map to any economic variable neatly. I ended up building an "expert override" mode that lets you specify correlations from judgment when historical data is thin. The broader lesson: quantitative models are most dangerous when they give false precision to assumptions that are fundamentally qualitative.
Metrics
Validated against two published infrastructure deal post-mortems. Base-case IRR estimates were within 80 bps of actual outcomes in both cases. Monte Carlo runs at N=10,000 complete in 8.3 seconds on M2 MacBook Air.