Skip to main content
CFDL

CRE: a renewal option on a lease

The two-tenant office DCF with Tenant A's expiry as a renewal option on the lease: exercised at expiry when the market rent exceeds the option rent, and a re-let at market when it does not.

Every number below is checked against an independent reference implementation on every commit — period by period, and on each metric, inside a declared tolerance. See benchmark methodology.

The case

The two-tenant office building of office_two_tenant, held for ten years, with one change. Tenant A's five-year lease carries a renewal option: five more years at $520k a year, escalating 3% on the renewal term's anniversaries, with $100k of tenant improvements and leasing commissions at renewal. At expiry the tenant renews if the market rent then exceeds the option rent. If the option lapses, the space is re-let at market after three months of downtime, on a new lease with $350k of leasing costs. Tenant B, the vacancy allowance, the operating expenses, the permanent mortgage and the sale on forward net operating income are the original's, unchanged.

The reference

Institutional lease-by-lease office DCF conventions, as practiced by the commercial valuation software this kind of model is built in. The original case handles Tenant A's expiry as a probability-weighted rollover. This case handles it as the right the lease grants: a renewal at stated terms, exercised or not, with each outcome a lease of its own.

Not redistributable. The source cannot be published, so the reference is an independent recreation of its conventions, built separately from the model and compared against it period by period. It is the original case's recreation with the rollover replaced by the option and its two outcomes.

Provenance. The expectations are generated by the recreation described above, not taken from an external document. Nothing external asserts them; they stand as regression cover.

What it exercises

Packcre
Contract typescre.lease_unit (four instances), cre.vacancy_loss, cre.opex_line, cre.permanent_debt, cre.exit (forward NOI), and the election CRE.Option.Renewal
Language featuresan option written on a contract, an option's own terms, an option tested on a stated date, actions on exercise, a scheduled event, a run scenario
Conventionsfree rent, anniversary escalation, recoveries above an expense stop, tenant improvements and leasing commissions, a renewal option at stated terms, downtime and re-letting at market, a forward-NOI exit

The renewal is an election, not a probability. The option is written on the lease it extends and states its own terms:

option renewal on contract cre.lease_unit.tenant_a type CRE.Option.Renewal {
  parties { landlord = party.landlord_co, tenant = party.acme }
  terms {
    renewal_rent_year = inputs.renewal_rent_year
    renewal_term_months = 60
    renewal_ti_lc = 100000
  }
  schedule on 2031-01
  exercise when inputs.market_rent_year > contract.renewal_rent_year
  category investing.capital.leasing
  payoff -contract.renewal_ti_lc
  set entity party.acme.status = "renewed"
}

Both outcomes are leases the model declares: the renewal lease from January 2031, and the market lease from April 2031. The schedule tests the election once, in the month after expiry. The exercise writes the tenant's status, and each lease's term opens from state_enter of the state that outcome writes: the renewal lease on exercise, the market lease on a lapse. Nothing is switched off; the lease whose state is never entered never opens. The exit values the building on the lease left standing, because the forward net operating income is derived from the leases' own streams.

The market rent is an assumption, so the outcome the option does not take is a run scenario rather than a second model. In the base run the market rent is $560k and the tenant renews. In the soft_market scenario the market rent is $480k, the option lapses, and the space is re-let.

The result

Base run: present value 1,362,611.39, net operating income 4,697,224.27, leasing costs 450,000.00 and debt service 4,421,429.94. Soft-market scenario: present value 595,382.95 and total cash 1,495,550.50.

Asserted: seven per-period series across 120 months, the renewal lease's rent, the market lease's rent, effective gross income, net operating income, debt service, the coverage ratio and net cash flow, plus the five lifetime figures and the two scenario figures. Every asserted cell agrees with the reference to the cent.

Against the original case's present value of 1,424,273.80, the renewal outcome is 61,662.41 lower and the re-let outcome 828,890.85 lower. The two figures bound what the original's 70/30 blend stands for.

The delta

None: every period agrees inside a one-cent tolerance across all 120 months, and both scenario figures agree to the cent.

Run configuration

{
  "deterministic": {
    "annual_discount_rate": 0.0725
  },
  "scenarios": {
    "soft_market": {
      "parameters": {
        "inputs.market_rent_year": 480000.0
      }
    }
  }
}

Verified results

Checked period by period: 7 series across 120 periods — 840 values in all, each within the tolerance shown.

  • net_cash_flow — within ±0.01
  • cre.unit.base_rent.tenant_a_renewal — within ±0.01
  • cre.unit.base_rent.tenant_a_market — within ±0.01
  • domain.cre.egi — within ±0.01
  • domain.cre.noi — within ±0.01
  • domain.cre.debt_service — within ±0.01
  • domain.cre.dscr — within ±1.0e-6

Checked per scenario, each a full run under its own parameters:

Scenariomodel.npvmodel.total
soft_market595,382.951,495,550.5

Summary metrics for the base run:

MetricValueTolerance
model.npv1,362,611.39±1
domain.cre.noi4,697,224.27±1
domain.cre.leasing_costs450,000±1
domain.cre.debt_service4,421,429.94±1
domain.cre.dscr1.062377±0.0001