NumPy Financial NPV Finance Model#
The NumpyFinancialNPV component calculates the Net Present Value (NPV) of a commodity-producing plant or technology over its operational lifetime using the NumPy Financial npv method.
It is implemented as an OpenMDAO ExplicitComponent and integrates with system-level technoeconomic optimization workflows.
The component evaluates profitability by discounting future cash flows — including capital expenditures (CAPEX), operating expenses (OPEX), refurbishments, and revenues — based on user-defined financial parameters.
Future cash flows are discounted using a nominal, pre-tax weighted average cost of capital (WACC) that blends the cost of equity and the cost of debt according to the plant's capital structure. Because the WACC is pre-tax and the cash flows are not tax-adjusted (no income tax, depreciation, or interest tax shield is modeled), the discount rate and cash flows are kept internally consistent. If a fully after-tax analysis is required, use the ProFAST-based finance model instead.
By convention:
Investments and costs (CAPEX, OPEX, refurbishments) are negative cash flows.
Revenues (commodity sales) are positive cash flows.
Model Inputs#
NumpyFinancialNPVFinanceConfig#
Description
Configuration class defining financial parameters for the NPV calculation.
Implements validation and default handling using the attrs library.
Attribute |
Type |
Description |
Default |
|---|---|---|---|
|
|
Operating life of the plant in years. Must be ≥ 0. |
— |
|
|
Real equity rate / cost of equity (0-1). Can be either a real or nominal rate depending on how |
- |
|
|
Real debt rate / cost of debt (0-1). Converted to nominal via the Fisher equation when |
|
|
|
Ratio of debt to equity ( |
|
|
|
Inflation rate (0-1). Combined with the real equity and debt rates via the Fisher equation |
|
|
|
Sale price of the commodity (USD/unit). |
|
|
|
OpenMDAO unit string for |
— |
|
|
Whether to save annual cost breakdowns to CSV. |
|
|
|
Whether to save per-technology NPV breakdowns to CSV. |
|
|
|
Descriptor appended to output filenames. |
|
An example of what to include in the plant_config to use the NPVFinance model. This is included in ["finance_parameters"]["finance_groups"], where npv is the specific finance_group name.
npv:
finance_model: "NumpyFinancialNPV"
model_inputs:
real_discount_rate: 0.09 # real equity rate (cost of equity); also the discount rate when no debt is specified
debt_rate: 0.05 # optional, defaults to 0; real cost of debt
debt_equity_ratio: 1.0 # optional, defaults to 0; D/E used to weight the pre-tax WACC
inflation_rate: 0.0 # optional, defaults to 0; provide e.g. 0.025 if the rates above are real
commodity_sell_price: 0.078 # if commodity is electricity $/kwh
commodity_sell_price_units: "USD/(kW*h)" # OpenMDAO unit string for the sell price
save_cost_breakdown: True
save_npv_breakdown: True
Note
plant_life is included in the plant section of the plant_config yaml.
Model Outputs#
Name |
Units |
Description |
|---|---|---|
|
|
Total discounted Net Present Value for the system. |
Output Files (if enabled)#
File |
Description |
|---|---|
|
Annual time series of costs and revenues per technology. |
|
Discounted NPV summary by cost/revenue category. |
Calculation Methodology#
Assemble Cash Flows
CAPEX (negative) at year 0
OPEX (negative) and revenue (positive) for years 1–
plant_life
Refurbishments
Technologies with
replacement_cost_percentand a refurbishment period incur periodic capital costs.
Discounting
Each series of cash flows is discounted using NumPy Financial’s
npf.npv(effective_rate, values), whereeffective_rateis the nominal, pre-tax WACC computed by_compute_wacc.The real equity rate (
real_discount_rate) and real debt rate (debt_rate) are first converted to nominal rates via the Fisher equation(1 + nominal) = (1 + real) * (1 + inflation_rate)(see_real_to_nominal_rate). Wheninflation_rateis left at its default of 0, this conversion is a no-op and the supplied rates are used directly (i.e., treated as nominal).The nominal rates are then blended by capital structure:
equity_weight = 1 / (1 + debt_equity_ratio) debt_weight = debt_equity_ratio / (1 + debt_equity_ratio) WACC = equity_weight * equity_rate + debt_weight * debt_rate
No interest tax shield is applied to the debt leg, so the WACC is pre-tax, consistent with the pre-tax cash flows. When
debt_equity_ratiois 0, the WACC reduces to the (nominal) equity rate, and a pre-computed WACC can be supplied directly throughreal_discount_rate. The multiplicative (Fisher) form matches the way ProFAST combines its real rates andgeneral_inflationinputs.
Summation
Total NPV = sum of all discounted cash flows.
Optional Output Files
*_cost_breakdown.csv: Annual cash flow time series*_NPV_breakdown.csv: Discounted NPV breakdown per item