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

Utility Fundamental Score

Install and import#

bash
npm install fintech-algorithms
ts
import { 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#

NameTypeNotes
dataRecordValueA 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#

data
{
  "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#

Utility Fundamental Score — article hero
Utility Fundamental Score — component ledger
Utility Fundamental Score — decision boundary
Utility Fundamental Score — evidence clock
Utility Fundamental Score — model anatomy
Utility 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#