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

Dechow F-Score for Misstatement Risk

Install and import#

bash
npm install fintech-algorithms
ts
import { dechowFScoreForMisstatementRisk } from "fintech-algorithms/fundamental-analysis-and-valuation/quality-and-distress/dechow-f-score-for-misstatement-risk";

Signature#

dechowFScoreForMisstatementRisk(data)

Computes the Dechow et al. 2011 Model 1 misstatement logit from three consecutive accounting periods and divides the fitted probability by the unconditional misstatement rate to give the F-Score.

Parameters#

NameTypeNotes
data{ current: { total_assets: number; cash: number; investments_and_advances: number; investments_at_equity: number; total_liabilities: number; preferred_stock: number; receivables: number; inventory: number; net_ppe: number; sales: number; net_income: number }; prior: { total_assets: number; cash: number; investments_and_advances: number; investments_at_equity: number; total_liabilities: number; preferred_stock: number; receivables: number; inventory: number; net_ppe: number; sales: number; net_income: number }; prior2: { total_assets: number; cash: number; investments_and_advances: number; investments_at_equity: number; total_liabilities: number; preferred_stock: number; receivables: number; inventory: number; net_ppe: number; sales: number; net_income: number }; issued_equity_or_long_term_debt: boolean }Three nested period records plus one flag. current and prior are read for every variable; prior2 supplies the second lag needed for the prior-year cash sales and prior-year average assets. Within each record, net operating assets are built from total_assets, cash, investments_and_advances, investments_at_equity, total_liabilities and preferred_stock, while receivables, inventory, net_ppe, sales and net_income feed the remaining terms. issued_equity_or_long_term_debt must be a boolean and becomes the 0 or 1 issuance indicator.

Returns#

{ state: string; method: string; variables: { rsst_accruals: number; change_receivables: number; change_inventory: number; soft_assets: number; change_cash_sales: number; change_roa: number; actual_issuance: number }; logit: number; misstatement_probability: number; f_score: number; band: string; unconditional_probability: number }

variables holds the seven predictors. logit applies the intercept -7.893 with coefficients 0.790, 2.518, 1.191, 1.979, 0.171, -0.932 and 1.029 in that order. misstatement_probability is the logistic transform of the logit, unconditional_probability is 0.0037 and f_score is the probability divided by it. band is at-or-below-baseline at 1 or below, above-baseline below 1.85, substantial below 2.45 and high-screen at or above 2.45. method is dechow-et-al-2011-model-1 and state is calculated.

Errors#

  • When data is not a plain object, or current, prior or prior2 is missing or not a plain object — throws TypeError
  • When issued_equity_or_long_term_debt is not a boolean — throws TypeError
  • When any numeric field read is missing or not a finite number — throws TypeError
  • When total_assets in any of the three period records is zero or negative — throws RangeError
  • When prior-year cash sales compute to zero — 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
{
  "current": {
    "total_assets": 1000,
    "cash": 100,
    "net_ppe": 400,
    "investments_and_advances": 20,
    "investments_at_equity": 0,
    "total_liabilities": 550,
    "preferred_stock": 0,
    "receivables": 150,
    "inventory": 180,
    "sales": 1200,
    "net_income": 80
  },
  "prior": {
    "total_assets": 900,
    "cash": 90,
    "net_ppe": 380,
    "investments_and_advances": 20,
    "investments_at_equity": 0,
    "total_liabilities": 500,
    "preferred_stock": 0,
    "receivables": 120,
    "inventory": 160,
    "sales": 1050,
    "net_income": 60
  },
  "prior2": {
    "total_assets": 820,
    "cash": 80,
    "net_ppe": 350,
    "investments_and_advances": 18,
    "investments_at_equity": 0,
    "total_liabilities": 450,
    "preferred_stock": 0,
    "receivables": 105,
    "inventory": 145,
    "sales": 950,
    "net_income": 50
  },
  "issued_equity_or_long_term_debt": false
}

Call#

dechowFScoreForMisstatementRisk(data)

Returns#

object with 8 fields: state, method, variables, logit, misstatement_probability, f_score, band, unconditional_probability

{
  "state": "calculated",
  "method": "dechow-et-al-2011-model-1",
  "variables": {
    "rsst_accruals": 0.042105263157894736,
    "change_receivables": 0.031578947368421054,
    "change_inventory": 0.021052631578947368,
    "soft_assets": 0.5,
    "change_cash_sales": 0.13043478260869557,
    "change_roa": 0.014443084455324356,
    "actual_issuance": 0
  },
  "logit": -6.756803975307326,
  "misstatement_probability": 0.001161589167261127,
  "f_score": 0.313943018178683,
  "band": "at-or-below-baseline",
  "unconditional_probability": 0.0037
}

Other exports#

This module also exports calculate, altmanZScore, piotroskiFScore, beneishMScore, sloanAccrualMeasure, ohlsonOScore, zmijewskiXScore, springateSScore, tafflerZScore, fulmerHScore, groverGScore, dechowDichevAccrualQuality, modifiedJonesDiscretionaryAccrualModel. 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#

Dechow F-Score for Misstatement Risk — evidence clock
Dechow F-Score for Misstatement Risk — model anatomy
Dechow F-Score for Misstatement Risk — system map
Dechow F-Score for Misstatement Risk — threshold and interpretation
Dechow F-Score for Misstatement Risk — variant boundaries

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 Quality and Distress family#