styles_distressed_exit: Distressed exit summary across CRE investment styles

View source: R/utils.R

styles_distressed_exitR Documentation

Distressed exit summary across CRE investment styles

Description

This helper applies a simple lender-driven distressed-exit rule to a set of preset style scenarios. For each style and covenant regime, it:

  1. Runs the baseline case via run_case().

  2. Identifies the first covenant breach under the bullet-debt scenario (DSCR and forward LTV).

  3. Optionally shifts very early breaches to a minimum refinancing year (refinancing window logic).

  4. Re-runs the case with a shortened horizon and a fire-sale exit-yield penalty, and extracts:

    • distressed equity IRR (possibly NA),

    • distressed equity multiple and loss percentage,

    • distressed sale value.

Usage

styles_distressed_exit(
  styles,
  regimes,
  fire_sale_bps = 100,
  refi_min_year = 3L,
  allow_year1_distress = TRUE,
  underwriting_mode = c("transition", "stabilized"),
  exit_shock_bps = 0,
  growth_shock = 0,
  ext_dir = system.file("extdata", package = "cre.dcf")
)

Arguments

styles

Character vector of style tags, e.g. c("core", "core_plus", "value_added", "opportunistic").

regimes

A data frame or tibble with at least three columns: regime (label), min_dscr (numeric), max_ltv (numeric). Each row defines a covenant regime (strict / baseline / flexible, etc.).

fire_sale_bps

Numeric scalar. Widening (in basis points) applied to the exit-yield spread in the distressed run (e.g. +100 for +100 bps).

refi_min_year

Integer scalar. Minimum year at which a lender-driven distressed exit can occur. If a breach is detected before this year and allow_year1_distress = FALSE, the distressed exit is moved to refi_min_year.

allow_year1_distress

Logical. If TRUE, distress can occur in year 1. If FALSE, breaches in years ⁠< refi_min_year⁠ are shifted to refi_min_year (refinancing window logic).

underwriting_mode

Character scalar. Either "transition" or "stabilized". In "transition" mode (default), covenant testing starts at stabilization_year when the preset defines one, which is useful for lease-up or refurbishment business plans. In "stabilized" mode, covenant testing starts in year 1, which is more conservative and closer to a standard stabilized-income loan reading.

exit_shock_bps

Numeric scalar. Additive shock (in basis points) applied to the preset's exit_yield_spread_bps before running the case and detecting breaches. This simulates a market repricing environment. Default 0 (no shock).

growth_shock

Numeric scalar. Additive shock applied to the preset's index_rate before running the case. This simulates a rental growth slowdown. Default 0 (no shock).

ext_dir

Optional directory where style presets (YAML) are stored. Defaults to the package inst/extdata folder.

Value

A tibble with one row per combination of style and regime, and the columns:

  • style, regime, min_dscr, max_ltv,

  • underwriting_mode, covenant_start_year,

  • breach_year, breach_type,

  • irr_equity_base, irr_equity_distress,

  • distress_undefined (logical),

  • equity_multiple_base, equity_multiple_distress,

  • equity_loss_pct_base, equity_loss_pct_distress,

  • sale_value_distress.


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