dcf_calculate: Unlevered discounted cash flow model for a commercial real...

View source: R/dcf.R

dcf_calculateR Documentation

Unlevered discounted cash flow model for a commercial real estate asset

Description

Builds an indexed annual pro forma over years 0..N, a terminal value, and unlevered valuation metrics including net present value (NPV) and internal rate of return (IRR) for a directly held commercial real estate (CRE) asset, without debt. The annual operating chain is made explicit through gross effective income (GEI), net operating income (NOI), and property before-tax cash flow (PBTCF).

Usage

dcf_calculate(
  acq_price,
  entry_yield,
  exit_yield,
  horizon_years,
  disc_rate,
  exit_cost = 0,
  capex = 0,
  index_rent = 0,
  vacancy = 0,
  opex = 0,
  noi = NULL,
  terminal_growth = NULL
)

Arguments

acq_price

Numeric scalar. Acquisition price (net of tax or all-in, depending on the chosen convention).

entry_yield

Numeric scalar in [0, 1]. Entry yield; in top-down mode, NOI[1] = entry_yield * acq_price.

exit_yield

Numeric scalar in (0, 1]. Exit yield.

horizon_years

Integer scalar greater than or equal to 1. Projection horizon N in years.

disc_rate

Numeric scalar in (0, 1]. Discount rate.

exit_cost

Numeric scalar in [0, 1). Exit cost as a fraction of the sale price. Default is 0.

capex

Numeric scalar or numeric vector of length N. Capital expenditure per year. Default is 0.

index_rent

Numeric scalar or numeric vector of length N. Annual rent indexation rate. Used only in top-down mode. Default is 0.

vacancy

Numeric scalar or numeric vector of length N in [0, 1). Average annual vacancy. Used only in top-down mode. Default is 0.

opex

Numeric scalar or numeric vector of length N. Operating expenses (non-recoverable). Default is 0.

noi

Numeric scalar or numeric vector of length N, optional. Exogenous operating income path (for example computed from leases). When non-NULL, it replaces the internal income calculation and is treated as the NOI path from which explicit gei, noi, and pbtcf columns are derived.

terminal_growth

Optional numeric scalar. Growth rate used to forwardize the stabilised terminal NOI by one year for resale valuation. When NULL, the function infers a conservative growth rate from the latest clean NOI observations, falling back to zero when no robust inference is available.

Details

Time convention: year = 0..N. The acquisition is booked at year = 0 in free_cash_flow as a negative cash flow equal to the acquisition price, and the sale is booked only at year = N in sale_proceeds. The project NPV corresponds to the sum of discounted_cash_flow.

Two construction modes are available for the NOI path:

  • Top-down mode (default): when noi is NULL, the NOI path is derived from the entry yield and acquisition price: NOI[1] = entry_yield * acq_price, then indexed with index_rent and adjusted by vacancy. In this mode, gei is reconstructed as noi + opex so that the cap-rate convention remains anchored on NOI1, which is the textbook convention used in direct capitalization and terminal-value estimation.

  • Bottom-up mode: when noi is supplied (scalar or vector), it is recycled to length N and used as the NOI[1..N] path. In this case, entry_yield, index_rent, and vacancy are not used to recompute NOI.

Value

A list with:

  • inputs: list of main assumptions,

  • cashflows: tibble 0..N with standardised columns,

  • npv: project net present value (NPV),

  • irr_project: project internal rate of return (IRR), unlevered.

Examples

res <- dcf_calculate(
  acq_price = 1000,
  entry_yield = 0.06,
  exit_yield = 0.055,
  horizon_years = 3,
  disc_rate = 0.08,
  capex = c(5, 5, 0),
  index_rent = c(0.01, 0.01, 0.01),
  vacancy = c(0.05, 0.05, 0),
  opex = c(10, 10, 10)
)
res$npv
res$irr_project
head(res$cashflows)


cre.dcf documentation built on April 10, 2026, 5:08 p.m.