REIT Fundamental Score
Install and import#
npm install fintech-algorithmsimport { 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#
| Name | Type | Notes |
|---|---|---|
data | RecordValue | A 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#
{
"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#
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.
References#
- Nareit Funds From Operations White Paper — 2018 Restatement — Nareit
- Non-GAAP Financial Measures Compliance and Disclosure Interpretations — U.S. Securities and Exchange Commission
- Evidence boundary