Utility Fundamental Score
Install and import#
npm install fintech-algorithmsimport { utilityFundamentalScore } from "fintech-algorithms/fundamental-analysis-and-valuation/sector-specific-equity-scoring/utility-fundamental-score";Signature#
utilityFundamentalScore(data)Scores a rate-regulated electric utility on seven weighted bands, two of which are two-sided: the earned-versus-allowed ROE gap and rate-base growth both score highest near a target and fall away in either direction. Carries no penalty term.
Parameters#
| Name | Type | Notes |
|---|---|---|
data | RecordValue | A plain object. framework must be the string ferc-regulated-electric-teaching-v1. weights must be an object holding exactly earned_return, cash_debt, capital_structure, interest_coverage, capex_funding, regulatory_lag and rate_base_growth. allowed_roe, total_debt, interest_expense and capital_expenditure must be strictly positive; debt_to_capital and regulatory_lag_months must be nonnegative; earned_roe, funds_from_operations, ebit, cash_from_operations and rate_base_growth need only be finite. |
Returns#
{ state: string; method: string; earned_allowed_roe_gap: number; ffo_to_debt: number; interest_coverage: number; capex_funding_ratio: number; component_scores: Record<string, number>; weights: Record<string, number>; fundamental_score: number; coverage_ratio: number; reason: string }
earned_allowed_roe_gap is earned_roe less allowed_roe; ffo_to_debt, interest_coverage and capex_funding_ratio are the other intermediate ratios. component_scores holds the seven band scores on a 0-100 scale and fundamental_score is their weighted sum. state is the band of that score: strong-review-band at 75 or more, mixed-review-band at 50 or more, weak-review-band below that. method is utility-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 ferc-regulated-electric-teaching-v1 — throws RangeError
- When weights does not hold exactly the seven 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": "ferc-regulated-electric-teaching-v1",
"allowed_roe": 0.095,
"earned_roe": 0.091,
"funds_from_operations": 980,
"total_debt": 6200,
"debt_to_capital": 0.54,
"ebit": 1250,
"interest_expense": 360,
"cash_from_operations": 1550,
"capital_expenditure": 2300,
"regulatory_lag_months": 8,
"rate_base_growth": 0.055,
"weights": {
"earned_return": 0.18,
"cash_debt": 0.18,
"capital_structure": 0.14,
"interest_coverage": 0.14,
"capex_funding": 0.12,
"regulatory_lag": 0.12,
"rate_base_growth": 0.12
}
}Call#
utilityFundamentalScore(data)Returns#
object with 11 fields: state, method, earned_allowed_roe_gap, ffo_to_debt, interest_coverage, capex_funding_ratio, component_scores, weights, …
{
"state": "mixed-review-band",
"method": "utility-sector-score-v1",
"earned_allowed_roe_gap": -0.0040000000000000036,
"ffo_to_debt": 0.15806451612903225,
"interest_coverage": 3.4722222222222223,
"capex_funding_ratio": 0.6739130434782609,
"component_scores": {
"earned_return": 100,
"cash_debt": 55.760368663594456,
"capital_structure": 43.99999999999999,
"interest_coverage": 56.34920634920635,
"capex_funding": 45.65217391304348,
"regulatory_lag": 66.66666666666667,
"rate_base_growth": 100
},
"weights": {
"earned_return": 0.18,
"cash_debt": 0.18,
"capital_structure": 0.14,
"interest_coverage": 0.14,
"capex_funding": 0.12,
"regulatory_lag": 0.12,
"rate_base_growth": 0.12
},
"fundamental_score": 67.5640161179011,
"coverage_ratio": 1,
"reason": "ferc-tagged-package-bands"
}Other exports#
This module also exports
calculate, bankFundamentalScore, insuranceFundamentalScore, reitFundamentalScore, 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#
- Accounting Matters — Federal Energy Regulatory Commission
- Electric Industry Forms — Federal Energy Regulatory Commission
- Non-GAAP Financial Measures Compliance and Disclosure Interpretations — U.S. Securities and Exchange Commission
- Evidence boundary