What it does
The core DCF engine. Takes all prior outputs — including the four 10-year forecast schedules from growth-and-profitability — and runs the full FCFF valuation, producing an estimated value per share.The three stages
Stage 1: 10-year FCFF projection
The engine consumes four pre-computed schedules (each a list of 10 values, one per year) generated by the curve shapes library:| Schedule | Controls | Source |
|---|---|---|
growth_schedule | Revenue growth rate per year | Start → end via selected curve type |
margin_schedule | Operating margin per year | Start → end via selected curve type |
s2c_schedule | Sales-to-capital ratio per year | Start → end via selected curve type |
coc_schedule | Cost of capital per year | Initial WACC → terminal CoC via selected curve type |
| Line item | Computation |
|---|---|
| Revenue | Prior year × (1 + growth_schedule[t]) |
| Operating margin | margin_schedule[t] |
| EBIT | Revenue × operating margin |
| Tax rate | Effective tax rate, converging to terminal tax by year 10 |
| After-tax EBIT | EBIT × (1 − tax rate), with NOL shielding if applicable |
| Reinvestment | Δ Revenue / s2c_schedule[t] |
| FCFF | After-tax EBIT − reinvestment |
| PV(FCFF) | FCFF / cumulative discount factor at coc_schedule[t] |
Stage 2: Terminal value
- FCFF(11) = year 11 free cash flow (at stable growth)
- WACC(stable) = cost of capital at maturity (risk-free rate + base ERP, or user override)
- g(stable) = stable growth rate (typically ≤ risk-free rate)
Stage 3: Equity bridge
Default assumption overrides
Beyond the four forecast schedules, the model accepts 9 toggles for structural assumptions (terminal cost of capital, terminal ROIC, failure probability, reinvestment lag, tax convergence, NOL carryforward, risk-free rate override, growth rate override, trapped cash). In Expert mode, all 9 are presented for user override. In Novice and Lucky modes, Damodaran’s standard defaults are used.Python engine
The math is implemented inlib/dcf_engine.py — a pure Python module with no AI dependencies. It accepts both pre-computed schedules (from the curve library) and legacy scalar inputs (for backward compatibility). Every intermediate value is logged to the run transcript for auditability.