fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

REIT Fundamental Score

Install and import#

bash
npm install fintech-algorithms
ts
import { reitFundamentalScore } from "fintech-algorithms/fundamental-analysis-and-valuation/sector-specific-equity-scoring/reit-fundamental-score";

Signature#

reitFundamentalScore(data)

Derives an AFFO proxy from NAREIT FFO by subtracting recurring capex and the straight-line rent adjustment, then scores distribution coverage, leverage, interest coverage, occupancy, same-store NOI growth and liquidity as six weighted bands. Carries no penalty term.

Parameters#

NameTypeNotes
dataRecordValueA plain object. framework must be the string nareit-equity-reit-teaching-v1. weights must be an object holding exactly distribution, leverage, coverage, occupancy, same_store_growth and liquidity. common_dividends, ebitda_re, interest_expense and near_term_debt_maturities must be strictly positive because each is a divisor; recurring_capex, net_debt, available_liquidity and occupancy_ratio must be nonnegative; nareit_ffo, straight_line_rent_adjustment and same_store_noi_growth need only be finite.

Returns#

{ state: string; method: string; nareit_ffo: number; affo_proxy: number; distribution_coverage: number; net_debt_to_ebitda_re: number; interest_coverage: number; liquidity_coverage: number; component_scores: Record<string, number>; weights: Record<string, number>; fundamental_score: number; coverage_ratio: number; reason: string }

affo_proxy is nareit_ffo less recurring_capex less straight_line_rent_adjustment; distribution_coverage divides it by common_dividends. net_debt_to_ebitda_re, interest_coverage and liquidity_coverage are the other intermediate ratios. component_scores holds the six band scores on a 0-100 scale and fundamental_score is their weighted sum. state is affo-proxy-deficit-review when affo_proxy is zero or negative, otherwise the band of the score: strong-review-band at 75 or more, mixed-review-band at 50 or more, weak-review-band below that. method is reit-sector-score-v1 and coverage_ratio is 1.

Errors#

  • When data is not a plain object — throws TypeError
  • When framework is not a nonempty string, or a required input is not a finite number — throws TypeError
  • When framework is not nareit-equity-reit-teaching-v1 — throws RangeError
  • When weights does not hold exactly the six component names, or its values do not sum to 1 within 1e-9 — throws RangeError
  • When an input required to be nonnegative is negative, or a divisor input is zero or negative — throws RangeError

Complexity: time O(1), space O(1).

Worked example#

executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

Input#

data
{
  "framework": "nareit-equity-reit-teaching-v1",
  "nareit_ffo": 420,
  "recurring_capex": 82,
  "straight_line_rent_adjustment": 18,
  "common_dividends": 260,
  "net_debt": 1850,
  "ebitda_re": 475,
  "interest_expense": 105,
  "occupancy_ratio": 0.945,
  "same_store_noi_growth": 0.041,
  "available_liquidity": 780,
  "near_term_debt_maturities": 420,
  "weights": {
    "distribution": 0.22,
    "leverage": 0.2,
    "coverage": 0.16,
    "occupancy": 0.14,
    "same_store_growth": 0.14,
    "liquidity": 0.14
  }
}

Call#

reitFundamentalScore(data)

Returns#

object with 13 fields: state, method, nareit_ffo, affo_proxy, distribution_coverage, net_debt_to_ebitda_re, interest_coverage, liquidity_coverage, …

{
  "state": "strong-review-band",
  "method": "reit-sector-score-v1",
  "nareit_ffo": 420,
  "affo_proxy": 320,
  "distribution_coverage": 1.2307692307692308,
  "net_debt_to_ebitda_re": 3.8947368421052633,
  "interest_coverage": 4.523809523809524,
  "liquidity_coverage": 1.8571428571428572,
  "component_scores": {
    "distribution": 71.79487179487181,
    "leverage": 91.22807017543859,
    "coverage": 86.39455782312925,
    "occupancy": 85.29411764705881,
    "same_store_growth": 70,
    "liquidity": 88.57142857142858
  },
  "weights": {
    "distribution": 0.22,
    "leverage": 0.2,
    "coverage": 0.16,
    "occupancy": 0.14,
    "same_store_growth": 0.14,
    "liquidity": 0.14
  },
  "fundamental_score": 82.00479155224843,
  "coverage_ratio": 1,
  "reason": "nareit-ffo-plus-explicit-package-affo-proxy"
}

Other exports#

This module also exports calculate, bankFundamentalScore, insuranceFundamentalScore, utilityFundamentalScore, earlyStageLiquidityAndRunwayScore, cyclicalAndCommodityCycleNormalization, holdingCompanyLookThroughScore, sectorSpecificWeightCalibration, unsupportedScopeAndCoverageDecision. Every module additionally exports run as an alias of its primary function, and a meta object carrying its catalog id, domain, family, shape and article URL.

Diagrams#

REIT Fundamental Score — article hero
REIT Fundamental Score — component ledger
REIT Fundamental Score — decision boundary
REIT Fundamental Score — evidence clock
REIT Fundamental Score — model anatomy
REIT Fundamental Score — system map

How it works#

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References#

The rest of the Sector-Specific Equity Scoring family#